diff --git a/.gitignore b/.gitignore
index 58b805fe..0682a384 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,5 @@
.DS_Store
-node_modules/
\ No newline at end of file
+node_modules/
+package-lock.json
+*.tgz
+*.log
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 00000000..07ba3f9c
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,8 @@
+node_modules/
+test_resources/
+tests/
+tmp/
+*.bak
+*.tgz
+*.log
+.*
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 00000000..43c97e71
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1 @@
+package-lock=false
diff --git a/.travis.yml b/.travis.yml
index 6486e92b..b7017f1c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,12 +1,13 @@
sudo: false
language: node_js
node_js:
- - 0.12
- - 4.0
+ - 8
+ - 10
+ - node
script:
- "npm test"
-
+
notifications:
irc: "chat.freenode.net#ua-parser"
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 30bcf3b6..5fbfb416 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -10,9 +10,10 @@ Contributing to the project, especially `regexes.yaml`, is both welcomed and enc
* `tests/test_device.yaml`
* `tests/test_os.yaml`
* `tests/test_ua.yaml`
-5. Push your branch to GitHub and submit a pull request
-6. Monitor the pull request to make sure the Travis build succeeds. If it fails simply make the necessary changes to your branch and push it. Travis will re-test the changes.
+5. Check that your regex is not vulnerable to [ReDoS](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS) using the test in `tests/regexes.js`
+6. Push your branch to GitHub and submit a pull request
+7. Monitor the pull request to make sure the Travis build succeeds. If it fails simply make the necessary changes to your branch and push it. Travis will re-test the changes.
That's it. If you don't feel comfortable forking the project or modifying the YAML you can also [submit an issue](https://github.com/ua-parser/uap-core/issues) that includes the appropriate user agent string and the expected results of parsing.
-Thanks!
\ No newline at end of file
+Thanks!
diff --git a/README.md b/README.md
index ff6e0f14..00cce4cc 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-uap-core [](https://travis-ci.org/ua-parser/uap-core)
+uap-core [](https://travis-ci.org/ua-parser/uap-core) [](#backers) [](#sponsors)
========
This repository contains the core of [BrowserScope][2]'s original [user agent string parser][3]: data collected over the years by [Steve Souders][4] and numerous other contributors, extracted into a separate [YAML file][5] so as to be reusable _as is_ by implementations in any programming language.
@@ -8,6 +8,7 @@ This repo itself does _not_ contain a parser: only the necessary data to build o
Maintainers
-----------
+* [Com Menthol](https://github.com/commenthol)
* [Lindsey Simon](https://github.com/elsigh) ([@elsigh](https://twitter.com/elsigh))
* [Tobie Langel](https://github.com/tobie) ([@tobie](https://twitter.com/tobie))
@@ -22,6 +23,28 @@ Contributing Changes to regexes.yaml
Please read the [contributors' guide](CONTRIBUTING.md)
+## Credits
+### Contributors
+
+This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
+
+
+
+### Backers
+
+Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/ua-parser#backer)]
+
+
+
+
+### Sponsors
+
+Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/ua-parser#sponsor)]
+
+
+
+
+
License
-------
diff --git a/package.json b/package.json
index afc4ccf4..28f706f5 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "uap-core",
"description": "The regex file necessary to build language ports of Browserscope's user agent parser.",
- "version": "0.5.0",
+ "version": "0.6.8",
"maintainers": [
{
"name": "Tobie Langel",
@@ -25,11 +25,12 @@
}
],
"devDependencies": {
- "yamlparser": ">=0.0.2",
"mocha": "*",
- "uap-ref-impl": "*"
+ "safe-regex": "^2.0.1",
+ "uap-ref-impl": "git+https://github.com/ua-parser/uap-ref-impl#master",
+ "yamlparser": ">=0.0.2"
},
"scripts": {
- "test": "mocha -u tdd -R min ./tests/test.js"
+ "test": "mocha --opts ./tests/mocha.opts ./tests"
}
}
diff --git a/regexes.yaml b/regexes.yaml
index ccd01420..6d5b653a 100644
--- a/regexes.yaml
+++ b/regexes.yaml
@@ -1,14 +1,60 @@
user_agent_parsers:
#### SPECIAL CASES TOP ####
+ # CFNetwork Podcast catcher Applications
+ - regex: '(ESPN)[%20| ]+Radio/(\d+)\.(\d+)\.(\d+) CFNetwork'
+ - regex: '(Antenna)/(\d+) CFNetwork'
+ family_replacement: 'AntennaPod'
+ - regex: '(TopPodcasts)Pro/(\d+) CFNetwork'
+ - regex: '(MusicDownloader)Lite/(\d+)\.(\d+)\.(\d+) CFNetwork'
+ - regex: '^(.*)-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
+ - regex: '^(.*)-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
+ - regex: '^(.*)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
+
+ # Podcast catchers
+ - regex: '(espn\.go)'
+ family_replacement: 'ESPN'
+ - regex: '(espnradio\.com)'
+ family_replacement: 'ESPN'
+ - regex: 'ESPN APP$'
+ family_replacement: 'ESPN'
+ - regex: '(audioboom\.com)'
+ family_replacement: 'AudioBoom'
+ - regex: ' (Rivo) RHYTHM'
+
# @note: iOS / OSX Applications
- - regex: '(CFNetwork)(?:/(\d+)\.(\d+)\.?(\d+)?)?'
+ - regex: '(CFNetwork)(?:/(\d+)\.(\d+)(?:\.(\d+)|)|)'
family_replacement: 'CFNetwork'
# Pingdom
- - regex: '(Pingdom.com_bot_version_)(\d+)\.(\d+)'
+ - regex: '(Pingdom\.com_bot_version_)(\d+)\.(\d+)'
+ family_replacement: 'PingdomBot'
+ # 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34'
+ - regex: '(PingdomTMS)/(\d+)\.(\d+)\.(\d+)'
family_replacement: 'PingdomBot'
+ # PTST / WebPageTest.org crawlers
+ - regex: ' (PTST)/(\d+)(?:\.(\d+)|)$'
+ family_replacement: 'WebPageTest.org bot'
+
+ # Datanyze.com spider
+ - regex: 'X11; (Datanyze); Linux'
+
+ # New Relic Pinger
+ - regex: '(NewRelicPinger)/(\d+)\.(\d+)'
+ family_replacement: 'NewRelicPingerBot'
+
+ # Tableau
+ - regex: '(Tableau)/(\d+)\.(\d+)'
+ family_replacement: 'Tableau'
+
+ # Salesforce
+ - regex: '(Salesforce)(?:.)\/(\d+)\.(\d?)'
+
+ #StatusCake
+ - regex: '(\(StatusCake\))'
+ family_replacement: 'StatusCakeBot'
+
# Facebook
- regex: '(facebookexternalhit)/(\d+)\.(\d+)'
family_replacement: 'FacebookBot'
@@ -17,62 +63,124 @@ user_agent_parsers:
- regex: 'Google.*/\+/web/snippet'
family_replacement: 'GooglePlusBot'
+ # Gmail
+ - regex: 'via ggpht\.com GoogleImageProxy'
+ family_replacement: 'GmailImageProxy'
+
+ # Yahoo
+ - regex: 'YahooMailProxy; https://help\.yahoo\.com/kb/yahoo-mail-proxy-SLN28749\.html'
+ family_replacement: 'YahooMailProxy'
+
+ # Twitter
+ - regex: '(Twitterbot)/(\d+)\.(\d+)'
+ family_replacement: 'TwitterBot'
+
# Bots Pattern '/name-0.0'
- - regex: '/((?:Ant-)?Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)(?:\.(\d+))?)?'
+ - regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
# Bots Pattern 'name/0.0'
- - regex: '(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
+ - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
# MSIECrawler
- - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d?)?;.* MSIECrawler'
+ - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
family_replacement: 'MSIECrawler'
+ # DAVdroid
+ - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
+
# Downloader ...
- - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP)(?:[ /](\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
+ - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
+
+ # Pinterestbot
+ - regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
+ family_replacement: 'Pinterestbot'
# Bots
- - regex: '(1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]+-Agent|AdsBot-Google(?:-[a-z]+)?|altavista|AppEngine-Google|archive.*?\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]+)*|bingbot|BingPreview|blitzbot|BlogBridge|BoardReader(?: [A-Za-z]+)*|boitho.com-dc|BotSeer|\b\w*favicon\w*\b|\bYeti(?:-[a-z]+)?|Catchpoint bot|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher)?|Feed Seeker Bot|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]+-)?Googlebot(?:-[a-zA-Z]+)?|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile)?|IconSurf|IlTrovatore(?:-Setaccio)?|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]+Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masidani_bot|Mediapartners-Google|Microsoft .*? Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media *)?|msrbot|netresearch|Netvibes|NewsGator[^/]*|^NING|Nutch[^/]*|Nymesis|ObjectsSearch|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|Simpy|SimplePie|SEOstats|SimpleRSS|Slurp|snappy|Speedy Spider|Squrl Java|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|TwitterBot|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]+|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s)? Link Sleuth|Xerka [A-z]+Bot|yacy(?:bot)?|Yahoo[a-z]*Seeker|Yahoo! Slurp|Yandex\w+|YodaoBot(?:-[A-z]+)?|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
+ - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|TwitterBot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
+
+ # AWS S3 Clients
+ # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
+ - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
+
+ # Facebook
+ # Must come before "Bots General matcher" to catch OrangeBotswana
+ # Facebook Messenger must go before Facebook
+ - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
+ family_replacement: 'Facebook Messenger'
+ # Facebook
+ - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
+ family_replacement: 'Facebook'
+ # Sometimes Facebook does not specify a version (FBAV)
+ - regex: '\[FB.*;'
+ family_replacement: 'Facebook'
# Bots General matcher 'name/0.0'
- - regex: '(?:\/[A-Za-z0-9\.]+)? *([A-Za-z0-9 \-_\!\[\]:]*(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]*))/(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
- # Bots General matcher 'name 0.0'
- - regex: '(?:\/[A-Za-z0-9\.]+)? *([A-Za-z0-9 _\!\[\]:]*(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]*)) (\d+)(?:\.(\d+)(?:\.(\d+))?)?'
- # Bots containing spider|scrape|bot(but not CUBOT)|Crawl
- - regex: '((?:[A-z0-9]+|[A-z\-]+ ?)?(?: the )?(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[A-Za-z0-9-]*(?:[^C][^Uu])[Bb]ot|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]*)(?:(?:[ /]| v)(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
+ - regex: '(?:\/[A-Za-z0-9\.]+|) {0,5}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
+ # Bots containing bot(but not CUBOT)
+ - regex: '((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
+ # Bots containing spider|scrape|Crawl
+ - regex: '((?:[A-z0-9]{1,50}|[A-z\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
# HbbTV standard defines what features the browser should understand.
# but it's like targeting "HTML5 browsers", effective browser support depends on the model
# See os_parsers if you want to target a specific TV
- regex: '(HbbTV)/(\d+)\.(\d+)\.(\d+) \('
- # must go before Firefox to catch Chimera/SeaMonkey/Camino
- - regex: '(Chimera|SeaMonkey|Camino)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)?'
+ # must go before Firefox to catch Chimera/SeaMonkey/Camino/Waterfox
+ - regex: '(Chimera|SeaMonkey|Camino|Waterfox)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*|)'
+
+ # must be before Firefox / Gecko to catch SailfishBrowser properly
+ - regex: '(SailfishBrowser)/(\d+)\.(\d+)(?:\.(\d+)|)'
+ family_replacement: 'Sailfish Browser'
+
+ # Social Networks (non-Facebook)
+ # Pinterest
+ - regex: '\[(Pinterest)/[^\]]+\]'
+ - regex: '(Pinterest)(?: for Android(?: Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
+ # Instagram app
+ - regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)'
+ # Flipboard app
+ - regex: 'Mozilla.*Mobile.*(Flipboard).(\d+)\.(\d+)\.(\d+)'
+ # Flipboard-briefing app
+ - regex: 'Mozilla.*Mobile.*(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
+ # Onefootball app
+ - regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
+ # Snapchat
+ - regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+).(\d+)'
+
+ # Basilisk
+ - regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
+ family_replacement: 'Basilisk'
+
+ # Pale Moon
+ - regex: '(PaleMoon)/(\d+)\.(\d+)(?:\.(\d+)|)'
+ family_replacement: 'Pale Moon'
# Firefox
- - regex: '(Pale[Mm]oon)/(\d+)\.(\d+)\.?(\d+)?'
- family_replacement: 'Pale Moon (Firefox Variant)'
- regex: '(Fennec)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)'
family_replacement: 'Firefox Mobile'
- regex: '(Fennec)/(\d+)\.(\d+)(pre)'
family_replacement: 'Firefox Mobile'
- regex: '(Fennec)/(\d+)\.(\d+)'
family_replacement: 'Firefox Mobile'
- - regex: 'Mobile.*(Firefox)/(\d+)\.(\d+)'
+ - regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
family_replacement: 'Firefox Mobile'
- - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre)?)'
+ - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
family_replacement: 'Firefox ($1)'
- regex: '(Firefox)/(\d+)\.(\d+)(a\d+[a-z]*)'
family_replacement: 'Firefox Alpha'
- regex: '(Firefox)/(\d+)\.(\d+)(b\d+[a-z]*)'
family_replacement: 'Firefox Beta'
- - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(a\d+[a-z]*)'
+ - regex: '(Firefox)-(?:\d+\.\d+|)/(\d+)\.(\d+)(a\d+[a-z]*)'
family_replacement: 'Firefox Alpha'
- - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(b\d+[a-z]*)'
+ - regex: '(Firefox)-(?:\d+\.\d+|)/(\d+)\.(\d+)(b\d+[a-z]*)'
family_replacement: 'Firefox Beta'
- - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
+ - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
family_replacement: 'Firefox ($1)'
- regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
family_replacement: 'MicroB'
- - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
+ - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
+ - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
+ family_replacement: 'Firefox iOS'
# e.g.: Flock/2.0b2
- regex: '(Flock)/(\d+)\.(\d+)(b\d+?)'
@@ -87,15 +195,21 @@ user_agent_parsers:
- regex: '(Navigator)/(\d+)\.(\d+)([ab]\d+)'
family_replacement: 'Netscape'
- - regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d+)?'
+ - regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d+|)'
family_replacement: 'Netscape'
- regex: '(MyIBrow)/(\d+)\.(\d+)'
family_replacement: 'My Internet Browser'
+ # UC Browser
+ # we need check it before opera. In other case case UC Browser detected look like Opera Mini
+ - regex: '(UC? ?Browser|UCWEB|U3)[ /]?(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'UC Browser'
+
# Opera will stop at 9.80 and hide the real version in the Version string.
# see: http://dev.opera.com/articles/view/opera-ua-string-changes/
- - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
+ - regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
- regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
family_replacement: 'Opera Mobile'
- regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
@@ -104,8 +218,7 @@ user_agent_parsers:
family_replacement: 'Opera Mobile'
- regex: 'Opera Mobi'
family_replacement: 'Opera Mobile'
- - regex: '(Opera Mini)(?:/att)?/(\d+)\.(\d+)'
- - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
# Opera 14 for Android uses a WebKit render engine.
- regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
@@ -123,8 +236,12 @@ user_agent_parsers:
- regex: '(OPiOS)/(\d+).(\d+).(\d+)'
family_replacement: 'Opera Mini'
+ # Opera Neon
+ - regex: 'Chrome/.+( MMS)/(\d+).(\d+).(\d+)'
+ family_replacement: 'Opera Neon'
+
# Palm WebOS looks a lot like Safari.
- - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'webOS Browser'
# LuaKit has no version info.
@@ -137,23 +254,23 @@ user_agent_parsers:
# Lightning (for Thunderbird)
# http://www.mozilla.org/projects/calendar/lightning/
- - regex: '(Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))'
+ - regex: 'Gecko/\d+ (Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))'
# Swiftfox
- - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)?) \(Swiftfox\)'
+ - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre|)) \(Swiftfox\)'
family_replacement: 'Swiftfox'
- - regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*)? \(Swiftfox\)'
+ - regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*|) \(Swiftfox\)'
family_replacement: 'Swiftfox'
# Rekonq
- - regex: '(rekonq)/(\d+)\.(\d+)\.?(\d+)? Safari'
+ - regex: '(rekonq)/(\d+)\.(\d+)(?:\.(\d+)|) Safari'
family_replacement: 'Rekonq'
- regex: 'rekonq'
family_replacement: 'Rekonq'
# Conkeror lowercase/uppercase
# http://conkeror.org/
- - regex: '(conkeror|Conkeror)/(\d+)\.(\d+)\.?(\d+)?'
+ - regex: '(conkeror|Conkeror)/(\d+)\.(\d+)(?:\.(\d+)|)'
family_replacement: 'Conkeror'
# catches lower case konqueror
@@ -167,8 +284,6 @@ user_agent_parsers:
- regex: '(Symphony) (\d+).(\d+)'
- - regex: '(Minimo)'
-
- regex: 'PLAYSTATION 3.+WebKit'
family_replacement: 'NetFront NX'
- regex: 'PLAYSTATION 3'
@@ -184,32 +299,76 @@ user_agent_parsers:
family_replacement: 'NetFront NX'
# Amazon Silk, should go before Safari and Chrome Mobile
- - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
+ - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|)'
family_replacement: 'Amazon Silk'
-
# @ref: http://www.puffinbrowser.com
- - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)'
+
+ # Edge Mobile
+ - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
+ family_replacement: 'Edge Mobile'
+
+ # Samsung Internet (based on Chrome, but lacking some features)
+ - regex: '(SamsungBrowser)/(\d+)\.(\d+)'
+ family_replacement: 'Samsung Internet'
+
+ # Seznam.cz browser (based on WebKit)
+ - regex: '(SznProhlizec)/(\d+)\.(\d+)(?:\.(\d+)|)'
+ family_replacement: 'Seznam prohlížeč'
+
+ # Coc Coc browser, based on Chrome (used in Vietnam)
+ - regex: '(coc_coc_browser)/(\d+)\.(\d+)(?:\.(\d+)|)'
+ family_replacement: 'Coc Coc'
+
+ # Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
+ - regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
+ family_replacement: 'Baidu Browser'
+ - regex: '(FlyFlow)/(\d+)\.(\d+)'
+ family_replacement: 'Baidu Explorer'
+
+ # MxBrowser is Maxthon. Must go before Mobile Chrome for Android
+ - regex: '(MxBrowser)/(\d+)\.(\d+)(?:\.(\d+)|)'
+ family_replacement: 'Maxthon'
+
+ # Crosswalk must go before Mobile Chrome for Android
+ - regex: '(Crosswalk)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
+
+ # LINE https://line.me/en/
+ # Must go before Mobile Chrome for Android
+ - regex: '(Line)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'LINE'
+
+ # MiuiBrowser should got before Mobile Chrome for Android
+ - regex: '(MiuiBrowser)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'MiuiBrowser'
+
+ # Mint Browser should got before Mobile Chrome for Android
+ - regex: '(Mint Browser)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'Mint Browser'
+
+ # Google Search App on Android, eg:
+ - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'Google'
# Chrome Mobile
+ - regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'Chrome Mobile WebView'
+ - regex: '; wv\).+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'Chrome Mobile WebView'
- regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Chrome Mobile'
- regex: '(CriOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Chrome Mobile iOS'
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile'
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
+ family_replacement: 'Chrome Mobile'
+ - regex: ' Mobile .*(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Chrome Mobile'
# Chrome Frame must come before MSIE.
- regex: '(chromeframe)/(\d+)\.(\d+)\.(\d+)'
family_replacement: 'Chrome Frame'
- # UC Browser
- - regex: '(UCBrowser)[ /](\d+)\.(\d+)\.(\d+)'
- family_replacement: 'UC Browser'
- - regex: '(UC Browser)[ /](\d+)\.(\d+)\.(\d+)'
- - regex: '(UC Browser|UCBrowser|UCWEB)(\d+)\.(\d+)\.(\d+)'
- family_replacement: 'UC Browser'
-
# Tizen Browser (second case included in browser/major.minor regex)
- regex: '(SLP Browser)/(\d+)\.(\d+)'
family_replacement: 'Tizen Browser'
@@ -218,18 +377,12 @@ user_agent_parsers:
- regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)'
family_replacement: 'Sogou Explorer'
- # Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
- - regex: '(baidubrowser)[/\s](\d+)'
- family_replacement: 'Baidu Browser'
- - regex: '(FlyFlow)/(\d+)\.(\d+)'
- family_replacement: 'Baidu Explorer'
-
# QQ Browsers
- - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
+ - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
family_replacement: 'QQ Browser Mini'
- - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
+ - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
family_replacement: 'QQ Browser Mobile'
- - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+))?)?)?'
+ - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
family_replacement: 'QQ Browser'
# Rackspace Monitoring
@@ -250,20 +403,48 @@ user_agent_parsers:
# AOL Browser (IE-based)
- regex: '(AOL) (\d+)\.(\d+); AOLBuild (\d+)'
+ # Podcast catcher Applications using iTunes
+ - regex: '(PodCruncher|Downcast)[ /]?(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
+
+ # Box Notes https://www.box.com/resources/downloads
+ # Must be before Electron
+ - regex: ' (BoxNotes)/(\d+)\.(\d+)\.(\d+)'
+
+ # Whale
+ - regex: '(Whale)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
+ family_replacement: 'Whale'
+
+ - regex: '(Whale)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'Whale'
+
+ # Ghost
+ # @ref: http://www.ghost.org
+ - regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
+
#### END SPECIAL CASES TOP ####
#### MAIN CASES - this catches > 50% of all browsers ####
+
+ # Slack desktop client (needs to be before Apple Mail, Electron, and Chrome as it gets wrongly detected on Mac OS otherwise)
+ - regex: '(Slack_SSB)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'Slack Desktop Client'
+
+ # HipChat provides a version on Mac, but not on Windows.
+ # Needs to be before Chrome on Windows, and AppleMail on Mac.
+ - regex: '(HipChat)/?(\d+|)'
+ family_replacement: 'HipChat Desktop Client'
+
# Browser/major_version.minor_version.beta_version
- - regex: '(AdobeAIR|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave)/(\d+)\.(\d+)\.(\d+)'
+ - regex: '\b(MobileIron|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Spotify|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave|MacOutlook|Electron|OktaMobile)/(\d+)\.(\d+)\.(\d+)'
# Outlook 2007
- - regex: 'MSOffice 12'
+ - regex: 'Microsoft Office Outlook 12\.\d+\.\d+|MSOffice 12'
family_replacement: 'Outlook'
v1_replacement: '2007'
# Outlook 2010
- - regex: 'MSOffice 14'
+ - regex: 'Microsoft Outlook 14\.\d+\.\d+|MSOffice 14'
family_replacement: 'Outlook'
v1_replacement: '2010'
@@ -272,31 +453,72 @@ user_agent_parsers:
family_replacement: 'Outlook'
v1_replacement: '2013'
+ # Outlook 2016
+ - regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+'
+ family_replacement: 'Outlook'
+ v1_replacement: '2016'
+
+ # Word 2014
+ - regex: 'Microsoft Office (Word) 2014'
+
+ # Windows Live Mail
+ - regex: 'Outlook-Express\/7\.0.*'
+ family_replacement: 'Windows Live Mail'
+
# Apple Air Mail
- - regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+)|)'
# Thunderbird
- - regex: '(Thunderbird)/(\d+)\.(\d+)\.(\d+(?:pre)?)'
+ - regex: '(Thunderbird)/(\d+)\.(\d+)(?:\.(\d+(?:pre|))|)'
family_replacement: 'Thunderbird'
+ # Postbox
+ - regex: '(Postbox)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'Postbox'
+
+ # Barca
+ - regex: '(Barca(?:Pro)?)/(\d+)\.(\d+)(?:\.(\d+)|)'
+ family_replacement: 'Barca'
+
+ # Lotus Notes
+ - regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+)|)'
+ family_replacement: 'Lotus Notes'
+
# Vivaldi uses "Vivaldi"
- regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)'
# Edge/major_version.minor_version
- - regex: '(Edge)/(\d+)\.(\d+)'
+ # Edge with chromium Edg/major_version.minor_version.patch.minor_patch
+ - regex: '(Edge?)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|)'
+ family_replacement: 'Edge'
+
+ # Brave Browser https://brave.com/
+ - regex: '(brave)/(\d+)\.(\d+)\.(\d+) Chrome'
+ family_replacement: 'Brave'
- # Chrome/Chromium/major_version.minor_version.beta_version
- - regex: '(Chromium|Chrome)/(\d+)\.(\d+)\.(\d+)'
+ # Iron Browser ~since version 50
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]* Iron[^/]'
+ family_replacement: 'Iron'
# Dolphin Browser
# @ref: http://www.dolphin.com
- - regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)\.?(\d+)?'
+ - regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)(?:\.(\d+)|)'
+
+ # Headless Chrome
+ # https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md
+ - regex: '(HeadlessChrome)(?:/(\d+)\.(\d+)\.(\d+)|)'
+
+ # Evolution Mail CardDav/CalDav integration
+ - regex: '(Evolution)/(\d+)\.(\d+)\.(\d+\.\d+)'
+
+ # Roundcube Mail CardDav plugin
+ - regex: '(RCM CardDAV plugin)/(\d+)\.(\d+)\.(\d+(?:-dev|))'
# Browser/major_version.minor_version
- - regex: '(bingbot|Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin)/(\d+)\.(\d+)\.?(\d+)?'
+ - regex: '(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\d+)\.(\d+)(?:\.(\d+)|)'
# Chrome/Chromium/major_version.minor_version
- - regex: '(Chromium|Chrome)/(\d+)\.(\d+)'
+ - regex: '(Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
##########
# IE Mobile needs to happen before Android to catch cases such as:
@@ -310,10 +532,61 @@ user_agent_parsers:
- regex: '(IEMobile)[ /](\d+)\.(\d+)'
family_replacement: 'IE Mobile'
+ # Baca Berita App News Reader
+ - regex: '(BacaBerita App)\/(\d+)\.(\d+)\.(\d+)'
+
+ # Podcast catchers
+ - regex: '^(bPod|Pocket Casts|Player FM)$'
+ - regex: '^(AlexaMediaPlayer|VLC)/(\d+)\.(\d+)\.([^.\s]+)'
+ - regex: '^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
+ - regex: '^(Peapod|Liferea)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
+ - regex: '^(bPod|Player FM) BMID/(\S+)'
+ - regex: '^(Podcast ?Addict)/v(\d+) '
+ - regex: '^(Podcast ?Addict) '
+ family_replacement: 'PodcastAddict'
+ - regex: '(Replay) AV'
+ - regex: '(VOX) Music Player'
+ - regex: '(CITA) RSS Aggregator/(\d+)\.(\d+)'
+ - regex: '(Pocket Casts)$'
+ - regex: '(Player FM)$'
+ - regex: '(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine) (\d+)\.(\d+)\.?([^.\s]+|)\.?([^.\s]+|)'
+ - regex: '(philpodder)/(\d+)\.(\d+)\.?([^.\s]+|)\.?([^.\s]+|)'
+ - regex: '(Player FM|Pocket Casts|DoggCatcher|Spotify|MediaMonkey|MediaGo|BashPodder)'
+ - regex: '(QuickTime)\.(\d+)\.(\d+)\.(\d+)'
+ - regex: '(Kinoma)(\d+)'
+ - regex: '(Fancy) Cloud Music (\d+)\.(\d+)'
+ family_replacement: 'FancyMusic'
+ - regex: 'EspnDownloadManager'
+ family_replacement: 'ESPN'
+ - regex: '(ESPN) Radio (\d+)\.(\d+)(?:\.(\d+)|) ?(?:rv:(\d+)|) '
+ - regex: '(podracer|jPodder) v ?(\d+)\.(\d+)(?:\.(\d+)|)'
+ - regex: '(ZDM)/(\d+)\.(\d+)[; ]?'
+ - regex: '(Zune|BeyondPod) (\d+)(?:\.(\d+)|)[\);]'
+ - regex: '(WMPlayer)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
+ - regex: '^(Lavf)'
+ family_replacement: 'WMPlayer'
+ - regex: '^(RSSRadio)[ /]?(\d+|)'
+ - regex: '(RSS_Radio) (\d+)\.(\d+)'
+ family_replacement: 'RSSRadio'
+ - regex: '(Podkicker) \S+/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'Podkicker'
+ - regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)'
+ - regex: '^(Stitcher)/iOS'
+ - regex: '^(Stitcher)/Android'
+ - regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)'
+ - regex: ' (VLC) for'
+ - regex: '(vlc)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'VLC'
+ - regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
+ - regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
+ - regex: '(amarok)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
+ family_replacement: 'Amarok'
+ - regex: '(Custom)-Feed Reader'
+
# Browser major_version.minor_version.beta_version (space instead of slash)
- regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
# Browser major_version.minor_version (space instead of slash)
- - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris) (\d+)\.(\d+)\.?(\d+)?'
+ - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)\.(\d+)(?:\.(\d+)|)'
# Kindle WebKit
- regex: '(Kindle)/(\d+)\.(\d+)'
@@ -343,12 +616,26 @@ user_agent_parsers:
- regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
family_replacement: 'IE Large Screen'
+ # Nextcloud desktop sync client
+ - regex: '(Nextcloud)'
+
+ # Generic mirall client
+ - regex: '(mirall)/(\d+)\.(\d+)\.(\d+)'
+
+ # Nextcloud/Owncloud android client
+ - regex: '(ownCloud-android)/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'Owncloud'
+
+ # Skype for Business
+ - regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)'
+ family_replacement: 'Skype'
+
#### END MAIN CASES ####
#### SPECIAL CASES ####
- regex: '(Obigo)InternetBrowser'
- regex: '(Obigo)\-Browser'
- - regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+))?'
+ - regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+)|)'
family_replacement: 'Obigo'
- regex: '(MAXTHON|Maxthon) (\d+)\.(\d+)'
@@ -367,26 +654,33 @@ user_agent_parsers:
- regex: '(Embider)/(\d+)\.(\d+)'
family_replacement: 'Polaris'
- - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+)?'
+ - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+|)'
family_replacement: 'Bon Echo'
# @note: iOS / OSX Applications
- - regex: '(iPod).+Version/(\d+)\.(\d+)\.(\d+)'
- family_replacement: 'Mobile Safari'
- - regex: '(iPod).*Version/(\d+)\.(\d+)'
- family_replacement: 'Mobile Safari'
- - regex: '(iPhone).*Version/(\d+)\.(\d+)\.(\d+)'
- family_replacement: 'Mobile Safari'
- - regex: '(iPhone).*Version/(\d+)\.(\d+)'
+ - regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+) Mobile'
+ family_replacement: 'Google'
+ - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari'
family_replacement: 'Mobile Safari'
- - regex: '(iPad).*Version/(\d+)\.(\d+)\.(\d+)'
+ - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).* AppleNews\/\d+\.\d+\.\d+?'
+ family_replacement: 'Mobile Safari UI/WKWebView'
+ - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)'
+ family_replacement: 'Mobile Safari UI/WKWebView'
+ - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile.*[ +]Safari'
family_replacement: 'Mobile Safari'
- - regex: '(iPad).*Version/(\d+)\.(\d+)'
- family_replacement: 'Mobile Safari'
- - regex: '(iPod|iPhone|iPad);.*CPU.*OS (\d+)_(\d+)(?:_(\d+))?.*Mobile'
+ - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile'
+ family_replacement: 'Mobile Safari UI/WKWebView'
+ - regex: '(iPod|iPhone|iPad).* Safari'
family_replacement: 'Mobile Safari'
- regex: '(iPod|iPhone|iPad)'
- family_replacement: 'Mobile Safari'
+ family_replacement: 'Mobile Safari UI/WKWebView'
+ - regex: '(Watch)(\d+),(\d+)'
+ family_replacement: 'Apple $1 App'
+
+ ##########################
+ # Outlook on iOS >= 2.62.0
+ ##########################
+ - regex: '(Outlook-iOS)/\d+\.\d+\.prod\.iphone \((\d+)\.(\d+)\.(\d+)\)'
- regex: '(AvantGo) (\d+).(\d+)'
@@ -427,11 +721,9 @@ user_agent_parsers:
- regex: '(Nokia)[EN]?(\d+)'
# BlackBerry devices
- - regex: '(BB10);'
- family_replacement: 'BlackBerry WebKit'
- regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
family_replacement: 'BlackBerry WebKit'
- - regex: '(Black[bB]erry).+Version/(\d+)\.(\d+)\.(\d+)'
+ - regex: '(Black[bB]erry|BB10).+Version/(\d+)\.(\d+)\.(\d+)'
family_replacement: 'BlackBerry WebKit'
- regex: '(Black[bB]erry)\s?(\d+)'
family_replacement: 'BlackBerry'
@@ -451,18 +743,18 @@ user_agent_parsers:
- regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
- #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
+ #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
# family_replacement: 'iPad'
# Phantomjs, should go before Safari
- regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
# WebKit Nightly
- - regex: '(AppleWebKit)/(\d+)\.?(\d+)?\+ .* Safari'
+ - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari'
family_replacement: 'WebKit Nightly'
# Safari
- - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
+ - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
family_replacement: 'Safari'
# Safari didn't provide "Version/d.d.d" prior to 3.0
- regex: '(Safari)/\d+'
@@ -480,23 +772,36 @@ user_agent_parsers:
- regex: '(Phantom)/V(\d+)\.(\d+)'
family_replacement: 'Phantom Browser'
- - regex: 'Trident(.*)rv.(\d+)\.(\d+)'
+ - regex: '(Trident)/(7|8)\.(0)'
family_replacement: 'IE'
+ v1_replacement: '11'
+
+ - regex: '(Trident)/(6)\.(0)'
+ family_replacement: 'IE'
+ v1_replacement: '10'
+
+ - regex: '(Trident)/(5)\.(0)'
+ family_replacement: 'IE'
+ v1_replacement: '9'
+
+ - regex: '(Trident)/(4)\.(0)'
+ family_replacement: 'IE'
+ v1_replacement: '8'
# Espial
- - regex: '(Espial)/(\d+)(?:\.(\d+))?(?:\.(\d+))?'
+ - regex: '(Espial)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
# Apple Mail
# apple mail - not directly detectable, have it after Safari stuff
- regex: '(AppleWebKit)/(\d+)\.(\d+)\.(\d+)'
- family_replacement: 'AppleMail'
+ family_replacement: 'Apple Mail'
# AFTER THE EDGE CASES ABOVE!
# AFTER IE11
# BEFORE all other IE
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
- - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?'
+ - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
- regex: '([MS]?IE) (\d+)\.(\d+)'
family_replacement: 'IE'
@@ -504,7 +809,30 @@ user_agent_parsers:
- regex: '(python-requests)/(\d+)\.(\d+)'
family_replacement: 'Python Requests'
- - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+)*'
+ # headless user-agents
+ - regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
+
+ - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
+
+ # Cloud Storage Clients
+ - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
+ - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
+ # rclone - rsync for cloud storage - https://rclone.org/
+ - regex: '^(rclone)/v(\d+)\.(\d+)'
+
+ # Roku Digital-Video-Players https://www.roku.com/
+ - regex: '^(Roku)/DVP-(\d+)\.(\d+)'
+
+ # Kurio App News Reader https://kurio.co.id/
+ - regex: '(Kurio)\/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'Kurio App'
+
+ # Box Drive and Box Sync https://www.box.com/resources/downloads
+ - regex: '^(Box(?: Sync)?)/(\d+)\.(\d+)\.(\d+)'
+
+ # ViaFree streaming app https://www.viafree.{dk|se|no}
+ - regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)'
+ family_replacement: 'ViaFree'
os_parsers:
##########
@@ -551,11 +879,11 @@ os_parsers:
# Philips : not found any other way than a manual mapping
# Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/4.1.3 PHILIPSTV/1.1.1; en) Presto/2.10.250 Version/11.60
# Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70
- - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/4'
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4'
os_v1_replacement: '2013'
- - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/3'
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
os_v1_replacement: '2012'
- - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/2'
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2'
os_v1_replacement: '2011'
# the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
@@ -575,11 +903,15 @@ os_parsers:
- regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
+ # Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).*Outlook-iOS-Android'
+ os_replacement: 'iOS'
+
##########
# Android
# can actually detect rooted android os. do we care?
##########
- - regex: '(Android)[ \-/](\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?'
+ - regex: '(Android)[ \-/](\d+)(?:\.(\d+)|)(?:[.\-]([a-z0-9]+)|)'
- regex: '(Android) Donut'
os_v1_replacement: '1'
@@ -601,14 +933,18 @@ os_parsers:
os_v1_replacement: '3'
# UCWEB
- - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?;'
+ - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
os_replacement: 'Android'
- - regex: '^UCWEB.*; (iPad OS|iPh OS) (\d+)_(\d+)(?:_(\d+))?;'
+ - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
os_replacement: 'iOS'
- - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+))?;'
+ - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
os_replacement: 'Windows Phone'
# JUC
- - regex: '^(JUC).*; ?U; ?(?:Android)?(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+))?'
+ - regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
+ os_replacement: 'Android'
+
+ # Salesforce
+ - regex: '(android)\s(?:mobile\/)(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
os_replacement: 'Android'
##########
@@ -617,6 +953,14 @@ os_parsers:
- regex: '(Silk-Accelerated=[a-z]{4,5})'
os_replacement: 'Android'
+ # Citrix Chrome App on Chrome OS
+ # Note, this needs to come before the windows parsers as the app doesn't
+ # properly identify as Chrome OS
+ #
+ # ex: Mozilla/5.0 (X11; Windows aarch64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp
+ - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).*Chrome.*(?:CitrixChromeApp)$'
+ os_replacement: 'Chrome OS'
+
##########
# Windows
# http://en.wikipedia.org/wiki/Windows_NT#Releases
@@ -635,66 +979,99 @@ os_parsers:
- regex: '(Windows ?Mobile)'
os_replacement: 'Windows Mobile'
+ - regex: '(Windows 10)'
+ os_replacement: 'Windows'
+ os_v1_replacement: '10'
+
- regex: '(Windows (?:NT 5\.2|NT 5\.1))'
- os_replacement: 'Windows XP'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'XP'
- regex: '(Windows NT 6\.1)'
- os_replacement: 'Windows 7'
+ os_replacement: 'Windows'
+ os_v1_replacement: '7'
- regex: '(Windows NT 6\.0)'
- os_replacement: 'Windows Vista'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'Vista'
- regex: '(Win 9x 4\.90)'
- os_replacement: 'Windows ME'
-
- - regex: '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\.0|Windows Vista|Windows 2000|Windows 3.1)'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'ME'
- regex: '(Windows NT 6\.2; ARM;)'
- os_replacement: 'Windows RT'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'RT'
+
- regex: '(Windows NT 6\.2)'
- os_replacement: 'Windows 8'
+ os_replacement: 'Windows'
+ os_v1_replacement: '8'
- regex: '(Windows NT 6\.3; ARM;)'
- os_replacement: 'Windows RT 8.1'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'RT 8'
+ os_v2_replacement: '1'
+
- regex: '(Windows NT 6\.3)'
- os_replacement: 'Windows 8.1'
+ os_replacement: 'Windows'
+ os_v1_replacement: '8'
+ os_v2_replacement: '1'
- regex: '(Windows NT 6\.4)'
- os_replacement: 'Windows 10'
+ os_replacement: 'Windows'
+ os_v1_replacement: '10'
+
- regex: '(Windows NT 10\.0)'
- os_replacement: 'Windows 10'
+ os_replacement: 'Windows'
+ os_v1_replacement: '10'
- regex: '(Windows NT 5\.0)'
- os_replacement: 'Windows 2000'
+ os_replacement: 'Windows'
+ os_v1_replacement: '2000'
- regex: '(WinNT4.0)'
- os_replacement: 'Windows NT 4.0'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'NT 4.0'
- regex: '(Windows ?CE)'
- os_replacement: 'Windows CE'
+ os_replacement: 'Windows'
+ os_v1_replacement: 'CE'
- - regex: 'Win ?(95|98|3.1|NT|ME|2000)'
- os_replacement: 'Windows $1'
+ - regex: 'Win(?:dows)? ?(95|98|3.1|NT|ME|2000|XP|Vista|7|CE)'
+ os_replacement: 'Windows'
+ os_v1_replacement: '$1'
- regex: 'Win16'
- os_replacement: 'Windows 3.1'
+ os_replacement: 'Windows'
+ os_v1_replacement: '3.1'
- regex: 'Win32'
- os_replacement: 'Windows 95'
+ os_replacement: 'Windows'
+ os_v1_replacement: '95'
+
+ # Box apps (Drive, Sync, Notes) on Windows https://www.box.com/resources/downloads
+ - regex: '^Box.*Windows/([\d.]+);'
+ os_replacement: 'Windows'
+ os_v1_replacement: '$1'
##########
# Tizen OS from Samsung
# spoofs Android so pushing it above
##########
- - regex: '(Tizen)/(\d+)\.(\d+)'
+ - regex: '(Tizen)[/ ](\d+)\.(\d+)'
##########
# Mac OS
# @ref: http://en.wikipedia.org/wiki/Mac_OS_X#Versions
# @ref: http://www.puredarwin.org/curious/versions
##########
- - regex: '((?:Mac ?|; )OS X)[\s/](?:(\d+)[_.](\d+)(?:[_.](\d+))?|Mach-O)'
+ - regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
+ os_replacement: 'Mac OS X'
+ - regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
os_replacement: 'Mac OS X'
+ os_v1_replacement: '$1'
+ os_v2_replacement: '$2'
+ os_v3_replacement: '$3'
# Leopard
- regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
os_replacement: 'Mac OS X'
@@ -732,15 +1109,19 @@ os_parsers:
# ios devices spoof (mac os x), so including intel/ppc prefixes
- regex: '(?:PPC|Intel) (Mac OS X)'
+ # Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
+ - regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
+ os_replacement: 'Mac OS X'
+
##########
# iOS
# http://en.wikipedia.org/wiki/IOS_version_history
##########
# keep this above generic iOS, since AppleTV UAs contain 'CPU OS'
- - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+))?'
+ - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
os_replacement: 'ATV OS X'
- - regex: '(CPU OS|iPhone OS|CPU iPhone) +(\d+)[_\.](\d+)(?:[_\.](\d+))?'
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
os_replacement: 'iOS'
# remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
@@ -787,8 +1168,54 @@ os_parsers:
os_replacement: 'Mac OS X'
os_v1_replacement: '10'
os_v2_replacement: '10'
+ - regex: '(CF)(Network)/(760)\.(\d)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '11'
+ - regex: 'CFNetwork/7.* Darwin/15\.4\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '9'
+ os_v2_replacement: '3'
+ os_v3_replacement: '1'
+ - regex: 'CFNetwork/7.* Darwin/15\.5\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '9'
+ os_v2_replacement: '3'
+ os_v3_replacement: '2'
+ - regex: 'CFNetwork/7.* Darwin/15\.6\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '9'
+ os_v2_replacement: '3'
+ os_v3_replacement: '5'
+ - regex: '(CF)(Network)/758\.(\d)'
+ os_replacement: 'iOS'
+ os_v1_replacement: '9'
+ - regex: 'CFNetwork/808\.3 Darwin/16\.3\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '10'
+ os_v2_replacement: '2'
+ os_v3_replacement: '1'
+ - regex: '(CF)(Network)/808\.(\d)'
+ os_replacement: 'iOS'
+ os_v1_replacement: '10'
##########
+ # CFNetwork macOS Apps (must be before CFNetwork iOS Apps
+ # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
+ ##########
+ - regex: 'CFNetwork/.* Darwin/17\.\d+.*\(x86_64\)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '13'
+ - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '12'
+ - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)'
+ os_replacement: 'Mac OS X'
+ os_v1_replacement: '10'
+ os_v2_replacement: '11'
+ ##########
# CFNetwork iOS Apps
# @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
##########
@@ -811,9 +1238,97 @@ os_parsers:
os_replacement: 'iOS'
os_v1_replacement: '8'
os_v2_replacement: '0'
+ - regex: 'CFNetwork/7.* Darwin/(15)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '9'
+ os_v2_replacement: '0'
+ - regex: 'CFNetwork/8.* Darwin/16\.5\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '10'
+ os_v2_replacement: '3'
+ - regex: 'CFNetwork/8.* Darwin/16\.6\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '10'
+ os_v2_replacement: '3'
+ os_v3_replacement: '2'
+ - regex: 'CFNetwork/8.* Darwin/16\.7\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '10'
+ os_v2_replacement: '3'
+ os_v3_replacement: '3'
+ - regex: 'CFNetwork/8.* Darwin/(16)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '10'
+ - regex: 'CFNetwork/8.* Darwin/17\.0\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '0'
+ - regex: 'CFNetwork/8.* Darwin/17\.2\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '1'
+ - regex: 'CFNetwork/8.* Darwin/17\.3\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '2'
+ - regex: 'CFNetwork/8.* Darwin/17\.4\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '2'
+ os_v3_replacement: '6'
+ - regex: 'CFNetwork/8.* Darwin/17\.5\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '3'
+ - regex: 'CFNetwork/9.* Darwin/17\.6\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '4'
+ - regex: 'CFNetwork/9.* Darwin/17\.7\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ os_v2_replacement: '4'
+ os_v3_replacement: '1'
+ - regex: 'CFNetwork/8.* Darwin/(17)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '11'
+ - regex: 'CFNetwork/9.* Darwin/18\.0\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '12'
+ os_v2_replacement: '0'
+ - regex: 'CFNetwork/9.* Darwin/(18)\.\d+'
+ os_replacement: 'iOS'
+ os_v1_replacement: '12'
+ - regex: 'CFNetwork/.* Darwin/'
+ os_replacement: 'iOS'
+
# iOS Apps
- - regex: '\b(iOS[ /]|iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+))?'
+ - regex: '\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+)|)'
os_replacement: 'iOS'
+ - regex: '\((iOS);'
+
+ ##########
+ # Apple Watch
+ ##########
+ - regex: '(watchOS)/(\d+)\.(\d+)(?:\.(\d+)|)'
+ os_replacement: 'WatchOS'
+
+ ##########################
+ # Outlook on iOS >= 2.62.0
+ ##########################
+ - regex: 'Outlook-(iOS)/\d+\.\d+\.prod\.iphone'
+
+ ##########################
+ # iOS devices, the same regex matches mobile safari webviews
+ ##########################
+ - regex: '(iPod|iPhone|iPad)'
+ os_replacement: 'iOS'
+
+ ##########
+ # Apple TV
+ ##########
+ - regex: '(tvOS)[/ ](\d+)\.(\d+)(?:\.(\d+)|)'
+ os_replacement: 'tvOS'
##########
# Chrome OS
@@ -821,7 +1336,7 @@ os_parsers:
# http://code.google.com/p/chromium-os/issues/detail?id=11573
# http://code.google.com/p/chromium-os/issues/detail?id=13790
##########
- - regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'Chrome OS'
##########
@@ -829,8 +1344,8 @@ os_parsers:
##########
- regex: '([Dd]ebian)'
os_replacement: 'Debian'
- - regex: '(Linux Mint)(?:/(\d+))?'
- - regex: '(Mandriva)(?: Linux)?/(?:[\d.-]+m[a-z]{2}(\d+).(\d))?'
+ - regex: '(Linux Mint)(?:/(\d+)|)'
+ - regex: '(Mandriva)(?: Linux|)/(?:[\d.-]+m[a-z]{2}(\d+).(\d)|)'
##########
# Symbian + Symbian OS
@@ -859,9 +1374,9 @@ os_parsers:
##########
- regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
os_replacement: 'BlackBerry OS'
- - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'BlackBerry OS'
- - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'BlackBerry OS'
- regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
os_replacement: 'BlackBerry Tablet OS'
@@ -873,9 +1388,47 @@ os_parsers:
##########
# Firefox OS
##########
+ - regex: '\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '1'
+ os_v2_replacement: '0'
+ os_v3_replacement: '1'
+
+ - regex: '\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '1'
+ os_v2_replacement: '1'
+
+ - regex: '\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '1'
+ os_v2_replacement: '2'
+
+ - regex: '\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '1'
+ os_v2_replacement: '3'
+
+ - regex: '\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '1'
+ os_v2_replacement: '4'
+
+ - regex: '\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '2'
+ os_v2_replacement: '0'
+
+ - regex: '\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\d+\.\d+'
+ os_replacement: 'Firefox OS'
+ os_v1_replacement: '2'
+ os_v2_replacement: '1'
+
+ # Firefox OS Generic
- regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
os_replacement: 'Firefox OS'
+
##########
# BREW
# yes, Brew is lower-cased for Brew MP
@@ -890,14 +1443,20 @@ os_parsers:
##########
# Google TV
##########
- - regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+))?|/[\da-z]+)'
+ - regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+)|)|/[\da-z]+)'
- regex: '(WebTV)/(\d+).(\d+)'
+ ##########
+ # Chromecast
+ ##########
+ - regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+)|)|)'
+ os_replacement: 'Chromecast'
+
##########
# Misc mobile
##########
- - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
+ - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+)|)'
os_replacement: 'webOS'
- regex: '(VRE);'
@@ -905,22 +1464,32 @@ os_parsers:
# Generic patterns
# since the majority of os cases are very specific, these go last
##########
- - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
+ - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
# Gentoo Linux + Kernel Version
- - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+))?.*gentoo'
+ - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
os_replacement: 'Gentoo'
# Opera Mini Bada
- regex: '\((Bada);'
# just os
- - regex: '(Windows|Android|WeTab|Maemo)'
- - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Gentoo|Mageia|(?:Free|Open|Net|\b)BSD)'
+ - regex: '(Windows|Android|WeTab|Maemo|Web0S)'
+ - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\b)BSD)'
# Linux + Kernel Version
- - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+))?)?'
+ - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+)|)|)'
- regex: 'SunOS'
os_replacement: 'Solaris'
+ # Wget/x.x.x (linux-gnu)
+ - regex: '\(linux-gnu\)'
+ os_replacement: 'Linux'
+ - regex: '\(x86_64-redhat-linux-gnu\)'
+ os_replacement: 'Red Hat'
+ - regex: '\((freebsd)(\d+)\.(\d+)\)'
+ os_replacement: 'FreeBSD'
+
+ # Roku Digital-Video-Players https://www.roku.com/
+ - regex: '^(Roku)/DVP-(\d+)\.(\d+)'
device_parsers:
@@ -928,7 +1497,7 @@ device_parsers:
# Mobile Spiders
# Catch the mobile crawler before checking for iPhones / Androids.
#########
- - regex: '(?:(?:iPhone|Windows CE|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)'
+ - regex: '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)'
regex_flag: 'i'
device_replacement: 'Spider'
brand_replacement: 'Spider'
@@ -939,6 +1508,16 @@ device_parsers:
brand_replacement: 'Spider'
model_replacement: 'Feature Phone'
+ # PTST / WebPageTest.org crawlers
+ - regex: ' PTST/\d+(?:\.)?\d+$'
+ device_replacement: 'Spider'
+ brand_replacement: 'Spider'
+
+ # Datanyze.com spider
+ - regex: 'X11; Datanyze; Linux'
+ device_replacement: 'Spider'
+ brand_replacement: 'Spider'
+
#########
# WebBrowser for SmartWatch
# @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
@@ -955,7 +1534,7 @@ device_parsers:
######################################################################
# Android Application
- - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson)? (.+) \w+ - '
+ - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - '
device_replacement: '$1 $2'
brand_replacement: '$1$2'
model_replacement: '$3'
@@ -986,7 +1565,7 @@ device_parsers:
# Acer
# @ref: http://us.acer.com/ac/en/US/content/group/tablets
#########
- - regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G)?|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+) Build'
+ - regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+) Build'
device_replacement: '$1'
brand_replacement: 'Acer'
model_replacement: '$1'
@@ -1009,7 +1588,7 @@ device_parsers:
# @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
# custom ROM builds for Vega
#########
- - regex: '; *(Advent )?(Vega(?:Bean|Comb)?).* Build'
+ - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).* Build'
device_replacement: '$1$2'
brand_replacement: 'Advent'
model_replacement: '$2'
@@ -1018,7 +1597,7 @@ device_parsers:
# Ainol
# @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
#########
- - regex: '; *(Ainol )?((?:NOVO|[Nn]ovo)[^;/]+) Build'
+ - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+) Build'
device_replacement: '$1$2'
brand_replacement: 'Ainol'
model_replacement: '$2'
@@ -1055,7 +1634,7 @@ device_parsers:
device_replacement: 'Alcatel One Touch $2'
brand_replacement: 'Alcatel'
model_replacement: 'One Touch $2'
- - regex: '; *(?:alcatel[ _])?(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+);? Build'
+ - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+);? Build'
regex_flag: 'i'
device_replacement: 'Alcatel One Touch $1'
brand_replacement: 'Alcatel'
@@ -1095,7 +1674,7 @@ device_parsers:
device_replacement: '$1$2'
brand_replacement: 'Allview'
model_replacement: '$2'
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)?(AX1_Shine|AX2_Frenzy) Build'
+ - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy) Build'
device_replacement: '$1$2'
brand_replacement: 'Allview'
model_replacement: '$2'
@@ -1155,7 +1734,7 @@ device_parsers:
# @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
# @note: brand owned by luckystar
#########
- - regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T)?|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D) Build'
+ - regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D) Build'
device_replacement: 'Aoson $1'
brand_replacement: 'Aoson'
model_replacement: '$1'
@@ -1230,7 +1809,7 @@ device_parsers:
# Assistant
# @ref: http://www.assistant.ua
#########
- - regex: '; *(?:ASSISTANT )?(AP)-?([1789]\d{2}[A-Z]{0,2}|80104) Build'
+ - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104) Build'
device_replacement: 'Assistant $1-$2'
brand_replacement: 'Assistant'
model_replacement: '$1-$2'
@@ -1239,7 +1818,7 @@ device_parsers:
# Asus
# @ref: http://www.asus.com/uk/Tablets_Mobile/
#########
- - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013)?|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc) Build'
+ - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc) Build'
device_replacement: 'Asus $1'
brand_replacement: 'Asus'
model_replacement: '$1'
@@ -1787,7 +2366,7 @@ device_parsers:
# Gionee
# @ref: http://www.gionee.com/
#########
- - regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]+)? Build'
+ - regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]+|) Build'
regex_flag: 'i'
device_replacement: '$1 $2'
brand_replacement: 'Gionee'
@@ -1800,6 +2379,11 @@ device_parsers:
device_replacement: 'Gionee $1'
brand_replacement: 'Gionee'
model_replacement: '$1'
+ - regex: '\sGIONEE[-\s_](\w*)'
+ regex_flag: 'i'
+ device_replacement: 'Gionee $1'
+ brand_replacement: 'Gionee'
+ model_replacement: '$1'
#########
# GoClever
@@ -1822,6 +2406,10 @@ device_parsers:
device_replacement: '$1'
brand_replacement: 'Google'
model_replacement: '$1'
+ - regex: '; *(Pixel.*) Build'
+ device_replacement: '$1'
+ brand_replacement: 'Google'
+ model_replacement: '$1'
#########
# Gigabyte
@@ -1942,7 +2530,7 @@ device_parsers:
# @ref: http://www.huaweidevice.com
# @note: Needs to be before HTC due to Desire HD Build on U8815
#########
- - regex: '; *(HUAWEI |Huawei-)?([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
+ - regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
device_replacement: '$1$2'
brand_replacement: 'Huawei'
model_replacement: '$2'
@@ -1958,7 +2546,7 @@ device_parsers:
device_replacement: '$1$2'
brand_replacement: 'Huawei'
model_replacement: '$2'
- - regex: '; *((?:HUAWEI[ _]?|Huawei[ _])?Ascend[ _])([^;/]+) Build'
+ - regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build'
device_replacement: '$1$2'
brand_replacement: 'Huawei'
model_replacement: '$2'
@@ -1974,7 +2562,7 @@ device_parsers:
device_replacement: '$1'
brand_replacement: 'Huawei'
model_replacement: '$1'
- - regex: '; *([^;]+) Build/Huawei'
+ - regex: '; *([^;]+) Build/(?:Huawei|HUAWEI)'
device_replacement: '$1'
brand_replacement: 'Huawei'
model_replacement: '$1'
@@ -1990,7 +2578,7 @@ device_parsers:
device_replacement: 'Huawei Ideos$1'
brand_replacement: 'Huawei'
model_replacement: 'Ideos$1'
- - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660) Build'
+ - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]'
device_replacement: 'Huawei $1'
brand_replacement: 'Huawei'
model_replacement: '$1'
@@ -2002,9 +2590,9 @@ device_parsers:
#########
- regex: '; *HTC[ _]([^;]+); Windows Phone'
- device_replacement: 'HTC $1 $2'
+ device_replacement: 'HTC $1'
brand_replacement: 'HTC'
- model_replacement: '$1 $2'
+ model_replacement: '$1'
# Android HTC with Version Number matcher
# ; HTC_0P3Z11/1.12.161.3 Build
@@ -2013,33 +2601,33 @@ device_parsers:
device_replacement: 'HTC $1'
brand_replacement: 'HTC'
model_replacement: '$1'
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+))?(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
+ - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
device_replacement: 'HTC $1 $2'
brand_replacement: 'HTC'
model_replacement: '$1 $2'
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+))?)?(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
+ - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
device_replacement: 'HTC $1 $2 $3'
brand_replacement: 'HTC'
model_replacement: '$1 $2 $3'
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+))?)?)?(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
+ - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
device_replacement: 'HTC $1 $2 $3 $4'
brand_replacement: 'HTC'
model_replacement: '$1 $2 $3 $4'
# Android HTC without Version Number matcher
- - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
+ - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
device_replacement: 'HTC $1'
brand_replacement: 'HTC'
model_replacement: '$1'
- - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+))?(?: *Build|[;\)]| - )'
+ - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: *Build|[;\)]| - )'
device_replacement: 'HTC $1 $2'
brand_replacement: 'HTC'
model_replacement: '$1 $2'
- - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+))?)?(?: *Build|[;\)]| - )'
- device_replacement: 'HTC $1 $2 $3 $4'
+ - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )'
+ device_replacement: 'HTC $1 $2 $3'
brand_replacement: 'HTC'
- model_replacement: '$1 $2 $3 $4'
- - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+))?)?)?(?: *Build|[;\)]| - )'
+ model_replacement: '$1 $2 $3'
+ - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )'
device_replacement: 'HTC $1 $2 $3 $4'
brand_replacement: 'HTC'
model_replacement: '$1 $2 $3 $4'
@@ -2050,7 +2638,7 @@ device_parsers:
brand_replacement: 'HTC'
model_replacement: '$1'
# general matcher for anything else
- - regex: '(?:[;,] *|^)(?:htccn_chs-)?HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
+ - regex: '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
regex_flag: 'i'
device_replacement: 'HTC $1'
brand_replacement: 'HTC'
@@ -2063,9 +2651,9 @@ device_parsers:
model_replacement: '$1'
- regex: '; *(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.+?)(?:[/;\)]|Build|MIUI|1\.0)'
regex_flag: 'i'
- device_replacement: 'HTC $1 $2 $3 $4'
+ device_replacement: 'HTC $1 $2'
brand_replacement: 'HTC'
- model_replacement: '$1 $2 $3 $4'
+ model_replacement: '$1 $2'
#########
# Hyundai
@@ -2089,7 +2677,7 @@ device_parsers:
# iBall
# @ref: http://www.iball.co.in/Category/Mobiles/22
#########
- - regex: '; *(?:iBall[ _\-])?(Andi)[ _]?(\d[^;/]*) Build'
+ - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*) Build'
regex_flag: 'i'
device_replacement: '$1 $2'
brand_replacement: 'iBall'
@@ -2104,7 +2692,7 @@ device_parsers:
# IconBIT
# @ref: http://www.iconbit.com/catalog/tablets/
#########
- - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+)? Build'
+ - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|) Build'
device_replacement: '$1'
brand_replacement: 'IconBIT'
model_replacement: '$1'
@@ -2177,17 +2765,17 @@ device_parsers:
# @note: Zync also offers a "Cloud Z5" device
#########
# smartphones
- - regex: '; *(?:Intex[ _])?(AQUA|Aqua)([ _\.\-])([^;/]+) *(?:Build|;)'
+ - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+) *(?:Build|;)'
device_replacement: '$1$2$3'
brand_replacement: 'Intex'
model_replacement: '$1 $3'
# matches "INTEX CLOUD X1"
- - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+))? *(?:Build|;)'
+ - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) *(?:Build|;)'
device_replacement: '$1 $2'
brand_replacement: 'Intex'
model_replacement: '$1 $2'
# tablets
- - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| )?([^;/]*) *(?:Build|;)'
+ - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)'
device_replacement: '$1 $2 $3'
brand_replacement: 'Intex'
model_replacement: 'iBuddy $2 $3'
@@ -2210,7 +2798,7 @@ device_parsers:
# i.onik
# @ref: http://www.i-onik.de/
#########
- - regex: '; *(TP\d+(?:\.\d+)?\-\d[^;/]+) Build'
+ - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+) Build'
device_replacement: 'ionik $1'
brand_replacement: 'ionik'
model_replacement: '$1'
@@ -2426,7 +3014,7 @@ device_parsers:
# Lava
# @ref: http://www.lavamobiles.com/
#########
- - regex: '; *(?:LAVA[ _])?IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
+ - regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
regex_flag: 'i'
device_replacement: 'Iris $1'
brand_replacement: 'Lava'
@@ -2478,15 +3066,15 @@ device_parsers:
device_replacement: 'Lenovo $1 $2'
brand_replacement: 'Lenovo'
model_replacement: '$1 $2'
- - regex: '; *(?:LNV-)?(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])+(.+?)(?:Build|[;/\)])'
+ - regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])'
device_replacement: 'Lenovo $1'
brand_replacement: 'Lenovo'
model_replacement: '$1'
- - regex: '[;,] (?:Vodafone )?(SmartTab) ?(II) ?(\d+) Build/'
+ - regex: '[;,] (?:Vodafone |)(SmartTab) ?(II) ?(\d+) Build/'
device_replacement: 'Lenovo $1 $2 $3'
brand_replacement: 'Lenovo'
model_replacement: '$1 $2 $3'
- - regex: '; *(?:Ideapad )?K1 Build/'
+ - regex: '; *(?:Ideapad |)K1 Build/'
device_replacement: 'Lenovo Ideapad K1'
brand_replacement: 'Lenovo'
model_replacement: 'Ideapad K1'
@@ -2512,11 +3100,11 @@ device_parsers:
# LG
# @ref: http://www.lg.com/uk/mobile
#########
- - regex: '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus [45]|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)'
+ - regex: '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)'
device_replacement: '$1'
brand_replacement: 'LG'
model_replacement: '$1'
- - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+)? *(?:Build|[;\)])'
+ - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) *(?:Build|[;\)])'
device_replacement: '$1'
brand_replacement: 'LG'
model_replacement: '$1'
@@ -2532,6 +3120,10 @@ device_parsers:
device_replacement: '$1 $2'
brand_replacement: 'LG'
model_replacement: '$2'
+ - regex: '(Web0S); Linux/(SmartTV)'
+ device_replacement: 'LG $1 $2'
+ brand_replacement: 'LG'
+ model_replacement: '$1 $2'
#########
# Malata
@@ -2595,7 +3187,7 @@ device_parsers:
# Medion
# @ref: http://www.medion.com/en/
#########
- - regex: '; *(?:MD_)?LIFETAB[ _]([^;/]+) Build'
+ - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+) Build'
regex_flag: 'i'
device_replacement: 'Medion Lifetab $1'
brand_replacement: 'Medion'
@@ -2673,7 +3265,7 @@ device_parsers:
# Modecom
# @ref: http://www.modecom.eu/tablets/portal/
#########
- - regex: '; *(MODECOM )?(FreeTab) ?([^;/]+) Build'
+ - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+) Build'
regex_flag: 'i'
device_replacement: '$1$2 $3'
brand_replacement: 'Modecom'
@@ -2731,7 +3323,7 @@ device_parsers:
# MSI
# @ref: http://www.msi.com/product/windpad/
#########
- - regex: '; *(?:MSI[ _])?(Primo\d+|Enjoy[ _\-][^;/]+) Build'
+ - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+) Build'
regex_flag: 'i'
device_replacement: '$1'
brand_replacement: 'Msi'
@@ -2758,7 +3350,7 @@ device_parsers:
device_replacement: '$1$2 $3'
brand_replacement: 'MyPhone'
model_replacement: '$3'
- - regex: '; *(A\d+)[ _](Duo)? Build'
+ - regex: '; *(A\d+)[ _](Duo|) Build'
regex_flag: 'i'
device_replacement: '$1 $2'
brand_replacement: 'MyPhone'
@@ -2827,7 +3419,7 @@ device_parsers:
device_replacement: '$1$2'
brand_replacement: 'Nook'
model_replacement: '$2'
- - regex: '; *(NOOK )?(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build'
+ - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build'
device_replacement: '$1$2'
brand_replacement: 'Nook'
model_replacement: '$2'
@@ -2904,6 +3496,19 @@ device_parsers:
brand_replacement: 'Odys'
model_replacement: '$1'
+ #########
+ # OnePlus
+ # @ref https://oneplus.net/
+ #########
+ - regex: '; (ONE [a-zA-Z]\d+) Build/'
+ device_replacement: 'OnePlus $1'
+ brand_replacement: 'OnePlus'
+ model_replacement: '$1'
+ - regex: '; (ONEPLUS [a-zA-Z]\d+) Build/'
+ device_replacement: 'OnePlus $1'
+ brand_replacement: 'OnePlus'
+ model_replacement: '$1'
+
#########
# Orion
# @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
@@ -2949,11 +3554,11 @@ device_parsers:
# @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
# @models: ADR8995, ADR910L, ADR930VW, C790, CDM8992, CDM8999, IS06, IS11PT, P2000, P2020, P2030, P4100, P5000, P6010, P6020, P6030, P7000, P7040, P8000, P8010, P9020, P9050, P9060, P9070, P9090, PT001, PT002, PT003, TXT8040, TXT8045, VEGA PTL21
#########
- - regex: '; *(SKY[ _])?(IM\-[AT]\d{3}[^;/]+).* Build/'
+ - regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/'
device_replacement: 'Pantech $1$2'
brand_replacement: 'Pantech'
model_replacement: '$1$2'
- - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G)?) Build/'
+ - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
device_replacement: '$1'
brand_replacement: 'Pantech'
model_replacement: '$1'
@@ -3036,7 +3641,7 @@ device_parsers:
# Polaroid/ Acho
# @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
#########
- - regex: '; *(?:Polaroid[ _])?((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*)(\/[^;/]*)? Build/'
+ - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*)(\/[^;/]*|) Build/'
device_replacement: '$1'
brand_replacement: 'Polaroid'
model_replacement: '$1'
@@ -3063,7 +3668,7 @@ device_parsers:
device_replacement: '$1'
brand_replacement: 'Positivo'
model_replacement: '$1'
- - regex: '; *(?:Positivo )?((?:YPY|Ypy)[^;/]+) Build/'
+ - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+) Build/'
device_replacement: '$1'
brand_replacement: 'Positivo'
model_replacement: '$1'
@@ -3091,7 +3696,7 @@ device_parsers:
# @ref: http://www.prestigio.com/catalogue/MultiPhones
# @ref: http://www.prestigio.com/catalogue/MultiPads
#########
- - regex: '; *(?:Prestigio )?((?:PAP|PMP)\d[^;/]+) Build/'
+ - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+) Build/'
device_replacement: 'Prestigio $1'
brand_replacement: 'Prestigio'
model_replacement: '$1'
@@ -3109,7 +3714,7 @@ device_parsers:
# QMobile
# @ref: http://www.qmobile.com.pk/
#########
- - regex: '; *(A2|A5|A8|A900)_?(Classic)? Build'
+ - regex: '; *(A2|A5|A8|A900)_?(Classic|) Build'
device_replacement: '$1 $2'
brand_replacement: 'Qmobile'
model_replacement: '$1 $2'
@@ -3144,6 +3749,19 @@ device_parsers:
brand_replacement: 'Quanta'
model_replacement: '$1'
+ #########
+ # RCA
+ # @ref: http://rcamobilephone.com/
+ #########
+ - regex: '; (RCT\w+) Build/'
+ device_replacement: '$1'
+ brand_replacement: 'RCA'
+ model_replacement: '$1'
+ - regex: '; RCA (\w+) Build/'
+ device_replacement: 'RCA $1'
+ brand_replacement: 'RCA'
+ model_replacement: '$1'
+
#########
# Rockchip
# @ref: http://www.rock-chips.com/a/cn/product/index.html
@@ -3162,11 +3780,11 @@ device_parsers:
# Samsung Android Devices
# @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
#########
- - regex: '; *(SAMSUNG |Samsung )?((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
+ - regex: '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
device_replacement: 'Samsung $1$2'
brand_replacement: 'Samsung'
model_replacement: '$2'
- - regex: '; *(Google )?(Nexus [Ss](?: 4G)?) Build/'
+ - regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/'
device_replacement: 'Samsung $1$2'
brand_replacement: 'Samsung'
model_replacement: '$2'
@@ -3174,15 +3792,15 @@ device_parsers:
device_replacement: 'Samsung $2'
brand_replacement: 'Samsung'
model_replacement: '$2'
- - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G)?) Build/'
+ - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
device_replacement: 'Samsung $1'
brand_replacement: 'Samsung'
model_replacement: '$1'
- - regex: '; *(SAMSUNG[ _\-] *)+([^;/]+) Build'
+ - regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build'
device_replacement: 'Samsung $2'
brand_replacement: 'Samsung'
model_replacement: '$2'
- - regex: '; *(SAMSUNG-)?(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
+ - regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
device_replacement: 'Samsung $1$2$3'
brand_replacement: 'Samsung'
model_replacement: '$2'
@@ -3194,11 +3812,15 @@ device_parsers:
device_replacement: 'Samsung $1$2'
brand_replacement: 'Samsung'
model_replacement: '$2'
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*)? Build'
+ - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
device_replacement: 'Samsung $1'
brand_replacement: 'Samsung'
model_replacement: '$1'
- - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*)? Build'
+ - regex: '; *((?:SC)\-[A-Za-z0-9 ]+)(/?[^ ]*|)\)'
+ device_replacement: 'Samsung $1'
+ brand_replacement: 'Samsung'
+ model_replacement: '$1'
+ - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
device_replacement: 'Samsung $1'
brand_replacement: 'Samsung'
model_replacement: '$1'
@@ -3206,6 +3828,10 @@ device_parsers:
device_replacement: 'Samsung $1'
brand_replacement: 'Samsung'
model_replacement: '$1'
+ - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5})[\)]'
+ device_replacement: 'Samsung $1'
+ brand_replacement: 'Samsung'
+ model_replacement: '$1'
#########
# Sharp
@@ -3335,7 +3961,7 @@ device_parsers:
device_replacement: '$1$2'
brand_replacement: 'SonyEricsson'
model_replacement: '$2'
- - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o)?|R800i|U20i) Build'
+ - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
device_replacement: '$1'
brand_replacement: 'SonyEricsson'
model_replacement: '$1'
@@ -3399,7 +4025,7 @@ device_parsers:
# Spice
# @ref: http://www.spicemobilephones.co.in/
#########
- - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?)?([Mm][Ii])([ _\-])?(\d{3}[^;/]*) Build/'
+ - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*) Build/'
device_replacement: '$1$2$3$4'
brand_replacement: 'Spice'
model_replacement: 'Mi$4'
@@ -3538,7 +4164,7 @@ device_parsers:
device_replacement: '$1'
brand_replacement: 'HTC'
model_replacement: 'Dream'
- - regex: '\b(T-Mobile ?)?(myTouch)[ _]?([34]G)[ _]?([^\/]*) (?:Mozilla|Build)'
+ - regex: '\b(T-Mobile ?|)(myTouch)[ _]?([34]G)[ _]?([^\/]*) (?:Mozilla|Build)'
device_replacement: '$1$2 $3 $4'
brand_replacement: 'HTC'
model_replacement: '$2 $3 $4'
@@ -3583,7 +4209,7 @@ device_parsers:
device_replacement: '$1'
brand_replacement: 'Toshiba'
model_replacement: 'Folio 100'
- - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a)?|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive) Build/'
+ - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive) Build/'
device_replacement: 'Toshiba $1'
brand_replacement: 'Toshiba'
model_replacement: '$1'
@@ -3703,7 +4329,7 @@ device_parsers:
# Walton
# @ref: http://www.waltonbd.com/
#########
- - regex: '; *(?:Walton[ _\-])?(Primo[ _\-][^;/]+) Build'
+ - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+) Build'
regex_flag: 'i'
device_replacement: 'Walton $1'
brand_replacement: 'Walton'
@@ -3713,7 +4339,7 @@ device_parsers:
# Wiko
# @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
#########
- - regex: '; *(?:WIKO[ \-])?(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+) Build/'
+ - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+) Build/'
regex_flag: 'i'
device_replacement: 'Wiko $1'
brand_replacement: 'Wiko'
@@ -3759,7 +4385,7 @@ device_parsers:
# Yarvik Zania
# @ref: http://yarvik.com
#########
- - regex: '; *(?:Xenta |Luna )?(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3}) Build/'
+ - regex: '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3}) Build/'
device_replacement: 'Yarvik $1'
brand_replacement: 'Yarvik'
model_replacement: '$1'
@@ -3782,7 +4408,15 @@ device_parsers:
# XiaoMi
# @ref: http://www.xiaomi.com/event/buyphone
#########
- - regex: '; *(MI \d[^;/]*|MI-ONE Plus) Build/'
+ - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
+ device_replacement: 'XiaoMi $1'
+ brand_replacement: 'XiaoMi'
+ model_replacement: '$1'
+ - regex: '; *(MIX) (Build|MIUI)/'
+ device_replacement: 'XiaoMi $1'
+ brand_replacement: 'XiaoMi'
+ model_replacement: '$1'
+ - regex: '; *((MIX) ([^;/]*)) (Build|MIUI)/'
device_replacement: 'XiaoMi $1'
brand_replacement: 'XiaoMi'
model_replacement: '$1'
@@ -3948,7 +4582,7 @@ device_parsers:
device_replacement: 'Kindle'
brand_replacement: 'Amazon'
model_replacement: 'Kindle'
- - regex: '; ?(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))? Build\b'
+ - regex: '; ?(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+)|) Build\b'
device_replacement: 'Kindle Fire'
brand_replacement: 'Amazon'
model_replacement: 'Kindle Fire$2'
@@ -4000,7 +4634,7 @@ device_parsers:
#########
# Alcatel Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:ALCATEL)[^;]*; *([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\)]+)'
device_replacement: 'Alcatel $1'
brand_replacement: 'Alcatel'
model_replacement: '$1'
@@ -4008,8 +4642,8 @@ device_parsers:
#########
# Asus Windows Phones
#########
- #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
+ #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
device_replacement: 'Asus $1'
brand_replacement: 'Asus'
model_replacement: '$1'
@@ -4017,7 +4651,7 @@ device_parsers:
#########
# Dell Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:DELL|Dell)[^;]*; *([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\)]+)'
device_replacement: 'Dell $1'
brand_replacement: 'Dell'
model_replacement: '$1'
@@ -4025,7 +4659,7 @@ device_parsers:
#########
# HTC Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC)?([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\)]+)'
device_replacement: 'HTC $1'
brand_replacement: 'HTC'
model_replacement: '$1'
@@ -4033,7 +4667,7 @@ device_parsers:
#########
# Huawei Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:HUAWEI)[^;]*; *(?:HUAWEI )?([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\)]+)'
device_replacement: 'Huawei $1'
brand_replacement: 'Huawei'
model_replacement: '$1'
@@ -4041,7 +4675,7 @@ device_parsers:
#########
# LG Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:LG|Lg)[^;]*; *(?:LG[ \-])?([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \-]|)([^;,\)]+)'
device_replacement: 'LG $1'
brand_replacement: 'LG'
model_replacement: '$1'
@@ -4049,15 +4683,15 @@ device_parsers:
#########
# Noka Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?)*(\d{3,}[^;\)]*)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
device_replacement: 'Lumia $1'
brand_replacement: 'Nokia'
model_replacement: 'Lumia $1'
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
device_replacement: 'Nokia $1'
brand_replacement: 'Nokia'
model_replacement: '$1'
- - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?)?(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?)*([^;\)]+)'
+ - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
device_replacement: 'Nokia $1'
brand_replacement: 'Nokia'
model_replacement: '$1'
@@ -4065,7 +4699,7 @@ device_parsers:
#########
# Microsoft Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:Microsoft(?: Corporation)?)[^;]*; *([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\)]+)'
device_replacement: 'Microsoft $1'
brand_replacement: 'Microsoft'
model_replacement: '$1'
@@ -4073,7 +4707,7 @@ device_parsers:
#########
# Samsung Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:SAMSUNG)[^;]*; *(?:SAMSUNG )?([^;,\.\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\.\)]+)'
device_replacement: 'Samsung $1'
brand_replacement: 'Samsung'
model_replacement: '$1'
@@ -4081,7 +4715,7 @@ device_parsers:
#########
# Toshiba Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)'
device_replacement: 'Toshiba $1'
brand_replacement: 'Toshiba'
model_replacement: '$1'
@@ -4089,7 +4723,7 @@ device_parsers:
#########
# Generic Windows Phones
#########
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?([^;]+); *([^;,\)]+)'
+ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\)]+)'
device_replacement: '$1 $2'
brand_replacement: '$1'
model_replacement: '$2'
@@ -4109,7 +4743,7 @@ device_parsers:
#########
# Firefox OS
#########
- - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+)?; rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
+ - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
device_replacement: 'Alcatel $1 $2 $3'
brand_replacement: 'Alcatel'
model_replacement: 'One Touch $3'
@@ -4140,7 +4774,7 @@ device_parsers:
brand_replacement: '$1'
model_replacement: '$2'
# Nokia Symbian
- - regex: '\(Symbian(?:/3)?; U; ([^;]+);'
+ - regex: '\(Symbian(?:/3|); U; ([^;]+);'
device_replacement: 'Nokia $1'
brand_replacement: 'Nokia'
model_replacement: '$1'
@@ -4185,7 +4819,7 @@ device_parsers:
device_replacement: 'Palm Treo $1'
brand_replacement: 'Palm'
model_replacement: 'Treo $1'
- - regex: 'webOS.*(P160U(?:NA)?)/(\d+).(\d+)'
+ - regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)'
device_replacement: 'HP Veer'
brand_replacement: 'HP'
model_replacement: 'Veer'
@@ -4227,10 +4861,10 @@ device_parsers:
# cannot determine specific device type from ua string. (3g, 3gs, 4, etc)
##########
# @note: on some ua the device can be identified e.g. iPhone5,1
- - regex: '((?:iPhone|iPad|iPod)\d+,\d+)'
+ - regex: '(iPhone|iPad|iPod)(\d+,\d+)'
device_replacement: '$1'
brand_replacement: 'Apple'
- model_replacement: '$1'
+ model_replacement: '$1$2'
# @note: iPad needs to be before iPhone
- regex: '(iPad)(?:;| Simulator;)'
device_replacement: '$1'
@@ -4244,17 +4878,47 @@ device_parsers:
device_replacement: '$1'
brand_replacement: 'Apple'
model_replacement: '$1'
+ - regex: '(Watch)(\d+,\d+)'
+ device_replacement: 'Apple $1'
+ brand_replacement: 'Apple'
+ model_replacement: 'Apple $1 $2'
+ - regex: '(Apple Watch)(?:;| Simulator;)'
+ device_replacement: '$1'
+ brand_replacement: 'Apple'
+ model_replacement: '$1'
+ - regex: '(HomePod)(?:;| Simulator;)'
+ device_replacement: '$1'
+ brand_replacement: 'Apple'
+ model_replacement: '$1'
+ - regex: 'iPhone'
+ device_replacement: 'iPhone'
+ brand_replacement: 'Apple'
+ model_replacement: 'iPhone'
# @note: desktop applications show device info
- regex: 'CFNetwork/.* Darwin/\d.*\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
device_replacement: '$1$2,$3'
brand_replacement: 'Apple'
model_replacement: '$1$2,$3'
+ # @note: newer desktop applications don't show device info
+ # This is here so as to not have them recorded as iOS-Device
+ - regex: 'CFNetwork/.* Darwin/\d+\.\d+\.\d+ \(x86_64\)'
+ device_replacement: 'Mac'
+ brand_replacement: 'Apple'
+ model_replacement: 'Mac'
# @note: iOS applications do not show device info
- regex: 'CFNetwork/.* Darwin/\d'
device_replacement: 'iOS-Device'
brand_replacement: 'Apple'
model_replacement: 'iOS-Device'
+ ##########################
+ # Outlook on iOS >= 2.62.0
+ ##########################
+ - regex: 'Outlook-(iOS)/\d+\.\d+\.prod\.iphone'
+ brand_replacement: 'Apple'
+ device_replacement: 'iPhone'
+ model_replacement: 'iPhone'
+
##########
# Acer
##########
@@ -4286,7 +4950,7 @@ device_parsers:
device_replacement: 'Asus $1'
brand_replacement: 'Asus'
model_replacement: '$1'
- - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _])?[A-Za-z0-9]+)'
+ - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
device_replacement: 'Asus $1'
brand_replacement: 'Asus'
model_replacement: '$1'
@@ -4327,7 +4991,7 @@ device_parsers:
##########
# htc
##########
- - regex: '\b(?:HTC/|HTC/[a-z0-9]+/)?HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
+ - regex: '\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
device_replacement: 'HTC $1'
brand_replacement: 'HTC'
model_replacement: '$1'
@@ -4384,11 +5048,11 @@ device_parsers:
device_replacement: '$1'
brand_replacement: '$2'
model_replacement: '$3'
- - regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/)*(THOM[^;]*?)[;\s](?:.*SW-Version/.*)*(LF[^;]+);?'
+ - regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/|)(THOM[^;]*?)[;\s].{0,30}(LF[^;]+);?'
device_replacement: '$1'
brand_replacement: 'Thomson'
model_replacement: '$4'
- - regex: '(HbbTV)(?:/1\.1\.1)?(?: ?\(;;;;;\))?; *CE-HTML(?:/1\.\d)?; *([^ ]+) ([^;]+);'
+ - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); *CE-HTML(?:/1\.\d|); *([^ ]+) ([^;]+);'
device_replacement: '$1'
brand_replacement: '$2'
model_replacement: '$3'
@@ -4405,7 +5069,7 @@ device_parsers:
##########
# LGE NetCast TV
##########
- - regex: 'LGE; (?:Media\/)?([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
+ - regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
device_replacement: 'NetCast$2'
brand_replacement: 'LG'
model_replacement: '$1'
@@ -4434,7 +5098,7 @@ device_parsers:
brand_replacement: '$1'
model_replacement: '$2'
# other LG phones
- - regex: '\b(?:LGE[ \-]LG\-(?:AX)?|LGE |LGE?-LG|LGE?[ \-]|LG[ /\-]|lg[\-])([A-Za-z0-9]+)\b'
+ - regex: '\b(?:LGE[ \-]LG\-(?:AX|)|LGE |LGE?-LG|LGE?[ \-]|LG[ /\-]|lg[\-])([A-Za-z0-9]+)\b'
device_replacement: 'LG $1'
brand_replacement: 'LG'
model_replacement: '$1'
@@ -4514,6 +5178,11 @@ device_parsers:
##########
# Samsung
##########
+ # Samsung Smart-TV
+ - regex: '(SMART-TV); .* Tizen '
+ device_replacement: 'Samsung $1'
+ brand_replacement: 'Samsung'
+ model_replacement: '$1'
# Samsung Symbian Devices
- regex: 'SymbianOS/9\.\d.* Samsung[/\-]([A-Za-z0-9 \-]+)'
device_replacement: 'Samsung $1'
@@ -4574,7 +5243,7 @@ device_parsers:
device_replacement: '$2 $1'
brand_replacement: '$2'
model_replacement: '$1'
- - regex: '(Sony)(?:BDP\/|\/)?([^ /;\)]+)[ /;\)]'
+ - regex: '(Sony)(?:BDP\/|\/|)([^ /;\)]+)[ /;\)]'
device_replacement: '$1 $2'
brand_replacement: '$1'
model_replacement: '$2'
@@ -4604,27 +5273,27 @@ device_parsers:
#########
# Android General Device Matching (far from perfect)
#########
- - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+) Build'
+ - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\))'
brand_replacement: 'Generic_Android'
model_replacement: '$1'
- - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?) Build'
+ - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\))'
brand_replacement: 'Generic_Android'
model_replacement: '$1'
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?) Build'
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?)( Build[/ ]|\))'
brand_replacement: 'Generic_Android'
model_replacement: '$1'
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[A-Za-z]{0,2}\- *; *(.+?) Build'
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{0,2}\- *; *(.+?)( Build[/ ]|\))'
brand_replacement: 'Generic_Android'
model_replacement: '$1'
# No build info at all - "Build" follows locale immediately
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};? Build'
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
device_replacement: 'Generic Smartphone'
brand_replacement: 'Generic'
model_replacement: 'Smartphone'
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *\-?[A-Za-z]{2}; *(.+?) Build'
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))'
brand_replacement: 'Generic_Android'
model_replacement: '$1'
- - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}(?:;.*)?; *(.+?) Build'
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|)(?:;.*|); *(.+?)( Build[/ ]|\))'
brand_replacement: 'Generic_Android'
model_replacement: '$1'
@@ -4641,6 +5310,10 @@ device_parsers:
- regex: '(WebTV)/\d+.\d+'
brand_replacement: 'Generic_Inettv'
model_replacement: '$1'
+ # Roku Digital-Video-Players https://www.roku.com/
+ - regex: '^(Roku)/DVP-\d+\.\d+'
+ brand_replacement: 'Generic_Inettv'
+ model_replacement: '$1'
##########
# Generic Tablet
@@ -4667,7 +5340,7 @@ device_parsers:
##########
# Spiders (this is hack...)
##########
- - regex: '(bot|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes)'
+ - regex: '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti)'
regex_flag: 'i'
device_replacement: 'Spider'
brand_replacement: 'Spider'
diff --git a/test_resources/opera_mini_user_agent_strings.yaml b/test_resources/opera_mini_user_agent_strings.yaml
new file mode 100644
index 00000000..adfc3163
--- /dev/null
+++ b/test_resources/opera_mini_user_agent_strings.yaml
@@ -0,0 +1,1224 @@
+# Additional tests for opera mini detection.
+# List of user agent strings and corresponding versions is taken from http://www.useragentstring.com/pages/Opera%20Mini/
+# Some user agent string are from http://www.webapps-online.com/online-tools/user-agent-strings/dv/plugin55599/opera-mini
+
+test_cases:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (S60; SymbOS; Opera Mobi/23.348; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '9'
+ minor: '80'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (S60; SymbOS; Opera Mobi/23.334; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '9'
+ minor: '80'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (J2ME/23.377; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '9'
+ minor: '80'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (J2ME/22.478; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '9'
+ minor: '80'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9 (Compatible; MSIE:9.0; iPhone; BlackBerry9700; AppleWebKit/24.746; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '9'
+ minor:
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (Android; Opera Mini/7.6.35766/35.5706; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '7'
+ minor: '6'
+ patch: '35766'
+
+ - user_agent_string: 'Opera/9.80 (Android; Opera Mini/7.5.33361/31.1350; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '7'
+ minor: '5'
+ patch: '33361'
+
+ - user_agent_string: 'Opera/9.80 (Android; Opera Mini/7.29530/27.1407; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '7'
+ minor: '29530'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '7'
+ minor: '1'
+ patch: '32694'
+
+ - user_agent_string: 'Opera/9.80 (iPad; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '7'
+ minor: '1'
+ patch: '32694'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/7.1.32444/35.5706; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '7'
+ minor: '1'
+ patch: '32444'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/7.1.32444/35.2883; U; ru) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '7'
+ minor: '1'
+ patch: '32444'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/7.1.32052/35.5706; U; id) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '7'
+ minor: '1'
+ patch: '32052'
+
+ - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/7.0.4/28.2555; U; fr) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '7'
+ minor: '0'
+ patch: '4'
+
+ - user_agent_string: 'Opera/9.80 (Android; Opera Mini/7.0.29952/28.2075; U; es) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '7'
+ minor: '0'
+ patch: '29952'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.5.29702/28.2647; U; es) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '5'
+ patch: '29702'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/6.5.26955/27.1407; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '5'
+ patch: '26955'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/6.24288/25.729; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '24288'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (BlackBerry; Opera Mini/6.24209/27.1366; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '24209'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.24096/25.657; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '24096'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/6.24093/26.1305; U; en) Presto/2.8.119 Version/10.54'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '24093'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/6.24093/25.657; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '24093'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.1.25759/25.872; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '1'
+ patch: '25759'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/6.1.25378/25.677; U; th) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '1'
+ patch: '25378'
+
+ - user_agent_string: 'Opera/9.80 (Android; Opera Mini/6.1.25375/25.657; U; es) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '1'
+ patch: '25375'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.0.24455/28.2766; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '0'
+ patch: '24455'
+
+ - user_agent_string: 'Opera/9.80 (Android;Opera Mini/6.0.24212/24.746 U;en) Presto/2.5.25 Version/10.5454'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '0'
+ patch: '24212'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.0.24095/24.760; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '0'
+ patch: '24095'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.0.24095/24.741; U; zh) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '6'
+ minor: '0'
+ patch: '24095'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22784/23.334; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22784'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22784/22.394; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22784'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22784/22.387; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22784'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22783/23.334; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22783'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22783/22.478; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22783'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22783/22.478; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22783'
+
+ - user_agent_string: 'Opera/9.80 (Android; Opera Mini/5.1.22460/23.334; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22460'
+
+ - user_agent_string: 'Opera/9.80 (Android; Opera Mini/5.1.22460/22.478; U; fr) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22460'
+
+ - user_agent_string: 'Opera/9.80 (Android; Opera Mini/5.1.22460/22.414; U; de) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22460'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/5.1.22396/22.478; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22396'
+
+ - user_agent_string: 'Opera/9.80 (BlackBerry; Opera Mini/5.1.22303/22.387; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22303'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.22296; BlackBerry9800; U; AppleWebKit/23.370; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22296'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.22296/22.87; U; fr) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22296'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.22296/22.87; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22296'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.22296/22.478; U; fr) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22296'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.22296/22.387; U; fr) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '22296'
+
+ - user_agent_string: 'Opera/9.50 (J2ME/MIDP; Opera Mini/5.1.21965/20.2513; U; en)'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '21965'
+
+ - user_agent_string: 'Opera/9.80 (Windows Mobile; Opera Mini/5.1.21595/25.657; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '21595'
+
+ - user_agent_string: 'Opera/9.80 (Windows Mobile; Opera Mini/5.1.21594/22.387; U; ru) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '21594'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21415/22.387; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '21415'
+
+ - user_agent_string: 'Opera/10.61 (J2ME/MIDP; Opera Mini/5.1.21219/19.999; en-US; rv:1.9.3a5) WebKit/534.5 Presto/2.6.30'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '21219'
+
+ - user_agent_string: 'Opera/9.80(J2ME/MIDP; Opera Mini/5.1.21214/22.414; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '21214'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/22.414; U; ro) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '21214'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21214/22.387; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '21214'
+
+ - user_agent_string: 'Opera/9.80 (Android; Opera Mini/5.1.21126/19.892; U; de) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '21126'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21051/27.1573; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '21051'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21051/23.377; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '21051'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.1.21051/20.2477; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '1'
+ patch: '21051'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.3521/886; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '3521'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.3521/22.414; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '3521'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.3521/18.684; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '3521'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.22349/37.6584; U; en) Presto/2.12.423 Version/12.16'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '22349'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.20873/19.916; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '20873'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.19693Mod.by.Handler/23.390; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '19693'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.19693Mod.by.Handler/18.794; U; id) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '19693'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.19693/870; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '19693'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.19683/1278; U; ko) Presto/2.2.0'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '19683'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18741Mod.by.Handler/22.414; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '18741'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18741/886; U; id) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '18741'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18741/886; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '18741'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18741/870; U; fr) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '18741'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18741/870; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '18741'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18741/18.794; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '18741'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18635Mod.by.Handler/23.377; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '18635'
+
+ - user_agent_string: 'Opera/9.80 (Windows NT 5.1; U; Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18635/1030; U; en) Presto/2.4.15; ru) Presto/2.8.99 Version/11.10'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '18635'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.18635/886; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '18635'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.17443/886; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '17443'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.17443/20.2477; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '17443'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.17381/886; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '17381'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.16823Mod.by.Handler/22.387; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '16823'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.16823/870; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '16823'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.15650/20.2479; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '15650'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/iPhone;Opera Mini/5.0.019802/886; U; ja)Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '019802'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/iPhone;Opera Mini/5.0.019802/886; U; ja)Presto/ 2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '019802'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/iPhone;Opera Mini/5.0.019802/886; U; ja) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '019802'
+
+ - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/5.0.019802/886; U; ja) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '019802'
+
+ - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/5.0.019802/886; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '019802'
+
+ - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/5.0.019802/22.414; U; de) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '019802'
+
+ - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/5.0.019802/18.738; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '019802'
+
+ - user_agent_string: 'Opera/9.80 (iPhone; Opera Mini/5.0.0176/764; U; en) Presto/2.4.154.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '0176'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.0.862 Profile/24.743; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '0'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.0.423 Profile/18.684; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '0'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.0.351 Profile/22.478; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch: '0'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0/870; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0(Windows; U; Windows NT 5.1; en-US)/23.390; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 6.1; sv-SE) AppleWebKit/23.411; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/24.838; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/23.411; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/22.478; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/23.377; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows NT 6.1; WOW64) AppleWebKit/23.411; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (SymbianOS/24.838; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Linux; U; Android 2.2; fr-lu; HTC Legend Build/24.838; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Linux; U; Android 2.2; en-sa; HTC_DesireHD_A9191 Build/24.741; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (iPhone; U; xxxx like Mac OS X; en) AppleWebKit/24.838; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (iPhone; U; fr; CPU iPhone OS 4_2_1 like Mac OS X; fr) AppleWebKit/23.405; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/23.411; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/23.377; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (BlackBerry; U; BlackBerry9800; en-GB) AppleWebKit/24.783; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (BlackBerry; U; BlackBerry 9800) AppleWebKit/24.783; U; es) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.5.33867/35.2883; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '5'
+ patch: '33867'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.4.Vista/19.916; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '4'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.4.29476/27.1573; U; id) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '4'
+ patch: '29476'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.4.26736/28.2647; U; it) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '4'
+ patch: '26736'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.4.0.60 (Windows XP)/886; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '4'
+ patch: '0'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.3.24214; iPhone; CPU iPhone OS 4_2_1 like Mac OS X; AppleWebKit/24.783; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '3'
+ patch: '24214'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.3.24214/27.1407; U; id) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '3'
+ patch: '24214'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.3.24214 (Windows; U; Windows NT 6.1) AppleWebKit/24.838; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '3'
+ patch: '24214'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.3.13337/25.657; U; ro) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '3'
+ patch: '13337'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.24721/30.3316; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '24721'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.23453/28.2647; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '23453'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.21465/22.478; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '21465'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.21465/22.387; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '21465'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.19634/23.333; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '19634'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.18887/22.478; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '18887'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.16320/29.3594; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '16320'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.16007Mod.by.Handler/23.390; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '16007'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410QUAIN/22.478; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '15410'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410Mod.by.Handler/23.334; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '15410'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410Mod.by.Handler/23.333; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '15410'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410Mod.by.Handler/22.401; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '15410'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410Mod.by.Handler/20.2485; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '15410'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410Mod.by.Handler/18.678; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '15410'
+
+ - user_agent_string: 'Opera/9.60 (J2ME/MIDP;Opera Mini/4.2.15410Mod.by.Handler/503; U; en)Presto/2.2.0'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '15410'
+
+ - user_agent_string: 'Opera/9.50 (J2ME/MIDP; Opera Mini/4.2.15410Mod.by.Handler/20.2590; U; en)'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '15410'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410/870; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '15410'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410/24.899; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '15410'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15410/22.394; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '15410'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.15066/886; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '15066'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912mod.By.onome/22.401; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14912'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912Mod.by.Handler/24.783; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14912'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912Mod.by.Handler/23.377; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14912'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912Mod.By.www.9jamusic.cz.cc/22.387; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14912'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912/870; U; id) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14912'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912/35.5706; U; id) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14912'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912/24.746; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14912'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912/23.334; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14912'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912/23.333; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14912'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14912/22.394; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14912'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14885/20.2485; U; zh) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14885'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14881Mod.by.Handler/24.743; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14881'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14881Mod.by.Handler/23.317; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14881'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14753/20.2485; U; zh) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14753'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14409/20.2485; U; zh) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14409'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14320/886; U; id) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14320'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14320/22.478; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14320'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.14320/20.2485; U; zh) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '14320'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13943/20.2485; U; zh) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '13943'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13918/22.414; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '13918'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13400/20.2485; U; zh) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '13400'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13337.Mod.by.Handler/870; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '13337'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13337/886; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '13337'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13337/870; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '13337'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13337/19.916; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '13337'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13265/870; U; ro) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '13265'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13221/886; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '13221'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13221/870; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '13221'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2.13057/870; U; ja) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch: '13057'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.2 19.42.55/19.892; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '2'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.18061/27.1407; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '18061'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.15082/870; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '1'
+ patch: '15082'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.15082/25.677; U; vi) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '1'
+ patch: '15082'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.15082/20.2489; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '1'
+ patch: '15082'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.14287/22.387; U; id) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '1'
+ patch: '14287'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.13907/21.529; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '1'
+ patch: '13907'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.13573/20.2485; U; zh) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '1'
+ patch: '13573'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.12965/19.892; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '1'
+ patch: '12965'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.1.11321/24.871; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '1'
+ patch: '11321'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0.8462/22.414; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch: '8462'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0.8462/19.916; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch: '8462'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0.10247/19.916; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch: '10247'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0.10031/22.453; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch: '10031'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0/886; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0/870; U; id) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0/22.453; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0/22.401; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0/22.394; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.11) Gecko/23.390; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0 (Linux; U;'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/23.411; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0 (compatible; MSIE 5.0; UNIX) Opera 6.12 [en]/24.838; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/4.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/24.705; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.60 (J2ME/MIDP; Opera Mini/4.0/490; U; en) Presto/2.2.0'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/3.1.10423/22.387; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '3'
+ minor: '1'
+ patch: '10423'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/1.6.0_13/22.478; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '1'
+ minor: '6'
+ patch: '0'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/1.6.0_13/19.916; U; en) Presto/2.5.25'
+ family: 'Opera Mini'
+ major: '1'
+ minor: '6'
+ patch: '0'
+
+ - user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/1.0.30710/29.3594; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '1'
+ minor: '0'
+ patch: '30710'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/1.0/886; U; en) Presto/2.4.15'
+ family: 'Opera Mini'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/SymbianOS/22.478; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/Nokia2730c-1/22.478; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/Mozilla/23.334; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/(Windows; U; Windows NT 5.1; en-US) AppleWebKit/23.411; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini; U; zh) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini; U; en) Presto/2.8.119 Version/11.1019 Version/11.10.10'
+ family: 'Opera Mini'
+ major:
+ minor:
+ patch:
+
diff --git a/test_resources/pgts_browser_list.yaml b/test_resources/pgts_browser_list.yaml
index 2aacd017..c0532e0f 100755
--- a/test_resources/pgts_browser_list.yaml
+++ b/test_resources/pgts_browser_list.yaml
@@ -55,7 +55,7 @@ test_cases:
patch:
- user_agent_string: 'Alizee iPod 2005 (Beta; Mac OS X)'
- family: 'Mobile Safari'
+ family: 'Mobile Safari UI/WKWebView'
major:
minor:
patch:
@@ -1051,70 +1051,70 @@ test_cases:
patch: '0'
- user_agent_string: 'curl/7.10.2 (powerpc-apple-darwin7.0) libcurl/7.10.2 OpenSSL/0.9.7b zlib/1.1.4'
- family: 'Other'
- major:
- minor:
- patch:
+ family: 'curl'
+ major: '7'
+ minor: '10'
+ patch: '2'
- user_agent_string: 'curl/7.10.6 (i386-redhat-linux-gnu) libcurl/7.10.6 OpenSSL/0.9.7a ipv6 zlib/1.1.4'
- family: 'Other'
- major:
- minor:
- patch:
+ family: 'curl'
+ major: '7'
+ minor: '10'
+ patch: '6'
- user_agent_string: 'curl/7.10.6 (i386-redhat-linux-gnu) libcurl/7.10.6 OpenSSL/0.9.7a ipv6 zlib/1.2.0.7'
- family: 'Other'
- major:
- minor:
- patch:
+ family: 'curl'
+ major: '7'
+ minor: '10'
+ patch: '6'
- user_agent_string: 'curl/7.11.2 (i686-pc-linux-gnu) libcurl/7.10.2 OpenSSL/0.9.6i ipv6 zlib/1.1.4'
- family: 'Other'
- major:
- minor:
- patch:
+ family: 'curl'
+ major: '7'
+ minor: '11'
+ patch: '2'
- user_agent_string: 'curl/7.12.0 (i686-pc-linux-gnu) libcurl/7.12.0 OpenSSL/0.9.7e ipv6 zlib/1.2.2'
- family: 'Other'
- major:
- minor:
- patch:
+ family: 'curl'
+ major: '7'
+ minor: '12'
+ patch: '0'
- user_agent_string: 'curl/7.7.2 (powerpc-apple-darwin6.0) libcurl 7.7.2 (OpenSSL 0.9.6b)'
- family: 'Other'
- major:
- minor:
- patch:
+ family: 'curl'
+ major: '7'
+ minor: '7'
+ patch: '2'
- user_agent_string: 'curl/7.7.3 (i686-pc-linux-gnu) libcurl 7.7.3 (OpenSSL 0.9.6)'
- family: 'Other'
- major:
- minor:
- patch:
+ family: 'curl'
+ major: '7'
+ minor: '7'
+ patch: '3'
- user_agent_string: 'curl/7.7.3 (win32) libcurl 7.7.3 (OpenSSL 0.9.6)'
- family: 'Other'
- major:
- minor:
- patch:
+ family: 'curl'
+ major: '7'
+ minor: '7'
+ patch: '3'
- user_agent_string: 'curl/7.9.3 (powerpc-ibm-aix4.3.3.0) libcurl 7.9.3 (OpenSSL 0.9.6m)'
- family: 'Other'
- major:
- minor:
- patch:
+ family: 'curl'
+ major: '7'
+ minor: '9'
+ patch: '3'
- user_agent_string: 'curl/7.9.5 (i386-redhat-linux-gnu) libcurl 7.9.5 (OpenSSL 0.9.6b) (ipv6 enabled)'
- family: 'Other'
- major:
- minor:
- patch:
+ family: 'curl'
+ major: '7'
+ minor: '9'
+ patch: '5'
- user_agent_string: 'curl/7.9.8 (i386-redhat-linux-gnu) libcurl 7.9.8 (OpenSSL 0.9.7a) (ipv6 enabled)'
- family: 'Other'
- major:
- minor:
- patch:
+ family: 'curl'
+ major: '7'
+ minor: '9'
+ patch: '8'
- user_agent_string: 'DA 5.0'
family: 'Other'
@@ -4165,27 +4165,27 @@ test_cases:
patch:
- user_agent_string: 'libwww-perl/5.79'
- family: 'Other'
- major:
- minor:
+ family: 'libwww-perl'
+ major: '5'
+ minor: '79'
patch:
- user_agent_string: 'SonyEricssonT306/R101 [Html2Wml/0.4.11 libwww-perl/5.79]'
- family: 'Other'
- major:
- minor:
+ family: 'libwww-perl'
+ major: '5'
+ minor: '79'
patch:
- user_agent_string: 'testJapanequeDelicious/0.1 libwww-perl/5.803'
- family: 'Other'
- major:
- minor:
+ family: 'libwww-perl'
+ major: '5'
+ minor: '803'
patch:
- user_agent_string: 'W3C-checklink/4.1 [4.14] libwww-perl/5.803'
- family: 'Other'
- major:
- minor:
+ family: 'libwww-perl'
+ major: '5'
+ minor: '803'
patch:
- user_agent_string: 'Mozilla/3.0 (compatible; Linkman)'
@@ -4711,15 +4711,15 @@ test_cases:
patch:
- user_agent_string: 'Mozilla/4.0 (compatible; Lotus-Notes/5.0; Windows-NT)'
- family: 'Other'
- major:
- minor:
+ family: 'Lotus Notes'
+ major: '5'
+ minor: '0'
patch:
- user_agent_string: 'Mozilla/4.0 (compatible; Lotus-Notes/6.0; Windows-NT)'
- family: 'Other'
- major:
- minor:
+ family: 'Lotus Notes'
+ major: '6'
+ minor: '0'
patch:
- user_agent_string: 'LTH/3.02a (http://www.learntohack.nil)'
@@ -39415,9 +39415,9 @@ test_cases:
patch:
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 4.0; 3COM U.S. Robotics)'
- family: 'Robotics'
- major:
- minor:
+ family: 'IE'
+ major: '6'
+ minor: '0'
patch:
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 4.0; ABN AMRO)'
@@ -63409,7 +63409,7 @@ test_cases:
patch:
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows XP Professional Bot v.5.)'
- family: 'XP Professional Bot'
+ family: 'Windows XP Professional Bot'
major:
minor:
patch:
@@ -74779,15 +74779,15 @@ test_cases:
patch:
- user_agent_string: 'Wget/1.8.2 modified'
- family: 'Other'
- major:
- minor:
- patch:
+ family: 'Wget'
+ major: '1'
+ minor: '8'
+ patch: '2'
- user_agent_string: 'Wget/1.9+cvs-stable (Red Hat modified)'
- family: 'Other'
- major:
- minor:
+ family: 'Wget'
+ major: '1'
+ minor: '9'
patch:
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 5.00; Window 98)'
@@ -74989,13 +74989,13 @@ test_cases:
patch:
- user_agent_string: 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412.6.2 (KHTML, like Gecko)'
- family: 'AppleMail'
+ family: 'Apple Mail'
major: '412'
minor: '6'
patch: '2'
- user_agent_string: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; es-es) AppleWebKit/531.22.7 (KHTML, like Gecko)'
- family: 'AppleMail'
+ family: 'Apple Mail'
major: '531'
minor: '22'
patch: '7'
diff --git a/test_resources/podcasting_user_agent_strings.yaml b/test_resources/podcasting_user_agent_strings.yaml
new file mode 100755
index 00000000..c2d609fa
--- /dev/null
+++ b/test_resources/podcasting_user_agent_strings.yaml
@@ -0,0 +1,732 @@
+test_cases:
+
+ - user_agent_string: 'okhttp/2.7.5'
+ family: 'okhttp'
+ major: '2'
+ minor: '7'
+ patch: '5'
+ - user_agent_string: 'Stitcher/iOS'
+ family: 'Stitcher'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Stitcher/Android'
+ family: 'Stitcher'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; en-us; BeyondPod 4)'
+ family: 'BeyondPod'
+ major: '4'
+ minor:
+ patch:
+ - user_agent_string: 'NSPlayer/10.0.0.3702 WMFSDK/10.0'
+ family: 'NSPlayer'
+ major: '10'
+ minor: '0'
+ patch: '0'
+ patch_minor: '3702'
+ - user_agent_string: 'NSPlayer/12.00.10011.16384 WMFSDK/12.00.10011.16384'
+ family: 'NSPlayer'
+ major: '12'
+ minor: '00'
+ patch: '10011'
+ patch_minor: '16384'
+ - user_agent_string: 'Pocket Casts'
+ family: 'Pocket Casts'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Shifty Jelly Pocket Casts, Android v4.3.5'
+ family: 'Pocket Casts'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Player/LG Player 1.0 for Android 4.4.2 (stagefright alternative), Pocket Casts'
+ family: 'Pocket Casts'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'PocketTunes/5.5.8'
+ family: 'PocketTunes'
+ major: '5'
+ minor: '5'
+ patch: '8'
+ - user_agent_string: 'Overcast/2.0 (+http://overcast.fm/; iOS podcast app)'
+ family: 'Overcast'
+ major: '2'
+ minor: '0'
+ patch:
+ - user_agent_string: 'Overcast/1.0 Podcast Sync (+http://overcast.fm/)'
+ family: 'Overcast'
+ major: '1'
+ minor: '0'
+ patch:
+ - user_agent_string: 'Player FM'
+ family: 'Player FM'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Player/LG Player 1.0 for Android 4.4.2 (stagefright alternative), Player FM'
+ family: 'Player FM'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'AppleCoreMedia/1.0.0.9A405 (iPad; U; CPU OS 5_0_1 like Mac OS X; zh_cn), Player FM'
+ family: 'Player FM'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Player FM BMID/E6804C1C77'
+ family: 'Player FM'
+ major: 'E6804C1C77'
+ minor:
+ patch:
+ - user_agent_string: 'ExoPlayerDemo/4.11 (Linux;Android 5.1.1) ExoPlayerLib/1.5.2'
+ family: 'ExoPlayerDemo'
+ major: '4'
+ minor: '11'
+ patch:
+ - user_agent_string: 'Radio/1.0 (Linux;Android 6.0.1) ExoPlayerLib/1.5.2'
+ family: 'Radio'
+ major: '1'
+ minor: '0'
+ patch:
+ - user_agent_string: 'AlexaMediaPlayer/5.3.1-21 (Linux;Android 5.1) ExoPlayerLib/1.3.3 '
+ family: 'AlexaMediaPlayer'
+ major: '5'
+ minor: '3'
+ patch: '1-21'
+ - user_agent_string: 'Podkicker/2.2.4'
+ family: 'Podkicker'
+ major: '2'
+ minor: '2'
+ patch: '4'
+ - user_agent_string: 'Podkicker Pro/2.2.2 '
+ family: 'Podkicker'
+ major: '2'
+ minor: '2'
+ patch: '2'
+ - user_agent_string: 'Podkicker Classic/1.2.9'
+ family: 'Podkicker'
+ major: '1'
+ minor: '2'
+ patch: '9'
+ - user_agent_string: 'Downcast/2.9.13 (iPhone; iOS 9.2.1; Scale/2.00)'
+ family: 'Downcast'
+ major: '2'
+ minor: '9'
+ patch: '13'
+ - user_agent_string: 'iTunes/10.7 Downcast/5608'
+ family: 'Downcast'
+ major: '5608'
+ minor:
+ patch:
+ - user_agent_string: 'Downcast/2.9.10 (Mac OS X Version 10.11.3 (Build 15D21))'
+ family: 'Downcast'
+ major: '2'
+ minor: '9'
+ patch: '10'
+ - user_agent_string: 'iTunes/10.7 Downcast/2.8.14.1002'
+ family: 'Downcast'
+ major: '2'
+ minor: '8'
+ patch: '14'
+ patch_minor: '1002'
+ - user_agent_string: 'ESPN%20Radio/3.2.113 CFNetwork/485.12.30 Darwin/10.4.0'
+ family: 'ESPN'
+ major: '3'
+ minor: '2'
+ patch: '113'
+ - user_agent_string: 'ESPN Radio/3.2.113 CFNetwork/485.12.30 Darwin/10.4.0'
+ family: 'ESPN'
+ major: '3'
+ minor: '2'
+ patch: '113'
+ - user_agent_string: 'Stitcher/28420 CFNetwork/548.1.4 Darwin/11.0.0'
+ family: 'Stitcher'
+ major: '28420'
+ minor:
+ patch:
+ - user_agent_string: 'Stitcher/3.310746 CFNetwork/459 Darwin/10.0.0d3'
+ family: 'Stitcher'
+ major: '3'
+ minor: '310746'
+ patch:
+ - user_agent_string: 'Mark%20Levin%20Show/11 CFNetwork/758.3.15 Darwin/15.4.0'
+ family: 'Mark%20Levin%20Show'
+ major: '11'
+ minor:
+ patch:
+ - user_agent_string: 'The%20Dan%20Patrick%20Show/11 CFNetwork/758.2.8 Darwin/15.0.0'
+ family: 'The%20Dan%20Patrick%20Show'
+ major: '11'
+ minor:
+ patch:
+ - user_agent_string: 'The Dan Patrick Show/11 CFNetwork/758.2.8 Darwin/15.0.0'
+ family: 'The Dan Patrick Show'
+ major: '11'
+ minor:
+ patch:
+ - user_agent_string: '77%20WABC/11 CFNetwork/758.3.15 Darwin/15.4.0'
+ family: '77%20WABC'
+ major: '11'
+ minor:
+ patch:
+ - user_agent_string: '77 WABC/11 CFNetwork/758.3.15 Darwin/15.4.0'
+ family: '77 WABC'
+ major: '11'
+ minor:
+ patch:
+ - user_agent_string: 'KNBR%20680/11 CFNetwork/758.3.15 Darwin/15.4.0'
+ family: 'KNBR%20680'
+ major: '11'
+ minor:
+ patch:
+ - user_agent_string: 'PodcastOne/3.0.6 CFNetwork/758.3.15 Darwin/15.4.0'
+ family: 'PodcastOne'
+ major: '3'
+ minor: '0'
+ patch: '6'
+ - user_agent_string: 'PodcastOne/2.0 CFNetwork/758.2.8 Darwin/15.0.0 '
+ family: 'PodcastOne'
+ major: '2'
+ minor: '0'
+ patch:
+ - user_agent_string: 'AudioBoom/226 CFNetwork/758.3.15 Darwin/15.4.0'
+ family: 'AudioBoom'
+ major: '226'
+ minor:
+ patch:
+ - user_agent_string: 'https://audioboom.com/boos/'
+ family: 'AudioBoom'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Sports%20Talk%201050/10 CFNetwork/758.3.15 Darwin/15.4.0'
+ family: 'Sports%20Talk%201050'
+ major: '10'
+ minor:
+ patch:
+ - user_agent_string: 'PodCruncher/3.2 CFNetwork/758.2.8 Darwin/15.0.0'
+ family: 'PodCruncher'
+ major: '3'
+ minor: '2'
+ patch:
+ - user_agent_string: 'iTunes/10.5.2 (PodCruncher 2.2)'
+ family: 'PodCruncher'
+ major: '2'
+ minor: '2'
+ patch:
+ - user_agent_string: 'Zune/4.8'
+ family: 'Zune'
+ major: '4'
+ minor: '8'
+ patch:
+ - user_agent_string: '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; InfoPath.3; Zune 4.7)'
+ family: 'Zune'
+ major: '4'
+ minor: '7'
+ patch:
+ - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; OverDrive Download Station 1.0; Zune 4.7; .NET4.0C)'
+ family: 'Zune'
+ major: '4'
+ minor: '7'
+ patch:
+ - user_agent_string: 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)'
+ family: 'Zune'
+ major: '4'
+ minor: '0'
+ patch:
+ - user_agent_string: 'RSSRadio/8899 (iPhone,iPhone OS,9.3)'
+ family: 'RSSRadio'
+ major: '8899'
+ minor:
+ patch:
+ - user_agent_string: 'RSSRadio (Push Notification Scanner;support@dorada.co.uk)'
+ family: 'RSSRadio'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'RSS_Radio 1.5'
+ family: 'RSSRadio'
+ major: '1'
+ minor: '5'
+ patch:
+ - user_agent_string: 'RSSRadio/2.68.14049 CFNetwork/672.1.15 Darwin/14.0.0'
+ family: 'RSSRadio'
+ major: '2'
+ minor: '68'
+ patch: '14049'
+ - user_agent_string: 'Lavf/56.15.102'
+ family: 'WMPlayer'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Lavf52.64.2'
+ family: 'WMPlayer'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Lavf53.32.100/WinampMPEG/2.8'
+ family: 'WMPlayer'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Lavf52.104.0 WMPlayer/10.0.0.364 guid/3300AD50-2C39-46C0-AE0A-AC7B8159E203'
+ family: 'WMPlayer'
+ major: '10'
+ minor: '0'
+ patch: '0'
+ patch_minor: '364'
+ - user_agent_string: 'WMPlayer/10.0.0.364 guid/3300AD50-2C39-46C0-AE0A-AC7B8159E203'
+ family: 'WMPlayer'
+ major: '10'
+ minor: '0'
+ patch: '0'
+ patch_minor: '364'
+ - user_agent_string: 'AntennaPod/1.5.2.0'
+ family: 'AntennaPod'
+ major: '1'
+ minor: '5'
+ patch: '2'
+ patch_minor: '0'
+ - user_agent_string: 'Antenna/965 CFNetwork/758.2.8 Darwin/15.0.0'
+ family: 'AntennaPod'
+ major: '965'
+ minor:
+ patch:
+ - user_agent_string: 'AntennaPod/1.2.1'
+ family: 'AntennaPod'
+ major: '1'
+ minor: '2'
+ patch: '1'
+ - user_agent_string: 'HTC Streaming Player htc / 1.0 / cingular_us / 5.0.2'
+ family: 'HTC'
+ major: '5'
+ minor: '0'
+ patch: '2'
+ - user_agent_string: 'HTC Streaming Player utstarcom_wwe-generic / 1.0 / htc_kingdom / 2.3.4'
+ family: 'HTC'
+ major: '2'
+ minor: '3'
+ patch: '4'
+ - user_agent_string: 'HTC Streaming Player telus_wwe / 1.0 / htc_ruby / 4.0.3'
+ family: 'HTC'
+ major: '4'
+ minor: '0'
+ patch: '3'
+ - user_agent_string: 'HTC Streaming Player htc / 1.0 / himauhl_htc_asia_tw / 6.0 '
+ family: 'HTC'
+ major: '6'
+ minor: '0'
+ patch:
+ - user_agent_string: 'ZDM/4.0; Windows Mobile 8.1'
+ family: 'ZDM'
+ major: '4'
+ minor: '0'
+ patch:
+ - user_agent_string: 'bPod'
+ family: 'bPod'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'bPod BMID/E679FACD4C'
+ family: 'bPod'
+ major: 'E679FACD4C'
+ minor:
+ patch:
+ - user_agent_string: 'PodcastAddict/v2 - Dalvik/2.1.0 (Linux; U; Android 6.0; LG-H811 Build/MRA58K)'
+ family: 'PodcastAddict'
+ major: '2'
+ minor:
+ patch:
+ - user_agent_string: 'Podcast Addict - Dalvik/2.1.0 (Linux; U; Android 5.1.1; SM-G920P Build/LMY47X)'
+ family: 'PodcastAddict'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'LG-H345/V10f Player/LG Player 1.0 for Android 5.1.1 (stagefright alternative)'
+ family: 'LG Player'
+ major: '1'
+ minor: '0'
+ patch:
+ - user_agent_string: 'Player/LG Player 1.0 for Android 6.0 (stagefright alternative)'
+ family: 'LG Player'
+ major: '1'
+ minor: '0'
+ patch:
+ - user_agent_string: 'EspnDownloadManager'
+ family: 'ESPN'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'ESPN Radio 4.7.4 rv:1032 (iPhone; iPhone OS 9.2.1; en_US)'
+ family: 'ESPN'
+ major: '4'
+ minor: '7'
+ patch: '4'
+ patch_minor: '1032'
+ - user_agent_string: 'ESPN Radio 4.5.1 (iPhone; iPhone OS 5.1.1; en_US)'
+ family: 'ESPN'
+ major: '4'
+ minor: '5'
+ patch: '1'
+ - user_agent_string: 'ESPN Radio 4.0 (iPhone; iPhone OS 7.1.2; en_AU)'
+ family: 'ESPN'
+ major: '4'
+ minor: '0'
+ patch:
+ - user_agent_string: 'http://c.espnradio.com/s:'
+ family: 'ESPN'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.4; HP Slate 17 Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Safari/537.36ESPN APP'
+ family: 'ESPN'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Mozilla/5.0 (compatible; heritrix/3.2.0 +http://espn.go.com'
+ family: 'ESPN'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Custom-Feed Reader'
+ family: 'Custom'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) amarok/2.8.0 Safari/534.34'
+ family: 'Amarok'
+ major: '2'
+ minor: '8'
+ patch: '0'
+ - user_agent_string: 'amarok/2.8.0 (Phonon/4.8.0; Phonon-VLC/0.8.0) LibVLC/2.2.1'
+ family: 'Amarok'
+ major: '2'
+ minor: '8'
+ patch: '0'
+ - user_agent_string: 'Banshee/2.6.2 (http://banshee-project.org/)'
+ family: 'Banshee'
+ major: '2'
+ minor: '6'
+ patch: '2'
+ - user_agent_string: 'gPodder/3.7.0 (+http://gpodder.org/)'
+ family: 'gPodder'
+ major: '3'
+ minor: '7'
+ patch: '0'
+ - user_agent_string: 'jPodder v 1.1 RC3'
+ family: 'jPodder'
+ major: '1'
+ minor: '1'
+ patch:
+ - user_agent_string: 'iPodder/2.1 +http://ipodder.sf.net/'
+ family: 'iPodder'
+ major: '2'
+ minor: '1'
+ patch:
+ - user_agent_string: 'massyn.net philpodder/1.6 (linux)'
+ family: 'philpodder'
+ major: '1'
+ minor: '6'
+ patch:
+ - user_agent_string: 'BashPodder'
+ family: 'BashPodder'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Clementine-qt5 1.2.3'
+ family: 'Clementine'
+ major: '1'
+ minor: '2'
+ patch: '3'
+ - user_agent_string: 'Clementine 1.2.3-1457-g4db358a'
+ family: 'Clementine'
+ major: '1'
+ minor: '2'
+ patch: '3-1457-g4db358a'
+ - user_agent_string: 'Clementine 1.2.3'
+ family: 'Clementine'
+ major: '1'
+ minor: '2'
+ patch: '3'
+ - user_agent_string: 'Clementine 1.2'
+ family: 'Clementine'
+ major: '1'
+ minor: '2'
+ patch:
+ - user_agent_string: 'Clementine 1.2.2 Clementine 1.2.2 Clementine 1.2.2'
+ family: 'Clementine'
+ major: '1'
+ minor: '2'
+ patch: '2'
+ - user_agent_string: 'foobar2000/1.1.14a'
+ family: 'foobar'
+ major: '1'
+ minor: '1'
+ patch: '14a'
+ - user_agent_string: 'foobar2000/1.2.3'
+ family: 'foobar'
+ major: '1'
+ minor: '2'
+ patch: '3'
+ - user_agent_string: 'Juice/2.2 (Windows) +http://juicereceiver.sf.net/'
+ family: 'Juice'
+ major: '2'
+ minor: '2'
+ patch:
+ - user_agent_string: 'Liferea/0.x.x (Linux; en_US.UTF-8; http://liferea.sf.net/)'
+ family: 'Liferea'
+ major: '0'
+ minor: 'x'
+ patch: 'x'
+ - user_agent_string: 'MediaGo'
+ family: 'MediaGo'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'MediaGo/3.0.0.403 (Windows NT 6.3; WOW64) NetworkDownloader/1.6.01.0 PlaybackEngine/2.20.103.05220'
+ family: 'MediaGo'
+ major: '3'
+ minor: '0'
+ patch: '0'
+ patch_minor: '403'
+ - user_agent_string: 'MediaMonkey'
+ family: 'MediaMonkey'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'MediaMonkey 4.1.9.1764'
+ family: 'MediaMonkey'
+ major: '4'
+ minor: '1'
+ patch: '9'
+ patch_minor: '1764'
+ - user_agent_string: 'Miro/6.0 (http://www.getmiro.com/; Windows post2008Server x86) '
+ family: 'Miro'
+ major: '6'
+ minor: '0'
+ patch:
+ - user_agent_string: 'Miro/3.0.3 (http://www.getmiro.com/; Microsoft Windows )'
+ family: 'Miro'
+ major: '3'
+ minor: '0'
+ patch: '3'
+ - user_agent_string: 'Fancy Cloud Music 1.4 build 2 (iPhone; iPhone OS 9.2.1; en_US)'
+ family: 'FancyMusic'
+ major: '1'
+ minor: '4'
+ patch:
+ - user_agent_string: 'FancyMusic 1.5.0 build 5 (iPod touch; iPhone OS 9.2.1; en_US)'
+ family: 'FancyMusic'
+ major: '1'
+ minor: '5'
+ patch: '0'
+ - user_agent_string: 'VOX Music Player'
+ family: 'VOX'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'NetNewsWire/3.3 (Mac OS X; http://netnewswireapp.com/mac/; gzip-happy)'
+ family: 'NetNewsWire'
+ major: '3'
+ minor: '3'
+ patch:
+ - user_agent_string: 'NetNewsWire/3.1.7 (Mac OS X; http://www.newsgator.com/Individuals/NetNewsWire/)'
+ family: 'NetNewsWire'
+ major: '3'
+ minor: '1'
+ patch: '7'
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/601.4.4 (KHTML, like Gecko) NetNewsWire/3.2'
+ family: 'NetNewsWire'
+ major: '3'
+ minor: '2'
+ patch:
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) NetNewsWire/3.3.2'
+ family: 'NetNewsWire'
+ major: '3'
+ minor: '3'
+ patch: '2'
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0; Rivo RHYTHM RX75 Build/LRX21M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36; | 2016-04-07 14:37:04'
+ family: 'Rivo'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Spotify'
+ family: 'Spotify'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'Spotify/1.0'
+ family: 'Spotify'
+ major: '1'
+ minor: '0'
+ patch:
+ - user_agent_string: 'VLC/2.0.6 LibVLC/2.0.6'
+ family: 'VLC'
+ major: '2'
+ minor: '0'
+ patch: '6'
+ - user_agent_string: 'vlc/1.1.0 LibVLC/1.1.0'
+ family: 'VLC'
+ major: '1'
+ minor: '1'
+ patch: '0'
+ - user_agent_string: 'VLC/3.0.0-git LibVLC/3.0.0-git BMID/E67AB28521'
+ family: 'VLC'
+ major: '3'
+ minor: '0'
+ patch: '0-git'
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/9.3 Mobile/11A465 Safari/9537.53 VLC for iOS/2.7.2'
+ family: 'VLC'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'VLC media player - version 1.0.3 Goldeneye - (c) 1996-2009 the VideoLAN team'
+ family: 'VLC'
+ major: '1'
+ minor: '0'
+ patch: '3'
+ - user_agent_string: 'VLC/2.2.0-rc1 LibVLC/2.2.0-rc1'
+ family: 'VLC'
+ major: '2'
+ minor: '2'
+ patch: '0-rc1'
+ - user_agent_string: 'VLC/2.2.0-pre4 LibVLC/2.2.0-pre4'
+ family: 'VLC'
+ major: '2'
+ minor: '2'
+ patch: '0-pre4'
+ - user_agent_string: 'CITA RSS Aggregator/2.7'
+ family: 'CITA'
+ major: '2'
+ minor: '7'
+ patch:
+ - user_agent_string: 'Doppler 2.9.5.4'
+ family: 'Doppler'
+ major: '2'
+ minor: '9'
+ patch: '5'
+ patch_minor: '4'
+ - user_agent_string: 'GoldenPod/0.8.4 (GNU/Linux; podcatcher; Using LWP) libwwwperl'
+ family: 'GoldenPod'
+ major: '0'
+ minor: '8'
+ patch: '4'
+ - user_agent_string: 'Replay AV'
+ family: 'Replay'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'MusicDownloaderLite/1.0.1 CFNetwork/609.1.4 Darwin/13.0.0'
+ family: 'MusicDownloader'
+ major: '1'
+ minor: '0'
+ patch: '1'
+ - user_agent_string: 'MusicDownloader/2.0.3 CFNetwork/548.0.4 Darwin/11.0.0'
+ family: 'MusicDownloader'
+ major: '2'
+ minor: '0'
+ patch: '3'
+ - user_agent_string: 'Plugged%20-%20Stream%20Podcasts%2C%20Music%20&%20More%20Free/5.0 CFNetwork/711.5.6 Darwin/14.0.0'
+ family: 'Plugged%20-%20Stream%20Podcasts%2C%20Music%20&%20More%20Free'
+ major: '5'
+ minor: '0'
+ patch:
+ - user_agent_string: 'PodWrangler/1.1 CFNetwork/672.1.15 Darwin/14.0.0'
+ family: 'PodWrangler'
+ major: '1'
+ minor: '1'
+ patch:
+ - user_agent_string: 'Custom/12 CFNetwork/758.2.8 Darwin/15.0.0'
+ family: 'Custom'
+ major: '12'
+ minor:
+ patch:
+ - user_agent_string: 'GoodReader4/100 CFNetwork/758.3.15 Darwin/15.4.0'
+ family: 'GoodReader4'
+ major: '100'
+ minor:
+ patch:
+ - user_agent_string: 'Free-Podcasts/132 CFNetwork/758.2.8 Darwin/15.0.0'
+ family: 'Free-Podcasts'
+ major: '132'
+ minor:
+ patch:
+ - user_agent_string: 'Free-Podcasts/1.05 CFNetwork/609 Darwin/13.0.0'
+ family: 'Free-Podcasts'
+ major: '1'
+ minor: '05'
+ patch:
+ - user_agent_string: 'TopPodcasts/261 CFNetwork/758.0.2 Darwin/15.0.0'
+ family: 'TopPodcasts'
+ major: '261'
+ minor:
+ patch:
+ - user_agent_string: 'TopPodcastsPro/201 CFNetwork/758.2.8 Darwin/15.0.0'
+ family: 'TopPodcasts'
+ major: '201'
+ minor:
+ patch:
+ - user_agent_string: 'TopPodcasts/2.1.4 CFNetwork/672.1.15 Darwin/14.0.0'
+ family: 'TopPodcasts'
+ major: '2'
+ minor: '1'
+ patch: '4'
+ - user_agent_string: 'Podcasts/2.2'
+ family: 'Podcasts'
+ major: '2'
+ minor: '2'
+ patch:
+ - user_agent_string: 'Podcasts/1.4.113'
+ family: 'Podcasts'
+ major: '1'
+ minor: '4'
+ patch: '113'
+ - user_agent_string: 'Peapod/pre1.0 +http://www.peapodpy.org.uk'
+ family: 'Peapod'
+ major: 'pre1'
+ minor: '0'
+ patch:
+ - user_agent_string: 'Peapod/1.0 +http://www.peapodpy.org.uk'
+ family: 'Peapod'
+ major: '1'
+ minor: '0'
+ patch:
+ - user_agent_string: 'podracer v1.4.1; GNU/Linux; x86_64'
+ family: 'podracer'
+ major: '1'
+ minor: '4'
+ patch: '1'
+ - user_agent_string: 'Kinoma5'
+ family: 'Kinoma'
+ major: '5'
+ minor:
+ patch:
+ - user_agent_string: 'QuickTime/7.6'
+ family: 'QuickTime'
+ major: '7'
+ minor: '6'
+ patch:
+ - user_agent_string: 'QuickTime.7.6.6'
+ family: 'QuickTime'
+ major: '7'
+ minor: '6'
+ patch: '6'
+ - user_agent_string: 'QuickNews/1.25'
+ family: 'QuickNews'
+ major: '1'
+ minor: '25'
+ patch:
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Windows NT 6.1; en-us; dream) DoggCatcher'
+ family: 'DoggCatcher'
+ major:
+ minor:
+ patch:
+ - user_agent_string: 'DoggCatcher/1.2'
+ family: 'DoggCatcher'
+ major: '1'
+ minor: '2'
+ patch:
diff --git a/tests/mocha.opts b/tests/mocha.opts
new file mode 100644
index 00000000..700bbc48
--- /dev/null
+++ b/tests/mocha.opts
@@ -0,0 +1,3 @@
+--ui tdd
+--reporter min
+--check-leaks
diff --git a/tests/regexes.js b/tests/regexes.js
new file mode 100644
index 00000000..79ab0c71
--- /dev/null
+++ b/tests/regexes.js
@@ -0,0 +1,36 @@
+'use strict'
+
+var assert = require('assert')
+var path = require('path')
+var fs = require('fs')
+var yaml = require('yamlparser')
+var regexes = readYAML('../regexes.yaml')
+var safe = require('safe-regex')
+var refImpl = require('uap-ref-impl')
+
+function readYAML (fileName) {
+ var file = path.join(__dirname, fileName)
+ var data = fs.readFileSync(file, 'utf8')
+ return yaml.eval(data)
+}
+
+suite('regexes', function () {
+ Object.keys(regexes).forEach(function (parser) {
+ suite(parser, function () {
+ regexes[parser].forEach(function(item) {
+ test(item.regex, function () {
+ assert.ok(safe(item.regex))
+ })
+ })
+ })
+ })
+
+ test('should not backtrack', function () {
+ var parse = refImpl(regexes).parse
+ var ua = Array(3200).fill('a').join('')
+ var start = Date.now()
+ parse(ua)
+ var diff = Date.now() - start
+ assert.ok(diff < 500, diff)
+ })
+})
diff --git a/tests/sample.js b/tests/sample.js
new file mode 100644
index 00000000..e7f49aed
--- /dev/null
+++ b/tests/sample.js
@@ -0,0 +1,17 @@
+'use strict'
+
+var path = require('path')
+var fs = require('fs')
+var yaml = require('yamlparser')
+var refImpl = require('uap-ref-impl')(readYAML('../regexes.yaml'))
+
+function readYAML (fileName) {
+ var file = path.join(__dirname, fileName)
+ var data = fs.readFileSync(file, 'utf8')
+ return yaml.eval(data)
+}
+
+if (require.main === module) {
+ var user_agent_string = process.argv[2]
+ console.log(refImpl.parse(user_agent_string))
+}
diff --git a/tests/test.js b/tests/test.js
index c4a8ee7a..ae23dfe9 100644
--- a/tests/test.js
+++ b/tests/test.js
@@ -14,7 +14,8 @@ function msg(name, actual, expected) {
return "Expected " + name + " to be " + JSON.stringify(expected) + " got " + JSON.stringify(actual) + " instead.";
}
-['../test_resources/firefox_user_agent_strings.yaml', '../tests/test_ua.yaml', '../test_resources/pgts_browser_list.yaml'].forEach(function(fileName) {
+['../test_resources/firefox_user_agent_strings.yaml', '../tests/test_ua.yaml', '../test_resources/pgts_browser_list.yaml',
+ '../test_resources/opera_mini_user_agent_strings.yaml','../test_resources/podcasting_user_agent_strings.yaml'].forEach(function(fileName) {
var fixtures = readYAML(fileName).test_cases;
suite(fileName, function() {
fixtures.forEach(function(f) {
diff --git a/tests/test_device.yaml b/tests/test_device.yaml
index 87d5abbe..bc3fdf32 100644
--- a/tests/test_device.yaml
+++ b/tests/test_device.yaml
@@ -1,5 +1,20 @@
test_cases:
+ - user_agent_string: 'atc/1.0 watchOS/5.1.3 model/Watch3,4 hwp/t8004 build/16S535 (6; dt:156)'
+ family: 'Apple Watch'
+ brand: 'Apple'
+ model: 'Apple Watch 3,4'
+
+ - user_agent_string: 'atc/1.0 watchOS/5.2 model/Watch4,4 hwp/t8006 build/16T225 (6; dt:193)'
+ family: 'Apple Watch'
+ brand: 'Apple'
+ model: 'Apple Watch 4,4'
+
+ - user_agent_string: '(null)/(null) watchOS/5.1.1 model/Watch3,3 hwp/t8004 build/16R600 (6; dt:155)'
+ family: 'Apple Watch'
+ brand: 'Apple'
+ model: 'Apple Watch 3,3'
+
- user_agent_string: 'ALCATEL-OT510A/382 ObigoInternetBrowser/Q05A'
family: 'Alcatel OT510A'
brand: 'Alcatel'
@@ -90,6 +105,16 @@ test_cases:
brand: 'Apple'
model: 'iPhone'
+ - user_agent_string: 'AppleCoreMedia/1.0.0.16R5303d (Apple Watch; U; CPU OS 5_0 like Mac OS X; en_au)'
+ family: 'Apple Watch'
+ brand: 'Apple'
+ model: 'Apple Watch'
+
+ - user_agent_string: 'AppleCoreMedia/1.0.0.16A303 (HomePod; U; CPU OS 12_0 like Mac OS X; en_us)'
+ family: 'HomePod'
+ brand: 'Apple'
+ model: 'HomePod'
+
- user_agent_string: 'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5'
family: 'iPod'
brand: 'Apple'
@@ -100,6 +125,11 @@ test_cases:
brand: 'Apple'
model: 'iPod'
+ - user_agent_string: 'Mozilla/5.0 (iPod touch; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69'
+ family: 'iPod'
+ brand: 'Apple'
+ model: 'iPod'
+
- user_agent_string: 'Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)'
family: 'Kindle'
brand: 'Amazon'
@@ -200,6 +230,11 @@ test_cases:
brand: 'LG'
model: 'Nexus 5'
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36'
+ family: 'Nexus 5X'
+ brand: 'LG'
+ model: 'Nexus 5X'
+
- user_agent_string: 'Bunjalloo/0.7.6(Nintendo DS;U;en)'
family: 'Nintendo DS'
brand: 'Nintendo'
@@ -351,9 +386,9 @@ test_cases:
model:
- user_agent_string: 'MQQBrowser/371 Mozilla/5.0 (iPhone 4S; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A523 Safari/7534.48.3'
- family: 'Generic Smartphone'
- brand: 'Generic'
- model: 'Smartphone'
+ family: 'iPhone'
+ brand: 'Apple'
+ model: 'iPhone'
- user_agent_string: 'Opera/9.80 (VRE; Opera Mini/4.2/28.2794; U; en) Presto/2.8.119 Version/11.10'
family: 'Generic Feature Phone'
@@ -620,6 +655,51 @@ test_cases:
brand: 'Spider'
model: 'Desktop'
+ - user_agent_string: 'NL-Crawler'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
+ - user_agent_string: 'Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko PTST/1.0'
+ family: 'Spider'
+ brand: 'Spider'
+ model:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.0 Safari/537.36 PTST/1.0'
+ family: 'Spider'
+ brand: 'Spider'
+ model:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4) Build/MPJ24.139-64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Mobile Safari/537.36 PTST/180521.140508'
+ family: 'Spider'
+ brand: 'Spider'
+ model:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4) Build/MPJ24.139-64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Mobile Safari/537.36 PTST/391'
+ family: 'Spider'
+ brand: 'Spider'
+ model:
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Datanyze; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+ family: 'Spider'
+ brand: 'Spider'
+ model:
+
+ - user_agent_string: 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/98 Safari/537.4 (StatusCake)'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
- user_agent_string: 'Mozilla/5.0 (Linux; Android 4.0.4; SAMSUNG-SGH-I717 Build/IMM76D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.131 Mobile Safari/537.36'
family: 'Samsung SGH-I717'
brand: 'Samsung'
@@ -3926,172 +4006,172 @@ test_cases:
model: 'AppleTV'
- user_agent_string: 'Mozilla/5.0 (iPad compatibility; U; CPU iPhone OS 5_1_1 like Mac OS X; HW iPad1,1; de_de) AppleWebKit/525.18.1 (KHTML, like Gecko) (AdMob-iSDK-20100614; iphoneos4.2)'
- family: 'iPad1,1'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad1,1'
- user_agent_string: 'Mozilla/5.0 (iPad2,1; iPad; U; CPU OS 6_1_3 like Mac OS X; de_DE) com.google.GooglePlus/23341 (KHTML, like Gecko) Mobile/K93AP (gzip)'
- family: 'iPad2,1'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad2,1'
- user_agent_string: 'Mozilla/5.0 (iPad compatibility; U; CPU iPhone OS 4_3_3 like Mac OS X; HW iPad2,2; de_de) AppleWebKit/525.18.1 (KHTML, like Gecko) (AdMob-iSDK-20100614; iphoneos4.1)'
- family: 'iPad2,2'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad2,2'
- user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11A465 [FBAN/FBIOS;FBAV/8.0.0.28.18;FBBV/1665515;FBDV/iPad2,3;FBMD/iPad;FBSN/iPhone OS;FBSV/7.0;FBSS/1; FBCR/Verizon;FBID/tablet;FBLC/de_DE;FBOP/1]'
- family: 'iPad2,3'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad2,3'
- user_agent_string: 'Mozilla/5.0 (iPad2,4; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/K93aAP (gzip)'
- family: 'iPad2,4'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad2,4'
- user_agent_string: 'Mozilla/5.0 (iPad2,5; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/P105AP (gzip)'
- family: 'iPad2,5'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad2,5'
- user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 6_1_2 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B147 [FBAN/FBIOS;FBAV/6.2;FBBV/228172;FBDV/iPad2,6;FBMD/iPad;FBSN/iPhone OS;FBSV/6.1.2;FBSS/1; FBCR/Carrier;FBID/tablet;FBLC/en_US;FBOP/1]'
- family: 'iPad2,6'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad2,6'
- user_agent_string: 'Mozilla/5.0 (iPad2,7; iOS 7.0.3) FreeWheelAdManager/5.8.3-r10206-201309100316;com.vevo.iphone VEVO/6025'
- family: 'iPad2,7'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad2,7'
- user_agent_string: 'Mozilla/5.0 (iPad3,1; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/J1AP (gzip)'
- family: 'iPad3,1'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad3,1'
- user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 [FBAN/FBIOS;FBAV/5.4.2;FBBV/114387;FBDV/iPad3,2;FBMD/iPad;FBSN/iPhone OS;FBSV/5.1.1;FBSS/2; FBCR/Carrier;FBID/tablet;FBLC/en_US]'
- family: 'iPad3,2'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad3,2'
- user_agent_string: 'Mozilla/5.0 (iPad3,4; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/P101AP (gzip)'
- family: 'iPad3,4'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad3,4'
- user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A8426 [FBAN/FBIOS;FBAV/7.0.0.17.1;FBBV/1325030;FBDV/iPad3,5;FBMD/iPad;FBSN/iPhone OS;FBSV/6.0.1;FBSS/2; FBCR/AT&T;FBID/tablet;FBLC/en_US;FBOP/1]'
- family: 'iPad3,5'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad3,5'
- user_agent_string: 'Mozilla/5.0 (iPad3,6; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/P103AP (gzip)'
- family: 'iPad3,6'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad3,6'
- user_agent_string: 'Mozilla/5.0 (iPad4,1; iPad; U; CPU OS 7_0_6 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/J71AP (gzip)'
- family: 'iPad4,1'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad4,1'
- user_agent_string: 'Mozilla/5.0 (iPad4,2; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/J72AP (gzip)'
- family: 'iPad4,2'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad4,2'
- user_agent_string: 'Mozilla/5.0 (iPad4,4; iPad; U; CPU OS 7_0_4 like Mac OS X; de_DE) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/J85AP (gzip)'
- family: 'iPad4,4'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad4,4'
- user_agent_string: 'Mozilla/5.0 (iPad4,5; iOS 7.0.4) FreeWheelAdManager/5.3.0-r9485-201301220720;com.cnn.iphone CNN/4622'
- family: 'iPad4,5'
+ family: 'iPad'
brand: 'Apple'
model: 'iPad4,5'
- user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1 like Mac OS X; HW iPhone1,1; de_de) AppleWebKit/525.18.1 (KHTML, like Gecko) (AdMob-iSDK-20090617)'
- family: 'iPhone1,1'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone1,1'
- user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone 4_2_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7E18 Grindr/1.8.5 (iPhone1,2/4.2.1)'
- family: 'iPhone1,2'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone1,2'
- user_agent_string: 'Mozilla/5.0 (iPhone2,1; iOS 4.3.5) FreeWheelAdManager/4.6.5-r8099-201204100535;com.vevo.iphone VEVO/5661'
- family: 'iPhone2,1'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone2,1'
- user_agent_string: 'Mozilla/5.0 (iPhone3,1; iOS 6.1.3) FreeWheelAdManager/5.3.0-r9485-201301220720;com.cnn.iphone CNN/4254'
- family: 'iPhone3,1'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone3,1'
- user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A523 [FBAN/FBIOS;FBAV/5.5;FBBV/123337;FBDV/iPhone3,2;FBMD/iPhone;FBSN/iPhone OS;FBSV/6.0.1;FBSS/2; FBCR/o2-de;FBID/phone;FBLC/de_DE;FBOP/0]'
- family: 'iPhone3,2'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone3,2'
- user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 [FBAN/FBIOS;FBAV/5.2.2;FBBV/82131;FBDV/iPhone3,3;FBMD/iPhone;FBSN/iPhone OS;FBSV/5.1.1;FBSS/2; FBCR/Verizon;FBID/phone;FBLC/de_DE]'
- family: 'iPhone3,3'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone3,3'
- user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 [FBAN/FBIOS;FBAV/8.0.0.28.18;FBBV/1665515;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/7.0.4;FBSS/2; FBCR/Telekom.de;FBID/phone;FBLC/de_DE;FBOP/5]'
- family: 'iPhone4,1'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone4,1'
- user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A405 [FBAN/FBIOS;FBAV/6.8;FBBV/745892;FBDV/iPhone5,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/6.0;FBSS/2; FBCR/Carrier;FBID/phone;FBLC/en_US;FBOP/5]'
- family: 'iPhone5,1'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone5,1'
- user_agent_string: 'Mozilla/5.0 (iPhone5,2; iOS 7.0.3) FreeWheelAdManager/5.8.3-r10206-201309100316;com.vevo.iphone VEVO/5987'
- family: 'iPhone5,2'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone5,2'
- user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11A466 [FBAN/FBIOS;FBAV/6.7.2;FBBV/603804;FBDV/iPhone5,3;FBMD/iPhone;FBSN/iPhone OS;FBSV/7.0;FBSS/2; FBCR/o2-de;FBID/phone;FBLC/es_ES;FBOP/5]'
- family: 'iPhone5,3'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone5,3'
- user_agent_string: 'Mozilla/5.0 (iPhone5,4; iPhone; U; CPU OS 7_0_5 like Mac OS X; de_AT) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/N49AP (gzip)'
- family: 'iPhone5,4'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone5,4'
- user_agent_string: 'Mozilla/5.0 (iPhone6,1; iPhone; U; CPU OS 7_0_4 like Mac OS X; ar_SA) com.google.GooglePlus/29676 (KHTML, like Gecko) Mobile/N51AP (gzip)'
- family: 'iPhone6,1'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone6,1'
- user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 [FBAN/FBIOS;FBAV/7.0.0.17.1;FBBV/1325030;FBDV/iPhone6,2;FBMD/iPhone;FBSN/iPhone OS;FBSV/7.0.6;FBSS/2; FBCR/Telekom.de;FBID/phone;FBLC/de_DE;FBOP/5]'
- family: 'iPhone6,2'
+ family: 'iPhone'
brand: 'Apple'
model: 'iPhone6,2'
- user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone 4_2_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7E18 Grindr/1.8.5 (iPod2,1/4.2.1)'
- family: 'iPod2,1'
+ family: 'iPod'
brand: 'Apple'
model: 'iPod2,1'
- user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone 5_1_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7E18 Grindr/1.8.8 (iPod3,1/5.1.1)'
- family: 'iPod3,1'
+ family: 'iPod'
brand: 'Apple'
model: 'iPod3,1'
- user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone 6_1_3 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7E18 Grindr/1.8.8 (iPod4,1/6.1.3)'
- family: 'iPod4,1'
+ family: 'iPod'
brand: 'Apple'
model: 'iPod4,1'
- user_agent_string: 'Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11A4449d [FBAN/FBIOS;FBAV/6.4;FBBV/290891;FBDV/iPod5,1;FBMD/iPod touch;FBSN/iPhone OS;FBSV/7.0;FBSS/2; FBCR/;FBID/phone;FBLC/de_DE;FBOP/1]'
- family: 'iPod5,1'
+ family: 'iPod'
brand: 'Apple'
model: 'iPod5,1'
@@ -11405,6 +11485,56 @@ test_cases:
brand: 'Generic_Android'
model: 'S300'
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 2.1-update1; Ar-kw; EQ U8110) AppleWebKit/530.17 (KHTML, Like Gecko) Version/4.0 Mobile Safari/530.17'
+ family: 'EQ U8110'
+ brand: 'Generic_Android'
+ model: 'EQ U8110'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 2.1-update1; Cs-cz; Zt180) AppleWebKit/530.17 (KHTML, Like Gecko) Version/4.0 Mobile Safari/530.17'
+ family: 'Zt180'
+ brand: 'Generic_Android'
+ model: 'Zt180'
+
+ - user_agent_string: 'Mozilla 5.0 (Linux; U; Android 2.2.1; zh-cn; 3GC101) UC AppleWebKit 534.31 (KHTML, like Gecko) Mobile Safari 534.31'
+ family: '3GC101'
+ brand: 'Generic_Android'
+ model: '3GC101'
+
+ - user_agent_string: 'Mozilla 5.0 (Linux; U; Android 2.3.1; zh-cn; Newpad-K97) UC AppleWebKit 534.31 (KHTML, like Gecko) Mobile Safari 534.31'
+ family: 'Newpad-K97'
+ brand: 'Generic_Android'
+ model: 'Newpad-K97'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.0.3; -; PP4MT-7) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30'
+ family: 'PP4MT-7'
+ brand: 'Generic_Android'
+ model: 'PP4MT-7'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.0.3; -; PP4MT-9) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
+ family: 'PP4MT-9'
+ brand: 'Generic_Android'
+ model: 'PP4MT-9'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 2.2.1; id; AD350) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 UCBrowser/8.7.0.315 Ponsel'
+ family: 'AD350'
+ brand: 'Generic_Android'
+ model: 'AD350'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 2.2.1; -us; Ally) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'
+ family: 'Ally'
+ brand: 'Generic_Android'
+ model: 'Ally'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 2.3.4; A9100) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31 OPR/14.0.1074.57768'
+ family: 'A9100'
+ brand: 'Generic_Android'
+ model: 'A9100'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 2.3.3; S300) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.123 Mobile Safari/537.22 OPR/14.0.1025.53005'
+ family: 'S300'
+ brand: 'Generic_Android'
+ model: 'S300'
+
- user_agent_string: 'Mozilla/5.0 (DTV) NetFront/3.4 InettvBrowser/2.2 (08001F;DTV03VSFC;0002;0001)'
family: 'Inettv'
brand: 'Generic_Inettv'
@@ -22715,6 +22845,11 @@ test_cases:
brand: 'Huawei'
model: 'P6'
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MHC19Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.89 Mobile Safari/537.36'
+ family: 'Huawei Nexus 6P'
+ brand: 'Huawei'
+ model: 'Nexus 6P'
+
- user_agent_string: 'Huaweisymantecspider (compatible; MSIE 8.0; DSE-support@huaweisymantec.com)'
family: 'Huawei symantecspider'
brand: 'Huawei'
@@ -58000,6 +58135,16 @@ test_cases:
brand: 'Samsung'
model: 'GT-S8600-ORANGE'
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.0.0; SM-G9500) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36'
+ family: 'Samsung SM-G9500'
+ brand: 'Samsung'
+ model: 'SM-G9500'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.0.0; SAMSUNG SM-G9500 Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/9.3 Chrome/67.0.3396.87 Mobile Safari/537.36'
+ family: 'Samsung SM-G9500'
+ brand: 'Samsung'
+ model: 'SM-G9500'
+
- user_agent_string: 'UCWEB/2.0 (Symbian; U; S60 V5; Pt-BR; SamsungI8910) U2/1.0.0 UCBrowser/8.9.0.277 U2/1.0.0 Mobile'
family: 'Samsung I8910'
brand: 'Samsung'
@@ -77360,6 +77505,41 @@ test_cases:
brand: 'XiaoMi'
model: 'MI-ONE Plus'
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; HM 2A Build/KTU84Q) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/42.0.0.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.1.1'
+ family: 'XiaoMi HM 2A'
+ brand: 'XiaoMi'
+ model: 'HM 2A'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; HM NOTE 1LTE Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.1.1'
+ family: 'XiaoMi HM NOTE 1LTE'
+ brand: 'XiaoMi'
+ model: 'HM NOTE 1LTE'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 5.0.2; zh-cn; MI NOTE Pro Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/42.0.0.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.1.1'
+ family: 'XiaoMi MI NOTE Pro'
+ brand: 'XiaoMi'
+ model: 'MI NOTE Pro'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.2; Redmi Note 2 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile Safari/537.36 ssy={Android;ECalendar;V6.1.8;xiaomi;101181501;WIFI}'
+ family: 'XiaoMi Redmi Note 2'
+ brand: 'XiaoMi'
+ model: 'Redmi Note 2'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 8.0.0; zh-cn; MIX Build/OPR1.170623.032) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.1.1'
+ family: 'XiaoMi MIX'
+ brand: 'XiaoMi'
+ model: 'MIX'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 9; MIX 2S Build/PKQ1.180729.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.7.3'
+ family: 'XiaoMi MIX 2S'
+ brand: 'XiaoMi'
+ model: 'MIX 2S'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 8.0.0; zh-cn; MIX 2 Build/OPR1.170623.027) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.1.1'
+ family: 'XiaoMi MIX 2'
+ brand: 'XiaoMi'
+ model: 'MIX 2'
+
- user_agent_string: 'Mozilla/5.0 (Linux; Android 4.1.1; XOLO A1000 Build/JRO03C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'
family: 'Xolo A1000'
brand: 'Xolo'
@@ -79705,6 +79885,16 @@ test_cases:
brand: 'Spider'
model: 'Desktop'
+ - user_agent_string: 'Mozilla/5.0 (compatible; Yeti/1.1; +http://naver.me/spd)'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
+ - user_agent_string: 'Mozilla/5.0 (compatible; Daum/4.1; +http://cs.daum.net/faq/15/4118.html?faqId=28966)'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
- user_agent_string: 'NewsGator FetchLinks extension/0.2.0 (http://graemef.com)'
family: 'Spider'
brand: 'Spider'
@@ -79744,3 +79934,273 @@ test_cases:
family: 'Generic Smartphone'
brand: 'Generic'
model: 'Smartphone'
+
+ - user_agent_string: 'Roku/DVP-6.2 (096.02E06005A)'
+ family: 'Roku'
+ brand: 'Generic_Inettv'
+ model: 'Roku'
+
+ - user_agent_string: 'Roku/DVP-5.0 (025.00E08043A)'
+ family: 'Roku'
+ brand: 'Generic_Inettv'
+ model: 'Roku'
+
+ - user_agent_string: 'Roku/DVP-5.1 (025.01E01195A)'
+ family: 'Roku'
+ brand: 'Generic_Inettv'
+ model: 'Roku'
+
+ - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; MI PAD MIUI/KXFCNBF2.0)'
+ family: 'XiaoMi MI PAD'
+ brand: 'XiaoMi'
+ model: 'MI PAD'
+
+ - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; MI PAD MIUI/KXFCNBF3.0)'
+ family: 'XiaoMi MI PAD'
+ brand: 'XiaoMi'
+ model: 'MI PAD'
+
+ - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; MI PAD MIUI/KXFCNBF5.0)'
+ family: 'XiaoMi MI PAD'
+ brand: 'XiaoMi'
+ model: 'MI PAD'
+
+ - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/4.11.28)'
+ family: 'XiaoMi MI PAD'
+ brand: 'XiaoMi'
+ model: 'MI PAD'
+
+ - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/4.12.19)'
+ family: 'XiaoMi MI PAD'
+ brand: 'XiaoMi'
+ model: 'MI PAD'
+
+ - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/4.8.22)'
+ family: 'XiaoMi MI PAD'
+ brand: 'XiaoMi'
+ model: 'MI PAD'
+
+ - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/5.1.16)'
+ family: 'XiaoMi MI PAD'
+ brand: 'XiaoMi'
+ model: 'MI PAD'
+
+ - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/5.1.23)'
+ family: 'XiaoMi MI PAD'
+ brand: 'XiaoMi'
+ model: 'MI PAD'
+
+ - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/5.1.9)'
+ family: 'XiaoMi MI PAD'
+ brand: 'XiaoMi'
+ model: 'MI PAD'
+
+ - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/5.10.22)'
+ family: 'XiaoMi MI PAD'
+ brand: 'XiaoMi'
+ model: 'MI PAD'
+
+ - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/5.10.8)'
+ family: 'XiaoMi MI PAD'
+ brand: 'XiaoMi'
+ model: 'MI PAD'
+
+ - user_agent_string: 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; MI PAD MIUI/5.11.1)'
+ family: 'XiaoMi MI PAD'
+ brand: 'XiaoMi'
+ model: 'MI PAD'
+
+ - user_agent_string: 'Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen WebAppManager Safari/537.41'
+ family: 'LG Web0S SmartTV'
+ brand: 'LG'
+ model: 'Web0S SmartTV'
+
+ - user_agent_string: 'Mozilla/5.0+(iPhone;+CPU+iPhone+OS+9_3_1+like+Mac+OS+X)+AppleWebKit/601.1.46+(KHTML,+like+Gecko)+Version/9.0+Mobile/13E238+Safari/601.1'
+ family: 'iPhone'
+ brand: 'Apple'
+ model: 'iPhone'
+
+ - user_agent_string: 'Mozilla/5.0+(iPad;+CPU+OS+9_3_1+like+Mac+OS+X)+AppleWebKit/601.1.46+(KHTML,+like+Gecko)+Version/9.0+Mobile/13E238+Safari/601.1'
+ family: 'iPad'
+ brand: 'Apple'
+ model: 'iPad'
+
+ - user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 10_0_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Mobile/14A456 [FBAN/FBIOS;FBAV/68.0.0.49.70;FBBV/41924288;FBRV/0;FBDV/iPad4,1;FBMD/iPad;FBSN/iOS;FBSV/10.0.2;FBSS/2;FBCR/;FBID/tablet;FBLC/en_US;FBOP/5]'
+ family: 'iPad'
+ brand: 'Apple'
+ model: 'iPad4,1'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 530) like Gecko BingPreview/1.0b'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Smartphone'
+
+ - user_agent_string: 'Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
+ - user_agent_string: 'Slack-ImgProxy 1.136 (+https://api.slack.com/robots)'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
+ - user_agent_string: 'Mozilla/5.0 (SMART-TV; Linux; Tizen 2.3) AppleWebkit/538.1 (KHTML, like Gecko) SamsungBrowser/1.0 TV Safari/538.1'
+ family: 'Samsung SMART-TV'
+ brand: 'Samsung'
+ model: 'SMART-TV'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; ATH-AL00 Build/HONORATH-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.124 Mobile Safari/537.36 JsKit/1.0 (Android) SohuNews/5.7.3 BuildCode/113'
+ family: 'Huawei ATH-AL00'
+ brand: 'Huawei'
+ model: 'ATH-AL00'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; ONEPLUS A3010 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36'
+ family: 'OnePlus ONEPLUS A3010'
+ brand: 'OnePlus'
+ model: 'ONEPLUS A3010'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.1.1; ONE E1003 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.91 Mobile Safari/537.36'
+ family: 'OnePlus ONE E1003'
+ brand: 'OnePlus'
+ model: 'ONE E1003'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.1.0; Pixel Build/OPM1.171019.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36'
+ family: 'Pixel'
+ brand: 'Google'
+ model: 'Pixel'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; Pixel C Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Safari/537.36'
+ family: 'Pixel C'
+ brand: 'Google'
+ model: 'Pixel C'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.1; Pixel XL Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36'
+ family: 'Pixel XL'
+ brand: 'Google'
+ model: 'Pixel XL'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.125 Mobile Safari/537.36'
+ family: 'Pixel 2'
+ brand: 'Google'
+ model: 'Pixel 2'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0; RCT6773W22B Build/LRX21M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.85'
+ family: 'RCT6773W22B'
+ brand: 'RCA'
+ model: 'RCT6773W22B'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.2; RCA G1 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36'
+ family: 'RCA G1'
+ brand: 'RCA'
+ model: 'G1'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.2; SC-01F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.105 Mobile Safari/537.36'
+ family: 'Samsung SC-01F'
+ brand: 'Samsung'
+ model: 'SC-01F'
+
+ - user_agent_string: 'WhatsApp/2.17.70 W'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
+ - user_agent_string: 'masscan/1.0 (https://github.com/robertdavidgraham/masscan)'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
+ - user_agent_string: 'MobileSafari/602.1 CFNetwork/808.1.4 Darwin/16.1.0'
+ family: 'iOS-Device'
+ brand: 'Apple'
+ model: 'iOS-Device'
+
+ - user_agent_string: 'Safari/12602.2.14.0.7 CFNetwork/807.1.3 Darwin/16.1.0 (x86_64)'
+ family: 'Mac'
+ brand: 'Apple'
+ model: 'Mac'
+
+ - user_agent_string: 'netbarrierd/572 CFNetwork/673.5 Darwin/13.4.0 (x86_64) (MacBookPro11%2C1)'
+ family: 'MacBookPro11,1'
+ brand: 'Apple'
+ model: 'MacBookPro11,1'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; EVA-AL10 Build/HUAWEIEVA-AL10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36'
+ family: 'EVA-AL10'
+ brand: 'Huawei'
+ model: 'EVA-AL10'
+
+ - user_agent_string: 'Google Web Preview'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google Web Preview) Chrome/27.0 .1453 Safari/537.36.'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
+ - user_agent_string: 'Mozilla/5.0 (compatible; Qwantify/2.4w; +https://www.qwant.com/)/2.4w'
+ family: 'Spider'
+ brand: 'Spider'
+ model: 'Desktop'
+
+ - user_agent_string: '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'
+ family: 'Lumia 920'
+ brand: 'Nokia'
+ model: 'Lumia 920'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 5.1; zh-cn; Build/LMY47D ) AppleWebKit/534.30 (KHTML,like Gecko) Version/5.1 Mobile Safari/534.30 GIONEE-GN3003/GN3003 RV/5.0.16 GNBR/5.1.0.cg Id/8D83E4532006ACCE31D712F4F73C8C70'
+ family: 'Gionee GN3003'
+ brand: 'Gionee'
+ model: 'GN3003'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone## CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Mobile/14C92'
+ family: 'iPhone'
+ brand: 'Apple'
+ model: 'iPhone'
+
+ - user_agent_string: 'Mozilla/5.0 (Android) ownCloud-android/2.0.0'
+ family: 'Generic Smartphone'
+ brand: 'Generic'
+ model: 'Smartphone'
+
+ - user_agent_string: 'Outlook-iOS/665.29827.prod.iphone (2.63.0)'
+ family: 'iPhone'
+ brand: 'Apple'
+ model: 'iPhone'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; LG-TP260 Build/NRD90U; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 Instagram 33.0.0.11.92 Android (24/7.0; 320dpi; 720x1193; LGE/lge; LG-TP260; lv517; lv517; en_US; 93117667)'
+ family: 'LG-TP260'
+ brand: 'LG'
+ model: 'TP260'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_5 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D60 Instagram 33.0.0.11.96 (iPhone9,3; iOS 11_2_5; en_AU; en-AU; scale=2.00; gamut=wide; 750x1334)'
+ family: 'iPhone'
+ brand: 'Apple'
+ model: 'iPhone9,3'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D100 Flipboard/4.2.2'
+ family: 'iPhone'
+ brand: 'Apple'
+ model: 'iPhone'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G610F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36 Flipboard/4.1.9/4323,4.1.9.4323'
+ family: 'Samsung SM-G610F'
+ brand: 'Samsung'
+ model: 'SM-G610F'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G930F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 Onefootball/Android/9.10.6'
+ family: 'Samsung SM-G930F'
+ brand: 'Samsung'
+ model: 'SM-G930F'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-A520F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 Flipboard-Briefing/2.7.28'
+ family: 'Samsung SM-A520F'
+ brand: 'Samsung'
+ model: 'SM-A520F'
diff --git a/tests/test_os.yaml b/tests/test_os.yaml
index 61f53541..047737e4 100644
--- a/tests/test_os.yaml
+++ b/tests/test_os.yaml
@@ -1,5 +1,26 @@
test_cases:
+ - user_agent_string: 'atc/1.0 watchOS/5.1.3 model/Watch3,4 hwp/t8004 build/16S535 (6; dt:156)'
+ family: 'WatchOS'
+ major: '5'
+ minor: '1'
+ patch: '3'
+ patch_minor:
+
+ - user_agent_string: 'atc/1.0 watchOS/5.2 model/Watch4,4 hwp/t8006 build/16T225 (6; dt:193)'
+ family: 'WatchOS'
+ major: '5'
+ minor: '2'
+ patch:
+ patch_minor:
+
+ - user_agent_string: '(null)/(null) watchOS/5.1.1 model/Watch3,3 hwp/t8004 build/16R600 (6; dt:155)'
+ family: 'WatchOS'
+ major: '5'
+ minor: '1'
+ patch: '1'
+ patch_minor:
+
- user_agent_string: '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'
family: 'Android'
major:
@@ -245,6 +266,13 @@ test_cases:
patch: '2'
patch_minor:
+ - user_agent_string: 'Mozilla/5.0 (iPod touch; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69'
+ family: 'iOS'
+ major: '9'
+ minor: '3'
+ patch: '2'
+ patch_minor:
+
- user_agent_string: 'MQQBrowser/371 Mozilla/5.0 (iPhone 4S; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A523 Safari/7534.48.3'
family: 'iOS'
major: '6'
@@ -371,6 +399,13 @@ test_cases:
patch:
patch_minor:
+ - user_agent_string: 'MacOutlook/16.12.0.180401 (Intelx64 Mac OS X Version 10.12.6 (build 16G29))'
+ family: 'Mac OS X'
+ major: '10'
+ minor: '12'
+ patch: '6'
+ patch_minor:
+
- user_agent_string: 'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13'
family: 'MeeGo'
major:
@@ -413,6 +448,20 @@ test_cases:
patch:
patch_minor:
+ - user_agent_string: 'Mozilla/5.0 (X11; Datanyze; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+ family: 'Linux'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google Web Preview) Chrome/27.0 .1453 Safari/537.36.'
+ family: 'Linux'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
- user_agent_string: 'Bunjalloo/0.7.6(Nintendo DS;U;en)'
family: 'Other'
major:
@@ -715,99 +764,120 @@ test_cases:
patch_minor:
- user_agent_string: 'ICE Browser/5.05 (Java 1.4.0; Windows 2000 5.0 x86)'
- family: 'Windows 2000'
- major:
+ family: 'Windows'
+ major: '2000'
minor:
patch:
patch_minor:
- user_agent_string: 'NCSA_Mosaic/2.0 (Windows 3.1)'
- family: 'Windows 3.1'
- major:
+ family: 'Windows'
+ major: '3.1'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko'
- family: 'Windows 10'
- major:
+ family: 'Windows'
+ major: '10'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'
- family: 'Windows 10'
- major:
+ family: 'Windows'
+ major: '10'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows NT 6.4; Trident/7.0; rv:11.0) like Gecko'
- family: 'Windows 10'
- major:
+ family: 'Windows'
+ major: '10'
minor:
patch:
patch_minor:
- user_agent_string: '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'
- family: 'Windows 10'
- major:
+ family: 'Windows'
+ major: '10'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows NT 6.4; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0'
- family: 'Windows 10'
- major:
+ family: 'Windows'
+ major: '10'
minor:
patch:
patch_minor:
- - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
- family: 'Windows 8.1'
- major:
+ - user_agent_string: 'PAN GlobalProtect/4.1.2-11 (Microsoft Windows 10 Pro , 64-bit)'
+ family: 'Windows'
+ major: '10'
minor:
patch:
patch_minor:
- - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; ARM; WOW64; Trident/7.0; rv:11.0) like Gecko'
- family: 'Windows RT 8.1'
- major:
+ - user_agent_string: 'PAN GlobalProtect/5.0.0-87 (Microsoft Windows 10 Pro , 64-bit) Mozilla/5.0 (Windows NT 6.2; Win64; x64; Trident/7.0; rv:11.0) like Gecko'
+ family: 'Windows'
+ major: '10'
minor:
patch:
patch_minor:
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
+ family: 'Windows'
+ major: '8'
+ minor: '1'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; ARM; WOW64; Trident/7.0; rv:11.0) like Gecko'
+ family: 'Windows'
+ major: 'RT 8'
+ minor: '1'
+ patch:
+ patch_minor:
+
- user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.17) Gecko/20110414 Thunderbird/3.1.10 ThunderBrowse/3.3.5'
- family: 'Windows 7'
- major:
+ family: 'Windows'
+ major: '7'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Thunderbird/45.0'
+ family: 'Windows'
+ major: '7'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.3a1) Gecko/20100208 MozillaDeveloperPreview/3.7a1 (.NET CLR 3.5.30729)'
- family: 'Windows 7'
- major:
+ family: 'Windows'
+ major: '7'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) FireWeb/1.0.0.0'
- family: 'Windows 7'
- major:
+ family: 'Windows'
+ major: '7'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 6.1; zh_CN) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0 baidubrowser/1.x Safari/534.7'
- family: 'Windows 7'
- major:
+ family: 'Windows'
+ major: '7'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.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; baidubrowser 1.x)'
- family: 'Windows 7'
- major:
+ family: 'Windows'
+ major: '7'
minor:
patch:
patch_minor:
@@ -841,85 +911,85 @@ test_cases:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'
- family: 'Windows 8'
- major:
+ family: 'Windows'
+ major: '8'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)'
- family: 'Windows RT'
- major:
+ family: 'Windows'
+ major: 'RT'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; chromeframe; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)'
- family: 'Windows Vista'
- major:
+ family: 'Windows'
+ major: 'Vista'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.17) Gecko/20110414 Lightning/1.0b3pre Thunderbird/3.1.10'
- family: 'Windows XP'
- major:
+ family: 'Windows'
+ major: 'XP'
minor:
patch:
patch_minor:
- user_agent_string: 'Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.5.24 Version/10.53'
- family: 'Windows XP'
- major:
+ family: 'Windows'
+ major: 'XP'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; BOLT/2.101) AppleWebKit/530 (KHTML, like Gecko) Version/4.0 Safari/530.17'
- family: 'Windows XP'
- major:
+ family: 'Windows'
+ major: 'XP'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; chromeframe; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; Sleipnir 2.8.5)3.0.30729)'
- family: 'Windows XP'
- major:
+ family: 'Windows'
+ major: 'XP'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; chromeframe; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)'
- family: 'Windows XP'
- major:
+ family: 'Windows'
+ major: 'XP'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6; .NET CLR 2.0.50727; .NET CLR 1.1.4322)'
- family: 'Windows XP'
- major:
+ family: 'Windows'
+ major: 'XP'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) RockMelt/0.8.34.841 Chrome/6.0.472.63 Safari/534.3'
- family: 'Windows XP'
- major:
+ family: 'Windows'
+ major: 'XP'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Comodo_Dragon/4.1.1.11 Chrome/4.1.249.1042 Safari/532.5'
- family: 'Windows XP'
- major:
+ family: 'Windows'
+ major: 'XP'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20110407 Firefox/4.0.3 PaleMoon/4.0.3'
- family: 'Windows XP'
- major:
+ family: 'Windows'
+ major: 'XP'
minor:
patch:
patch_minor:
@@ -932,8 +1002,8 @@ test_cases:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Win 9x 4.90; PL; rv:1.7.5) Gecko/20041217'
- family: 'Windows ME'
- major:
+ family: 'Windows'
+ major: 'ME'
minor:
patch:
patch_minor:
@@ -973,6 +1043,13 @@ test_cases:
patch:
patch_minor:
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Sailfish 3.0; Mobile; rv:45.0) Gecko/45.0 Firefox/45.0 SailfishBrowser/1.0'
+ family: 'Sailfish'
+ major: '3'
+ minor: '0'
+ patch:
+ patch_minor:
+
# up market model
- user_agent_string: 'HbbTV/1.1.1 (;Samsung;SmartTV2013;T-FXPDEUC-1102.2;;) WebKit'
family: 'Samsung'
@@ -1053,6 +1130,13 @@ test_cases:
patch: '4'
patch_minor:
+ - user_agent_string: 'DAVdroid/1.9.2-gplay (2017/11/04; dav4android; okhttp3) Android/7.1.2'
+ family: 'Android'
+ major: '7'
+ minor: '1'
+ patch: '2'
+ patch_minor:
+
- user_agent_string: 'Mozilla/5.0 (SymbianOS 9.4; Series60/5.0 NokiaN97-1/10.0.012; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) WicKed/7.1.12344'
family: 'Symbian OS'
major: '9'
@@ -1628,106 +1712,106 @@ test_cases:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows U; Win NT 5.0; en-US; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2'
- family: 'Windows NT'
- major:
+ family: 'Windows'
+ major: 'NT'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; N; WinNT; en-US; m14) Netscape6/6.0b1,gzip(gfe),gzip(gfe),gzip(gfe)'
- family: 'Windows NT'
- major:
+ family: 'Windows'
+ major: 'NT'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Win 9x 4.90; de; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7'
- family: 'Windows ME'
- major:
+ family: 'Windows'
+ major: 'ME'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Win 9x 4.90; en-CA; rv:0.9.4.1) Gecko/20020314 Netscape6/6.2.2'
- family: 'Windows ME'
- major:
+ family: 'Windows'
+ major: 'ME'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Win16; en-US; rv:1.7) Safari/85.5'
- family: 'Windows 3.1'
- major:
+ family: 'Windows'
+ major: '3.1'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Win3.1; en-US; rv:1.0.0) Gecko/20020530'
- family: 'Windows 3.1'
- major:
+ family: 'Windows'
+ major: '3.1'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Win3.11; en-US; rv:21.56.11.90) Gecko/20500230 Firefox/3.5'
- family: 'Windows 3.1'
- major:
+ family: 'Windows'
+ major: '3.1'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Win32; rv:1.6),gzip(gfe),gzip(gfe),gzip(gfe)'
- family: 'Windows 95'
- major:
+ family: 'Windows'
+ major: '95'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Win95; en-GB; rv:1.0.1) Gecko/20020823 Netscape/7.0'
- family: 'Windows 95'
- major:
+ family: 'Windows'
+ major: '95'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; Win95; en-GB; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8'
- family: 'Windows 95'
- major:
+ family: 'Windows'
+ major: '95'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Windows; U; WindowsCE 5.2; en-US; rv:1.9.2a2pre) Gecko/20090904 Fennec/1.0a3'
- family: 'Windows CE'
- major:
+ family: 'Windows'
+ major: 'CE'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (WindowsCE 6.0; rv:2.0.1) Gecko Firefox/5.0.1'
- family: 'Windows CE'
- major:
+ family: 'Windows'
+ major: 'CE'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (WindowsCE 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 SeaMonkey/2.1.1'
- family: 'Windows CE'
- major:
+ family: 'Windows'
+ major: 'CE'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (WindowsCE 6.0; rv:2.1.1) Gecko/ Firefox/5.0.1'
- family: 'Windows CE'
- major:
+ family: 'Windows'
+ major: 'CE'
minor:
patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (WindowsCE; rv:4.0) Gecko/20120320 Firefox/4.0'
- family: 'Windows CE'
- major:
+ family: 'Windows'
+ major: 'CE'
minor:
patch:
patch_minor:
@@ -2026,6 +2110,41 @@ test_cases:
patch:
patch_minor:
+ - user_agent_string: 'App/1.0.0 CFNetwork/894 Darwin/17.4.0'
+ family: 'iOS'
+ major: '11'
+ minor: '2'
+ patch: '6'
+ patch_minor:
+
+ - user_agent_string: 'App/1.0.0 CFNetwork/897.15 Darwin/17.5.0'
+ family: 'iOS'
+ major: '11'
+ minor: '3'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'App/1.0.0 CFNetwork/901.1 Darwin/17.6.0'
+ family: 'iOS'
+ major: '11'
+ minor: '4'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'App/1.0.0 CFNetwork/902.2 Darwin/17.7.0'
+ family: 'iOS'
+ major: '11'
+ minor: '4'
+ patch: '1'
+ patch_minor:
+
+ - user_agent_string: 'App/1.0.0 CFNetwork/958.1 Darwin/18.0.0'
+ family: 'iOS'
+ major: '12'
+ minor: '0'
+ patch:
+ patch_minor:
+
- user_agent_string: 'Mozilla/5.0 (iPhone; CPU 7_0_6 like Mac OS X; en_GB) AppleWebKit (KHTML, like Gecko) Mobile [OKMagazine/4.0.1 (iOS/7.0.6)] [LiteApps]'
family: 'iOS'
major: '7'
@@ -2123,3 +2242,572 @@ test_cases:
minor:
patch:
patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/18.0 Firefox/26.0'
+ family: 'Firefox OS'
+ major: '1'
+ minor: '0'
+ patch: '1'
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/18.1 Firefox/26.0'
+ family: 'Firefox OS'
+ major: '1'
+ minor: '1'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/26.0 Firefox/26.0'
+ family: 'Firefox OS'
+ major: '1'
+ minor: '2'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/28.0 Firefox/26.0'
+ family: 'Firefox OS'
+ major: '1'
+ minor: '3'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/30.0 Firefox/26.0'
+ family: 'Firefox OS'
+ major: '1'
+ minor: '4'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/32.0 Firefox/26.0'
+ family: 'Firefox OS'
+ major: '2'
+ minor: '0'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/34.0 Firefox/26.0'
+ family: 'Firefox OS'
+ major: '2'
+ minor: '1'
+ patch:
+ patch_minor:
+
+ # Test generic Firefox OS matching
+ - user_agent_string: 'Mozilla/5.0 (Mobile; rv:26.0) Gecko/11.0 Firefox/26.0'
+ family: 'Firefox OS'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'TestApp/1.0 CFNetwork/758.0.2 Darwin/15.0.0'
+ family: 'iOS'
+ major: '9'
+ minor: '0'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'TestApp/1.0 CFNetwork/758.3.15 Darwin/15.4.0'
+ family: 'iOS'
+ major: '9'
+ minor: '3'
+ patch: '1'
+ patch_minor:
+
+ - user_agent_string: 'TestApp/1.0 CFNetwork/758.4.3 Darwin/15.5.0'
+ family: 'iOS'
+ major: '9'
+ minor: '3'
+ patch: '2'
+ patch_minor:
+
+ - user_agent_string: 'TestApp/1.0 CFNetwork/758.5.3 Darwin/15.6.0'
+ family: 'iOS'
+ major: '9'
+ minor: '3'
+ patch: '5'
+ patch_minor:
+
+ - user_agent_string: 'TestApp/1.0 CFNetwork/808.0.2 Darwin/16.0.0'
+ family: 'iOS'
+ major: '10'
+ minor: '0'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'TestApp/1.0 CFNetwork/808.1.4 Darwin/16.1.0'
+ family: 'iOS'
+ major: '10'
+ minor: '1'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'TestApp/1.0 CFNetwork/808.2.16 Darwin/16.3.0'
+ family: 'iOS'
+ major: '10'
+ minor: '2'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'App/1.0.0 CFNetwork/808.3 Darwin/16.3.0'
+ family: 'iOS'
+ major: '10'
+ minor: '2'
+ patch: '1'
+ patch_minor:
+
+ - user_agent_string: 'TestApp-tvOS/1.0-1'
+ family: 'tvOS'
+ major: '1'
+ minor: '0'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Roku/DVP-6.2 (096.02E06005A)'
+ family: 'Roku'
+ major: '6'
+ minor: '2'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Roku/DVP-5.0 (025.00E08043A)'
+ family: 'Roku'
+ major: '5'
+ minor: '0'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Roku/DVP-5.1 (025.01E01195A)'
+ family: 'Roku'
+ major: '5'
+ minor: '1'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen WebAppManager Safari/537.41'
+ family: 'Web0S'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0+(iPhone;+CPU+iPhone+OS+9_3_1+like+Mac+OS+X)+AppleWebKit/601.1.46+(KHTML,+like+Gecko)+Version/9.0+Mobile/13E238+Safari/601.1'
+ family: 'iOS'
+ major: '9'
+ minor: '3'
+ patch: '1'
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0+(iPad;+CPU+OS+9_3_1+like+Mac+OS+X)+AppleWebKit/601.1.46+(KHTML,+like+Gecko)+Version/9.0+Mobile/13E238+Safari/601.1'
+ family: 'iOS'
+ major: '9'
+ minor: '3'
+ patch: '1'
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (SMART-TV; Linux; Tizen 2.3) AppleWebkit/538.1 (KHTML, like Gecko) SamsungBrowser/1.0 TV Safari/538.1'
+ family: 'Tizen'
+ major: '2'
+ minor: '3'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Deezer/4.8.2 (iOS; 7.1; Mobile; de)'
+ family: 'iOS'
+ major: '7'
+ minor: '1'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (iOS; U; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/19.0'
+ family: 'iOS'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'UCWEB/2.0 (iOS; U; iPd OS 7_0_4; zh-CN; iPd5,1) U2/1.0.0 UCBrowser/9.0.1.284 U2/1.0.0 Mobile'
+ family: 'iOS'
+ major: '7'
+ minor: '0'
+ patch: '4'
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU IPhone OS 8_1_3 Like Mac OS X) AppleWebKit/600.1.4 (KHTML, Like Gecko) CriOS/43.0.2357.61 Mobile/12B466 Safari/600.1.4'
+ family: 'iOS'
+ major: '8'
+ minor: '1'
+ patch: '3'
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU IPhone OS 9_2_1 Like Mac OS X) AppleWebKit/601.1.46 (KHTML, Like Gecko) Mobile/13D15 [FBAN/FBIOS;FBAV/52.0.0.46.157;FBBV/26424168;FBDV/iPhone6,2;FBMD/iPhone;FBSN/iPhone OS;FBSV/9.2.1;FBSS/2; FBCR/Globe;FBID/phone;FBLC/en_US;FBOP/5]'
+ family: 'iOS'
+ major: '9'
+ minor: '2'
+ patch: '1'
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.84 Safari/537.36 CrKey/1.22.74257'
+ family: 'Chromecast'
+ major: '1'
+ minor: '22'
+ patch: '74257'
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_4 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) Outlook-iOS-Android/1.0 Mobile/13G35 Safari/601.1.46")'
+ family: 'iOS'
+ major: '9'
+ minor: '3'
+ patch: '4'
+ patch_minor:
+
+ - user_agent_string: 'Zendesk for iPhone 1.2.1 (4395)'
+ family: 'iOS'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0+(Macintosh;+Intel+Mac+OS+X+10_11_6)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/52.0.2743.116+Safari/537.36'
+ family: 'Mac OS X'
+ major: '10'
+ minor: '11'
+ patch: '6'
+ patch_minor:
+
+ - user_agent_string: 'Safari/12602.2.14.0.7 CFNetwork/807.1.3 Darwin/16.1.0 (x86_64)'
+ family: 'Mac OS X'
+ major: '10'
+ minor: '12'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Box Sync/4.0.7848;Darwin/10.13;i386/64bit'
+ family: 'Mac OS X'
+ major: '10'
+ minor: '13'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Box/1.2.93;Darwin/10.13;i386/64bit'
+ family: 'Mac OS X'
+ major: '10'
+ minor: '13'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) BoxNotes/1.3.0 Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36'
+ family: 'Mac OS X'
+ major: '10'
+ minor: '13'
+ patch: '0'
+ patch_minor:
+
+ - user_agent_string: 'Box Sync/4.0.7848;Windows/8.1;x86 Family 6 Model 158 Stepping 9, GenuineIntel/32bit'
+ family: 'Windows'
+ major: '8.1'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Box Sync/4.0.7848;Windows/10;Intel64 Family 6 Model 158 Stepping 9, GenuineIntel/64bit'
+ family: 'Windows'
+ major: '10'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) BoxNotes/1.3.0 Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36'
+ family: 'Windows'
+ major: '8'
+ minor: '1'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) BoxNotes/1.3.0 Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36'
+ family: 'Windows'
+ major: '10'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Box/1.2.93;Windows/10;Intel64 Family 6 Model 158 Stepping 9, GenuineIntel/64bit'
+ family: 'Windows'
+ major: '10'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows) mirall/2.3.2 (build 1) (Nextcloud)'
+ family: 'Windows'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux) mirall/2.3.2 (Nextcloud)'
+ family: 'Linux'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Android) ownCloud-android/2.0.0'
+ family: 'Android'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'MyApp/1.0 CFNetwork/811.4.18 Darwin/16.5.0'
+ family: 'iOS'
+ major: '10'
+ minor: '3'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'MyApp/1.0 CFNetwork/811.5.4 Darwin/16.6.0'
+ family: 'iOS'
+ major: '10'
+ minor: '3'
+ patch: '2'
+ patch_minor:
+
+ - user_agent_string: 'MyApp/1.0 CFNetwork/811.5.4 Darwin/16.7.0'
+ family: 'iOS'
+ major: '10'
+ minor: '3'
+ patch: '3'
+ patch_minor:
+
+ - user_agent_string: 'MyApp/1.0 CFNetwork/887 Darwin/17.0.0'
+ family: 'iOS'
+ major: '11'
+ minor: '0'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'MyApp/1.0 CFNetwork/889.9 Darwin/17.2.0'
+ family: 'iOS'
+ major: '11'
+ minor: '1'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'MyApp/1.0 CFNetwork/893.10 Darwin/17.3.0'
+ family: 'iOS'
+ major: '11'
+ minor: '2'
+ patch:
+ patch_minor:
+
+
+ - user_agent_string: 'MyApp/1.0 CFNetwork/893.13.1 Darwin/17.3.0 (x86_64)'
+ family: 'Mac OS X'
+ major: '10'
+ minor: '13'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Outlook-iOS/665.29827.prod.iphone (2.63.0)'
+ family: 'iOS'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; LG-TP260 Build/NRD90U; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 Instagram 33.0.0.11.92 Android (24/7.0; 320dpi; 720x1193; LGE/lge; LG-TP260; lv517; lv517; en_US; 93117667)'
+ family: 'Android'
+ major: '7'
+ minor: '0'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_5 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D60 Instagram 33.0.0.11.96 (iPhone9,3; iOS 11_2_5; en_AU; en-AU; scale=2.00; gamut=wide; 750x1334)'
+ family: 'iOS'
+ major: '11'
+ minor: '2'
+ patch: '5'
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D100 Flipboard/4.2.2'
+ family: 'iOS'
+ major: '11'
+ minor: '2'
+ patch: '6'
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G610F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36 Flipboard/4.1.9/4323,4.1.9.4323'
+ family: 'Android'
+ major: '7'
+ minor: '0'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G930F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 Onefootball/Android/9.10.6'
+ family: 'Android'
+ major: '7'
+ minor: '0'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-A520F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 Flipboard-Briefing/2.7.28'
+ family: 'Android'
+ major: '7'
+ minor: '0'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Wget/1.18 (linux-gnu)'
+ family: 'Linux'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Wget/1.18 (freebsd10.3)'
+ family: 'FreeBSD'
+ major: '10'
+ minor: '3'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2'
+ family: 'Red Hat'
+ major:
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'SalesforceMobileSDK/5.3.0 android mobile/8.0.0 (SM-G955F) Salesforce1/15.2 Native uid_c4589f605fad8c7e ftr_ Cordova/6.2.3'
+ family: 'Android'
+ major: '8'
+ minor: '0'
+ patch: '0'
+ patch_minor:
+
+ - user_agent_string: 'SalesforceMobileSDK/5.3.0 android mobile/7.0 (SM-G955U) Salesforce1/15.2 Native uid_4ec4068eddf27447 ftr_ Cordova/6.2.3'
+ family: 'Android'
+ major: '7'
+ minor: '0'
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'SalesforceMobileSDK/5.3.0 android mobile/9 (SM-G955U) Salesforce1/15.2 Native uid_4ec4068eddf27447 ftr_ Cordova/6.2.3'
+ family: 'Android'
+ major: '9'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 9; Pixel Build/PPP3.180510.008) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.81 Mobile Safari/537.36'
+ family: 'Android'
+ major: '9'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Windows aarch64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp'
+ family: 'Chrome OS'
+ major: '10718'
+ minor: '88'
+ patch: '2'
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Windows x86_64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp'
+ family: 'Chrome OS'
+ major: '10718'
+ minor: '88'
+ patch: '2'
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 CitrixChromeApp'
+ family: 'Windows'
+ major: '10'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'ViaFree-DK/3.8.3 (com.MTGx.ViaFree.dk; build:7383; iOS 12.1.0) Alamofire/4.7.0'
+ family: 'iOS'
+ major: '12'
+ minor: '1'
+ patch: '0'
+ patch_minor:
+
+ - user_agent_string: 'Viafree-tvOS-DK/3.7.1 (com.MTGx.ViaFree.dk; build:7341; tvOS 12.1.0) Alamofire/4.7.0'
+ family: 'tvOS'
+ major: '12'
+ minor: '1'
+ patch: '0'
+ patch_minor:
+
+ - user_agent_string: 'iTunes/12.7.1 (Windows; Microsoft Windows 7 Ultimate Edition Service Pack 1 (Build 7601)) AppleWebKit/7604.3005.2001.1'
+ family: 'Windows'
+ major: '7'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'iTunes/12.1.3 (Windows; Microsoft Windows XP Professional Service Pack 3 (Build 2600)) AppleWebKit/7600.1017.9000.3'
+ family: 'Windows'
+ major: 'XP'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'iTunes/12.1.3 (Windows; Microsoft Windows Vista Business Edition Service Pack 2 (Build 6002)) AppleWebKit/7600.1017.9000.3 '
+ family: 'Windows'
+ major: 'Vista'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 5.01; Windows 98; Linux 3.3.8-3.3) [Netgem; 7.7.01-51; i-Player; netbox; sezmi_totalgem]'
+ family: 'Windows'
+ major: '98'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/2.0 (compatible; MSIE 3.0; Windows 3.1)'
+ family: 'Windows'
+ major: '3.1'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 4.0; rv:52.0) Gecko/20100101 Firefox/52.0'
+ family: 'Windows'
+ major: 'NT'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 5.0; Windows ME) Opera 5.11 [de]'
+ family: 'Windows'
+ major: 'ME'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Microsoft Internet Explorer/1.0 (Windows 95)'
+ family: 'Windows'
+ major: '95'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows CE,BrailleNote; IEMobile 7.11)'
+ family: 'Windows'
+ major: 'CE'
+ minor:
+ patch:
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows 2000; U) Opera 7.0 [en]'
+ family: 'Windows'
+ major: '2000'
+ minor:
+ patch:
+ patch_minor:
diff --git a/tests/test_ua.yaml b/tests/test_ua.yaml
index 5172ba70..b7f01509 100644
--- a/tests/test_ua.yaml
+++ b/tests/test_ua.yaml
@@ -1,4 +1,16 @@
test_cases:
+
+ - user_agent_string: 'atc/1.0 watchOS/5.1.3 model/Watch3,4 hwp/t8004 build/16S535 (6; dt:156)'
+ family: 'Apple Watch App'
+ major: '3'
+ minor: '4'
+ patch:
+
+ - user_agent_string: 'atc/1.0 watchOS/5.2 model/Watch4,4 hwp/t8006 build/16T225 (6; dt:193)'
+ family: 'Apple Watch App'
+ major: '4'
+ minor: '4'
+ patch:
- user_agent_string: 'Mozilla/5.0 (Windows; U; en-US) AppleWebKit/531.9 (KHTML, like Gecko) AdobeAIR/2.5.1'
family: 'AdobeAIR'
@@ -146,9 +158,9 @@ test_cases:
- user_agent_string: 'Mozilla/5.0 (BB10; Touch) AppleWebKit/537.3+ (KHTML, like Gecko) Version/10.0.9.388 Mobile Safari/537.3+'
family: 'BlackBerry WebKit'
- major:
- minor:
- patch:
+ major: '10'
+ minor: '0'
+ patch: '9'
- user_agent_string: 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/0.0.1 Safari/534.8+'
family: 'BlackBerry WebKit'
@@ -192,35 +204,65 @@ test_cases:
minor: '8'
patch: '5'
+ - user_agent_string: 'Mozilla/5.0 (compatible; Windows NT 6.1; Catchpoint) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36'
+ family: 'Catchpoint'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (compatible; Windows NT 6.1; Catchpoint bot) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36'
+ family: 'Catchpoint bot'
+ major:
+ minor:
+ patch:
+
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; chromeframe/11.0.660.0)'
family: 'Chrome Frame'
major: '11'
minor: '0'
patch: '660'
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Nexus 5X Build/N2G47W; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36'
+ family: 'Chrome Mobile WebView'
+ major: '58'
+ minor: '0'
+ patch: '3029'
+ patch_minor: '83'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.4; SHV31 Build/S2280) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36'
+ family: 'Chrome Mobile WebView'
+ major: '33'
+ minor: '0'
+ patch: '0'
+ patch_minor: '0'
+
- user_agent_string: 'Mozilla/5.0 (Linux; Android 4.2; Galaxy Nexus Build/JOP40C) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'
family: 'Chrome Mobile'
major: '18'
minor: '0'
patch: '1025'
+ patch_minor: '166'
- user_agent_string: 'Mozilla/5.0 (Linux; Android 4.1.1; SPH-L710 Build/JRO03L) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'
family: 'Chrome Mobile'
major: '18'
minor: '0'
patch: '1025'
+ patch_minor: '166'
- user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 5 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.122 Mobile Safari/537.36'
family: 'Chrome Mobile'
major: '35'
minor: '0'
patch: '1916'
+ patch_minor: '122'
- user_agent_string: 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.648.133 Chrome/10.0.648.133 Safari/534.16'
family: 'Chromium'
major: '10'
minor: '0'
patch: '648'
+ patch_minor: '133'
- user_agent_string: 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Comodo_Dragon/4.1.1.11 Chrome/4.1.249.1042 Safari/532.5'
family: 'Comodo Dragon'
@@ -264,6 +306,24 @@ test_cases:
minor:
patch:
+ - user_agent_string: 'Firefox/11.0 (via ggpht.com GoogleImageProxy)'
+ family: 'GmailImageProxy'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Twitterbot/1.0'
+ family: 'TwitterBot'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'WhatsApp/2.17.70 W'
+ family: 'WhatsApp'
+ major: '2'
+ minor: '17'
+ patch: '70'
+
- user_agent_string: 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.1pre) Gecko/20090717 Ubuntu/9.04 (jaunty) Shiretoko/3.5.1pre'
family: 'Firefox (Shiretoko)'
major: '3'
@@ -462,8 +522,14 @@ test_cases:
minor: '0'
patch: '2'
+ - user_agent_string: 'Mozilla/5.0 (iPod touch; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69'
+ family: 'Mobile Safari UI/WKWebView'
+ major: '9'
+ minor: '3'
+ patch: '2'
+
- user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257'
- family: 'Mobile Safari'
+ family: 'Mobile Safari UI/WKWebView'
major: '7'
minor: '1'
patch: '2'
@@ -634,7 +700,7 @@ test_cases:
family: 'Opera Mini'
major: '5'
minor: '1'
- patch:
+ patch: '191'
- user_agent_string: 'Opera/9.80 (Series 60; Opera Mini/6.24455/25.677; U; fr) Presto/2.5.25 Version/10.54'
family: 'Opera Mini'
@@ -646,8 +712,32 @@ test_cases:
family: 'Opera Mini'
major: '7'
minor: '0'
+ patch: '31437'
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (S60; SymbOS; Opera Mobi/23.348; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '9'
+ minor: '80'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (J2ME/22.478; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '9'
+ minor: '80'
patch:
+ - user_agent_string: 'Opera/9.80 (J2ME/MIDP; Opera Mini/9 (Compatible; MSIE:9.0; iPhone; BlackBerry9700; AppleWebKit/24.746; U; en) Presto/2.5.25 Version/10.54'
+ family: 'Opera Mini'
+ major: '9'
+ minor:
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (Android; Opera Mini/7.6.35766/35.5706; U; en) Presto/2.8.119 Version/11.10'
+ family: 'Opera Mini'
+ major: '7'
+ minor: '6'
+ patch: '35766'
+
- user_agent_string: 'Opera/9.80 (S60; SymbOS; Opera Mobi/275; U; es-ES) Presto/2.4.13 Version/10.00'
family: 'Opera Mobile'
major: '10'
@@ -678,7 +768,7 @@ test_cases:
minor: '53'
patch:
- - user_agent_string: 'User agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.20 Safari/537.36 OPR/15.0.1147.18 (Edition Next)'
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.20 Safari/537.36 OPR/15.0.1147.18 (Edition Next)'
family: 'Opera'
major: '15'
minor: '0'
@@ -727,11 +817,29 @@ test_cases:
patch: '2'
- user_agent_string: 'Mozilla/5.0 (Windows NT 5.1; rv:2.0) Gecko/20110407 Firefox/4.0.3 PaleMoon/4.0.3'
- family: 'Pale Moon (Firefox Variant)'
+ family: 'Pale Moon'
major: '4'
minor: '0'
patch: '3'
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:3.0) Goanna/20170207 PaleMoon/27.1.0'
+ family: 'Pale Moon'
+ major: '27'
+ minor: '1'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:3.0) Gecko/20100101 Goanna/20170207 PaleMoon/27.1.0'
+ family: 'Pale Moon'
+ major: '27'
+ minor: '1'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:45.9) Gecko/20100101 Goanna/3.0 Firefox/45.9 PaleMoon/27.1.0'
+ family: 'Pale Moon'
+ major: '27'
+ minor: '1'
+ patch: '0'
+
- user_agent_string: 'Mozilla/5.0 (LG-T500 AppleWebkit/531 Browser/Phantom/V2.0 Widget/LGMW/3.0 MMS/LG-MMS-V1.0/1.2 Java/ASVM/1.1 Profile/MIDP-2.1 Configuration/CLDC-1.1)'
family: 'Phantom Browser'
major: '2'
@@ -744,6 +852,24 @@ test_cases:
minor: '4'
patch:
+ - user_agent_string: 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34'
+ family: 'PingdomBot'
+ major: '0'
+ minor: '8'
+ patch: '5'
+
+ - user_agent_string: 'NewRelicPinger/1.0 (1025794)'
+ family: 'NewRelicPingerBot'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/98 Safari/537.4 (StatusCake)'
+ family: 'StatusCakeBot'
+ major:
+ minor:
+ patch:
+
- user_agent_string: 'Mozilla/3.0 (Planetweb/2.100 JS SSL US; Dreamcast US)'
family: 'Planetweb'
major: '2'
@@ -823,10 +949,10 @@ test_cases:
patch: '5'
- user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 Lightning/2.6.4'
- family: 'Lightning'
- major: '2'
- minor: '6'
- patch: '4'
+ family: 'Thunderbird'
+ major: '24'
+ minor: '2'
+ patch: '0'
- user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0'
family: 'Thunderbird'
@@ -834,6 +960,60 @@ test_cases:
minor: '2'
patch: '0'
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Thunderbird/45.0'
+ family: 'Thunderbird'
+ major: '45'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:7.0.1) Gecko/20151105 Postbox/4.0.8'
+ family: 'Postbox'
+ major: '4'
+ minor: '0'
+ patch: '8'
+
+ - user_agent_string: 'Mozilla/4.0 (compatible; Lotus-Notes/6.0; Windows-NT)'
+ family: 'Lotus Notes'
+ major: '6'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'YahooMobileMail/1.0 (Android Mail; 1.3.10) (supersonic;HTC;PC36100;2.3.5/GRJ90)'
+ family: 'YahooMobileMail'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Barca/2.8.2'
+ family: 'Barca'
+ major: '2'
+ minor: '8'
+ patch: '2'
+
+ - user_agent_string: 'BarcaPro/1.4.12'
+ family: 'Barca'
+ major: '1'
+ minor: '4'
+ patch: '12'
+
+ - user_agent_string: 'The Bat! 4.0.0.22'
+ family: 'The Bat!'
+ major: '4'
+ minor: '0'
+ patch: '0'
+
+ - user_agent_string: 'MailBar/1.3.2 (Mac OS X Version 10.11.1 (Build 15B42))'
+ family: 'MailBar'
+ major: '1'
+ minor: '3'
+ patch: '2'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) kmail2/4.14.2 Safari/534.34'
+ family: 'kmail2'
+ major: '4'
+ minor: '14'
+ patch: '2'
+
- user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; MSOffice 12)'
family: 'Outlook'
major: '2007'
@@ -853,7 +1033,7 @@ test_cases:
patch:
- user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.14 (KHTML, like Gecko)'
- family: 'AppleMail'
+ family: 'Apple Mail'
major: '536'
minor: '26'
patch: '14'
@@ -870,6 +1050,42 @@ test_cases:
minor: '0'
patch: '6'
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.45.0 Safari/537.36'
+ family: 'Whale'
+ major: '1'
+ minor: '3'
+ patch: '45'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.50.3 Safari/537.36'
+ family: 'Whale'
+ major: '1'
+ minor: '3'
+ patch: '50'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Whale/0.9.1.679 Mobile/15D100 Safari/604.5.6'
+ family: 'Whale'
+ major: '0'
+ minor: '9'
+ patch: '1'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Whale/0.9.5.0 Mobile Safari/537.36'
+ family: 'Whale'
+ major: '0'
+ minor: '9'
+ patch: '5'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Nexus 6P Build/WHALE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.50.3 Mobile Safari/537.36 sidebar webpanel'
+ family: 'Whale'
+ major: '1'
+ minor: '3'
+ patch: '50'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Nexus 6P Build/WHALE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.220 Whale/1.3.50.3 Mobile Safari/537.36'
+ family: 'Whale'
+ major: '1'
+ minor: '3'
+ patch: '50'
+
- user_agent_string: 'J2ME/UCWEB7.0.3.45/139/7682'
family: 'UC Browser'
major: '7'
@@ -882,6 +1098,18 @@ test_cases:
minor: '4'
patch: '0'
+ - user_agent_string: 'UCWEB/3.0 (iPhone; CPU OS_6; en-US)AppleWebKit/534.1 U3/3.0.0 Mobile'
+ family: 'UC Browser'
+ major: '3'
+ minor: '0'
+ patch: '0'
+
+ - user_agent_string: 'UCWEB/2.0 (Linux; U; Opera Mini/7.1.32052/30.2697; en-US; GT-S5302) U2/1.0.0 UCBrowser/9.3.0.440 Mobile'
+ family: 'UC Browser'
+ major: '9'
+ minor: '3'
+ patch: '0'
+
- user_agent_string: 'IUC(U;iOS 5.1.1;Zh-cn;320*480;)/UCWEB7.9.0.94/41/997'
family: 'UC Browser'
major: '7'
@@ -906,6 +1134,12 @@ test_cases:
minor: '7'
patch: '0'
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 UBrowser/5.7.14488.1025 Safari/537.36'
+ family: 'UC Browser'
+ major: '5'
+ minor: '7'
+ patch: '14488'
+
- user_agent_string: 'Alcatel-OH5/1.0 UP.Browser/6.1.0.7.7 (GUI) MMP/1.0'
family: 'UP.Browser'
major: '6'
@@ -1142,14 +1376,14 @@ test_cases:
family: 'Opera Mini'
major: '4'
minor: '2'
- patch:
+ patch: '14812'
patch_minor:
- user_agent_string: 'SAMSUNG-SGH-A897/A897UCJC1; Mozilla/5.0 (Profile/MIDP-2.0 Configuration/CLDC-1.1; Opera Mini/att/4.2.15304; U; fr-US) Opera 9.50'
family: 'Opera Mini'
major: '4'
minor: '2'
- patch:
+ patch: '15304'
patch_minor:
- user_agent_string: 'MQQBrowser/39 Mozilla/5.0 (iPhone 4S; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A523 Safari/7534.48.3'
@@ -1286,164 +1520,164 @@ test_cases:
patch_minor:
- user_agent_string: 'Safari/6533.18.5 CFNetwork/454.9.8 Darwin/10.4.0 (i386) (MacBookPro7,1)'
- family: 'CFNetwork'
- major: '454'
- minor: '9'
- patch: '8'
+ family: 'Safari'
+ major: '6533'
+ minor: '18'
+ patch: '5'
patch_minor:
- user_agent_string: 'Safari/7536.30.1 CFNetwork/520.5.1 Darwin/11.4.2 (i386) (MacBook3,1)'
- family: 'CFNetwork'
- major: '520'
- minor: '5'
+ family: 'Safari'
+ major: '7536'
+ minor: '30'
patch: '1'
patch_minor:
- user_agent_string: 'Reader Notifier/5 CFNetwork/596.3.3 Darwin/12.3.0 (x86_64) (MacBookPro7,1)'
- family: 'CFNetwork'
- major: '596'
- minor: '3'
- patch: '3'
+ family: 'Reader Notifier'
+ major: '5'
+ minor:
+ patch:
patch_minor:
- user_agent_string: 'Safari/9537.71 CFNetwork/673.0.2 Darwin/13.0.1 (x86_64) (MacBookPro11,1)'
- family: 'CFNetwork'
- major: '673'
- minor: '0'
- patch: '2'
+ family: 'Safari'
+ major: '9537'
+ minor: '71'
+ patch:
patch_minor:
- user_agent_string: 'DEPoker-iPad/1.0.2 CFNetwork/548.1.4 Darwin/11.0.0'
- family: 'CFNetwork'
- major: '548'
- minor: '1'
- patch: '4'
+ family: 'DEPoker'
+ major: '1'
+ minor: '0'
+ patch: '2'
patch_minor:
- user_agent_string: 'JDSports-iPad/1.1 CFNetwork/672.0.8 Darwin/14.0.0'
- family: 'CFNetwork'
- major: '672'
- minor: '0'
- patch: '8'
+ family: 'JDSports'
+ major: '1'
+ minor: '1'
+ patch:
patch_minor:
- user_agent_string: 'AngryBirdsBlack-iPhone/1.1.0 CFNetwork/548.1.4 Darwin/11.0.0'
- family: 'CFNetwork'
- major: '548'
+ family: 'AngryBirdsBlack'
+ major: '1'
minor: '1'
- patch: '4'
+ patch: '0'
patch_minor:
- user_agent_string: 'Bing for iPad/1.1.2 CFNetwork/485.13.9 Darwin/11.0.0'
- family: 'CFNetwork'
- major: '485'
- minor: '13'
- patch: '9'
+ family: 'Bing for iPad'
+ major: '1'
+ minor: '1'
+ patch: '2'
patch_minor:
- user_agent_string: 'NightstandPaid-iPad/1.3.1 CFNetwork/548.1.4 Darwin/11.0.0'
- family: 'CFNetwork'
- major: '548'
- minor: '1'
- patch: '4'
+ family: 'NightstandPaid'
+ major: '1'
+ minor: '3'
+ patch: '1'
patch_minor:
- user_agent_string: 'Glo-De-iPad/1.4.7 CFNetwork/672.0.2 Darwin/14.0.0'
- family: 'CFNetwork'
- major: '672'
- minor: '0'
- patch: '2'
+ family: 'Glo-De'
+ major: '1'
+ minor: '4'
+ patch: '7'
patch_minor:
- user_agent_string: 'Island for iPhone/1.95 CFNetwork/672.0.2 Darwin/14.0.0'
- family: 'CFNetwork'
- major: '672'
- minor: '0'
- patch: '2'
+ family: 'Island for iPhone'
+ major: '1'
+ minor: '95'
+ patch:
patch_minor:
- user_agent_string: 'WormsiPhone-iPad/2.3 CFNetwork/548.1.4 Darwin/11.0.0'
- family: 'CFNetwork'
- major: '548'
- minor: '1'
- patch: '4'
+ family: 'WormsiPhone'
+ major: '2'
+ minor: '3'
+ patch:
patch_minor:
- user_agent_string: 'Rummy LITE iPad/2.3.0 CFNetwork/609.1.4 Darwin/13.0.0'
- family: 'CFNetwork'
- major: '609'
- minor: '1'
- patch: '4'
+ family: 'Rummy LITE iPad'
+ major: '2'
+ minor: '3'
+ patch: '0'
patch_minor:
- user_agent_string: 'MobileRSSFree-iPad/3.1 CFNetwork/467.12 Darwin/10.3.1'
- family: 'CFNetwork'
- major: '467'
- minor: '12'
+ family: 'MobileRSSFree'
+ major: '3'
+ minor: '1'
patch:
patch_minor:
- user_agent_string: 'MobileRSSFree-iPad/3.1.4 CFNetwork/485.13.9 Darwin/11.0.0'
- family: 'CFNetwork'
- major: '485'
- minor: '13'
- patch: '9'
+ family: 'MobileRSSFree'
+ major: '3'
+ minor: '1'
+ patch: '4'
patch_minor:
- user_agent_string: 'babbelIndonesian-iPad/4.0.1 CFNetwork/672.0.8 Darwin/14.0.0'
- family: 'CFNetwork'
- major: '672'
+ family: 'babbelIndonesian'
+ major: '4'
minor: '0'
- patch: '8'
+ patch: '1'
patch_minor:
- user_agent_string: 'WeltMobile-iPad/4.2 CFNetwork/609.1.4 Darwin/13.0.0'
- family: 'CFNetwork'
- major: '609'
- minor: '1'
- patch: '4'
+ family: 'WeltMobile'
+ major: '4'
+ minor: '2'
+ patch:
patch_minor:
- user_agent_string: 'IMPlusFull-iPad/7.9.1 CFNetwork/548.0.4 Darwin/11.0.0'
- family: 'CFNetwork'
- major: '548'
- minor: '0'
- patch: '4'
+ family: 'IMPlusFull'
+ major: '7'
+ minor: '9'
+ patch: '1'
patch_minor:
- user_agent_string: 'Cooliris/1.3 CFNetwork/342.1 Darwin/9.4.1'
- family: 'CFNetwork'
- major: '342'
- minor: '1'
+ family: 'Cooliris'
+ major: '1'
+ minor: '3'
patch:
patch_minor:
- user_agent_string: 'Poof/1.0 CFNetwork/485.12.7 Darwin/10.4.0'
- family: 'CFNetwork'
- major: '485'
- minor: '12'
- patch: '7'
+ family: 'Poof'
+ major: '1'
+ minor: '0'
+ patch:
patch_minor:
- user_agent_string: 'Parking Mania Free/1.9.5.0 CFNetwork/548.0.4 Darwin/11.0.0'
- family: 'CFNetwork'
- major: '548'
- minor: '0'
- patch: '4'
- patch_minor:
+ family: 'Parking Mania Free'
+ major: '1'
+ minor: '9'
+ patch: '5'
+ patch_minor: '0'
- user_agent_string: 'Planet Boing!/1.4.8 CFNetwork/609.1.4 Darwin/13.0.0'
- family: 'CFNetwork'
- major: '609'
- minor: '1'
- patch: '4'
+ family: 'Planet Boing!'
+ major: '1'
+ minor: '4'
+ patch: '8'
patch_minor:
- user_agent_string: 'PlayTube/1.7 CFNetwork/672.0.2 Darwin/14.0.0'
- family: 'CFNetwork'
- major: '672'
- minor: '0'
- patch: '2'
+ family: 'PlayTube'
+ major: '1'
+ minor: '7'
+ patch:
patch_minor:
- user_agent_string: 'Mozilla/5.0 (Linux; U; Android 2.2.1; es-us) AppleWebKit/534.12 (KHTML, like Gecko) Puffin/1.3.2913S Mobile Safari/534.12'
@@ -1575,6 +1809,36 @@ test_cases:
minor: '0'
patch: '1'
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko PTST/1.0'
+ family: 'WebPageTest.org bot'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.0 Safari/537.36 PTST/1.0'
+ family: 'WebPageTest.org bot'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4) Build/MPJ24.139-64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Mobile Safari/537.36 PTST/180521.140508'
+ family: 'WebPageTest.org bot'
+ major: '180521'
+ minor: '140508'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4) Build/MPJ24.139-64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Mobile Safari/537.36 PTST/391'
+ family: 'WebPageTest.org bot'
+ major: '391'
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Datanyze; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+ family: 'Datanyze'
+ major:
+ minor:
+ patch:
+
- user_agent_string: 'CazoodleBot/CazoodleBot-0.1 (CazoodleBot Crawler; http://www.cazoodle.com/cazoodlebot; cazoodlebot@cazoodle.com)'
family: 'CazoodleBot'
major: '0'
@@ -1666,10 +1930,10 @@ test_cases:
patch:
- user_agent_string: 'Argus/2.8.65 CFNetwork/609 Darwin/13.0.0'
- family: 'CFNetwork'
- major:
- minor:
- patch:
+ family: 'Argus'
+ major: '2'
+ minor: '8'
+ patch: '65'
- user_agent_string: 'DoCoMo/2.0 P05A(c100;TB;W24H15) (compatible; BaiduMobaider/1.0; http://www.baidu.jp/spider/)'
family: 'BaiduMobaider'
@@ -2193,6 +2457,33 @@ test_cases:
minor:
patch:
+ - user_agent_string: 'Google Web Preview'
+ family: 'Other'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36'
+ family: 'Chrome'
+ major: '60'
+ minor: '0'
+ patch: '3112'
+ patch_minor: '78'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112 Safari/537.36'
+ family: 'Chrome'
+ major: '60'
+ minor: '0'
+ patch: '3112'
+ patch_minor:
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google Web Preview) Chrome/27.0 .1453 Safari/537.36.'
+ family: 'Chrome'
+ major: '27'
+ minor: '0'
+ patch:
+ patch_minor:
+
- user_agent_string: 'HiddenMarket-1.0-beta (www.hiddenmarket.net/crawler.php)'
family: 'HiddenMarket'
major:
@@ -2476,10 +2767,10 @@ test_cases:
patch:
- user_agent_string: 'RedCarpet/2.1 CFNetwork/672.0.2 Darwin/14.0.0'
- family: 'CFNetwork'
- major: '672'
- minor: '0'
- patch: '2'
+ family: 'RedCarpet'
+ major: '2'
+ minor: '1'
+ patch:
- user_agent_string: 'Riddler (http://riddler.io/about.html)'
family: 'Riddler'
@@ -3711,6 +4002,42 @@ test_cases:
minor: '7'
patch:
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Sailfish 3.0; Mobile; rv:45.0) Gecko/45.0 Firefox/45.0 SailfishBrowser/1.0'
+ family: 'Sailfish Browser'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Sailfish 3.0; Mobile; rv:45.0) Gecko/45.0 Firefox/45.0 SailfishBrowser/1.2.3'
+ family: 'Sailfish Browser'
+ major: '1'
+ minor: '2'
+ patch: '3'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.1; SAMSUNG GT-I9506-ORANGE Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/2.1 Chrome/34.0.1847.76 Mobile Safari/537.36'
+ family: 'Samsung Internet'
+ major: '2'
+ minor: '1'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-T800 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.0 Chrome/38.0.2125.102 Safari/537.36'
+ family: 'Samsung Internet'
+ major: '3'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.1.1; SAMSUNG SM-G920F Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.2 Chrome/38.0.2125.102 Mobile Safari/537.36'
+ family: 'Samsung Internet'
+ major: '3'
+ minor: '2'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-T710 Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.5 Chrome/38.0.2125.102 Safari/537.36'
+ family: 'Samsung Internet'
+ major: '3'
+ minor: '5'
+ patch:
+
- user_agent_string: 'ScSpider/0.2'
family: 'ScSpider'
major: '0'
@@ -4468,7 +4795,7 @@ test_cases:
patch:
- user_agent_string: 'FAST-mSEARCH Crawler 0.1 (bergum@fast.no)'
- family: 'mSEARCH Crawler'
+ family: 'FAST-mSEARCH Crawler'
major: '0'
minor: '1'
patch:
@@ -5721,6 +6048,12 @@ test_cases:
minor:
patch:
+ - user_agent_string: 'NL-Crawler'
+ family: 'NL-Crawler'
+ major:
+ minor:
+ patch:
+
- user_agent_string: 'Mozilla/5.0 (compatible; YoudaoBot-rts/1.0; http://www.youdao.com/help/webmaster/spider/; )'
family: 'YoudaoBot'
major:
@@ -6111,3 +6444,1429 @@ test_cases:
minor:
patch:
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; en-gb) AppleWebKit/418.9.1 (KHTML, like Gecko) SiteCon/8.10.9'
+ family: 'SiteCon'
+ major: '8'
+ minor: '10'
+ patch: '9'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4'
+ family: 'Firefox iOS'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (iPad; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) FxiOS/1.0 Mobile/12F69 Safari/600.1.4'
+ family: 'Firefox iOS'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Spotify/1.0.9.133 Safari/537.36'
+ family: 'Spotify'
+ major: '1'
+ minor: '0'
+ patch: '9'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Spotify/1.0.9.133 Safari/537.36'
+ family: 'Spotify'
+ major: '1'
+ minor: '0'
+ patch: '9'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Spotify/1.0.4.90 Safari/537.36'
+ family: 'Spotify'
+ major: '1'
+ minor: '0'
+ patch: '4'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Spotify/1.0.3.101 Safari/537.36'
+ family: 'Spotify'
+ major: '1'
+ minor: '0'
+ patch: '3'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Spotify/1.0.8.59 Safari/537.36'
+ family: 'Spotify'
+ major: '1'
+ minor: '0'
+ patch: '8'
+
+ - user_agent_string: 'Mozilla/5.0 (Android 5.0; Tablet; rv:41.0) Gecko/41.0 Firefox/41.0'
+ family: 'Firefox Mobile'
+ major: '41'
+ minor: '0'
+ patch:
+
+ - user_agent_string: '[FBAN/FB4A;FBAV/3.4;FBBV/258875;FBDM/{density=0.75,width=240,height=320};FBLC/tr_TR;FBCR/o2 - de;FBPN/com.facebook.katana;FBDV/LG-E400;FBSV/2.3.6;]'
+ family: 'Facebook'
+ major: '3'
+ minor: '4'
+ patch:
+
+ - user_agent_string: '[FBAN/FB4A;FBAV/2.3;FBBV/149649;FBDM/{density=1.5,width=480,height=800};FBLC/es_ES;FBCR/;FBPN/com.facebook.katana;FBDV/LG-P920;FBSV/2.2.2;]'
+ family: 'Facebook'
+ major: '2'
+ minor: '3'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; SCH-R720 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 [FBAN/FB4A;FBAV/1.8.1;FBPN/com.facebook.katana;FBDV/SCH-R720;FBSV/2.3.4;FBDM/{density=1.0,width=320,height='
+ family: 'Facebook'
+ major: '1'
+ minor: '8'
+ patch: '1'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.2.2; de-de; 706_v92_jbla_fhd Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 [FB_IAB/FB4A;FBAV/24.0.0.30.15;]'
+ family: 'Facebook'
+ major: '24'
+ minor: '0'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329 [FBAN/FBIOS;FBAV/6.5.1;FBBV/377040;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/6.1.3;FBSS/2; FBCR/Telekom.de;FBID/phone;FBLC/de_DE;'
+ family: 'Facebook'
+ major: '6'
+ minor: '5'
+ patch: '1'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329 [FBAN/FBIOS;FBAV/6.2;FBBV/228172;FBDV/iPhone5,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/6.1.3;FBSS/2; FBCR/o2-de;FBID/phone;FBLC/pt_BR;FBOP/1]'
+ family: 'Facebook'
+ major: '6'
+ minor: '2'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9A334 [FBAN/FBIOS;FBAV/6.5.1;FBBV/377040;FBDV/iPad2,1;FBMD/iPad;FBSN/iPhone OS;FBSV/5.0;FBSS/1; FBCR/;FBID/tablet;FBLC/de_DE;FBOP/1]'
+ family: 'Facebook'
+ major: '6'
+ minor: '5'
+ patch: '1'
+
+ - user_agent_string: 'Mozilla/5.0 (iPad; U; CPU iPhone OS 4_3_2 like Mac OS X; de_DE) AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;FBAV/4.0.2;FBBV/4020.0;FBDV/iPad1,1;FBMD/iPad;FBSN/iPhone OS;FBSV/4.3.2;FBSS/1; FBCR/;FBID/tablet;FBLC/de_DE;FBSF/1.0]'
+ family: 'Facebook'
+ major: '4'
+ minor: '0'
+ patch: '2'
+
+ - user_agent_string: 'Mozilla/5.0 (iPad; U; CPU iPhone OS 4_3_5 like Mac OS X; de_DE) AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;FBAV/4.0.3;FBBV/4030.0;FBDV/iPad2,2;FBMD/iPad;FBSN/iPhone OS;FBSV/4.3.5;FBSS/1; FBCR/Telekom.de;FBID/tablet;FBLC/de_DE;FBS'
+ family: 'Facebook'
+ major: '4'
+ minor: '0'
+ patch: '3'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 [FBAN/FBIOS;FBAV/6.1;FBBV/201075;FBDV/iPhone3,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/5.1.1;FBSS/2; FBCR/Vodafone.de;FBID/phone;FBLC/en_US;FBOP/1]'
+ family: 'Facebook'
+ major: '6'
+ minor: '1'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12D508 [FBAN/GroupsForiOS;FBAV/9.0;FBBV/7752968;FBDV/iPhone7,2;FBMD/iPhone;FBSN/iPhone OS;FBSV/8.2;FBSS/2; FBCR/Telekom.de;FBID/phone;FBLC/de_'
+ family: 'Facebook'
+ major: '9'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; fr_FR) AppleWebKit (KHTML, like Gecko) Mobile [FBAN/FBForIPhone;FBAV/4.0;FBBV/4000.0;FBDV/iPhone1,2;FBMD/iPhone;FBSN/iPhone OS;FBSV/4.1;FBSS/1; FBCR/Carrier;FBID/phone;FBLC/fr_FR;FBSF/1.'
+ family: 'Facebook'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Dalvik/1.2.0 (Linux; U; Android 2.2.2; HTC Desire Build/FRG83G) [FBAN/Orca-Android;FBAV/2.6.1-release;FBLC/de_DE;FBBV/288543;FBCR/o2 - de;FBMF/HTC;FBBD/htc_wwe;FBDV/HTC Desire;FBSV/2.2.2]'
+ family: 'Facebook'
+ major: '2'
+ minor: '6'
+ patch: '1'
+
+ - user_agent_string: '[FBAN/FB4A;FBAV/3.6;FBBV/330148;FBDM/{density=0.75,width=240,height=320};FBLC/de_DE;FBCR/o2 - de;FBPN/com.facebook.katana;FBDV/GT-S5570;FBSV/2.2.1;FBCA/armeabi:unknown;]'
+ family: 'Facebook'
+ major: '3'
+ minor: '6'
+ patch:
+
+ - user_agent_string: '[FBAN/PAAA;FBAV/1.7;FBDM/{density=2.0,width=720,height=1280};FBLC/es_ES;FB_FW/2;FBSN/Android;FBCR/FONIC;FBDV/GT-I9300;FBSV/4.1.2;]'
+ family: 'Facebook'
+ major: '1'
+ minor: '7'
+ patch:
+
+ - user_agent_string: '[FBAN/PAAA;FBAV/1.9;FBDM/{density=2.0,width=720,height=1280};FBLC/de_DE;FB_FW/2;FBSN/Android;FBCR/o2 - de;FBDV/GT-I9300;FBSV/4.3;]'
+ family: 'Facebook'
+ major: '1'
+ minor: '9'
+ patch:
+
+ - user_agent_string: '[FBAN/FB4A;FBAV/130.0.321;FBBV/149649;FBDM/{density=1.5,width=480,height=800};FBLC/es_ES;FBCR/;FBPN/com.facebook.katana;FBDV/LG-P920;FBSV/2.2.2;]'
+ family: 'Facebook'
+ major: '130'
+ minor: '0'
+ patch: '321'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77 [FBAN/FBIOS;FBDV/iPhone10,4;FBMD/iPhone;FBSN/iOS;FBSV/11.4.1;FBSS/2;FBCR/A1;FBID/phone;FBLC/de_DE;FBOP/5;FBRV/122166081]'
+ family: 'Facebook'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Mobile/14D27 [FBAN/MessengerForiOS;FBAV/124.0.0.50.70;FBBV/63293619;FBDV/iPhone7,1;FBMD/iPhone;FBSN/iOS;FBSV/10.2.1;FBSS/3;FBCR/Viettel;FBID/phone;FBLC/vi_VN;FBOP/5;FBRV/0]'
+ family: 'Facebook Messenger'
+ major: '124'
+ minor: '0'
+ patch: '0'
+ patch_minor: '50'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; SM-A910F Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 [FB_IAB/MESSENGER;FBAV/120.0.0.14.84;]'
+ family: 'Facebook Messenger'
+ major: '120'
+ minor: '0'
+ patch: '0'
+ patch_minor: '14'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77 [FBAN/FBIOS;FBAV/194.0.0.38.99;FBBV/127868476;FBDV/iPhone7,2;FBMD/iPhone;FBSN/iOS;FBSV/11.4.1;FBSS/2;FBCR/OrangeBotswana;FBID/phone;FBLC/en_GB;FBOP/5;FBRV/128807018]'
+ family: 'Facebook'
+ major: '194'
+ minor: '0'
+ patch: '0'
+ patch_minor: '38'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B350 [Pinterest/iOS]'
+ family: 'Pinterest'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.2; A3-A11 Build/KOT49H) AppleWebKit/537.36 (KHTML like Gecko) Version/4.0 Chrome/30.0.0.0 Safari/537.36 [Pinterest/Android]'
+ family: 'Pinterest'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A525 [Pinterest/iOS]'
+ family: 'Pinterest'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Pinterest for Android Tablet/1.8.4 (SGP321; 4.3)'
+ family: 'Pinterest'
+ major: '1'
+ minor: '8'
+ patch: '4'
+
+ - user_agent_string: 'Pinterest for Android Tablet/4.3.1 (A7600-H; 4.4.2)'
+ family: 'Pinterest'
+ major: '4'
+ minor: '3'
+ patch: '1'
+
+ - user_agent_string: 'Pinterest for Android/1.1.1 (endeavoru; 4.1.1)'
+ family: 'Pinterest'
+ major: '1'
+ minor: '1'
+ patch: '1'
+
+ - user_agent_string: 'Pinterest for Android/3.6.2 (klte; 4.4.2)'
+ family: 'Pinterest'
+ major: '3'
+ minor: '6'
+ patch: '2'
+
+ - user_agent_string: 'Pinterest/0.1'
+ family: 'Pinterest'
+ major: '0'
+ minor: '1'
+ patch:
+
+ - user_agent_string: 'Pinterest/0.2 (+http://www.pinterest.com/)'
+ family: 'Pinterest'
+ major: '0'
+ minor: '2'
+ patch:
+
+ - user_agent_string: 'Pinterest for Android/1.1.12 (endeavoru; 4.1.1)'
+ family: 'Pinterest'
+ major: '1'
+ minor: '1'
+ patch: '12'
+
+ - user_agent_string: 'Pinterest/3.2 CFNetwork/672.0.8 Darwin/14.0.0'
+ family: 'Pinterest'
+ major: '3'
+ minor: '2'
+ patch:
+
+ - user_agent_string: 'Pinterest/3.3.3 CFNetwork/609.1.4 Darwin/13.0.0'
+ family: 'Pinterest'
+ major: '3'
+ minor: '3'
+ patch: '3'
+
+ - user_agent_string: 'Pinterest/3356 CFNetwork/711.0.6 Darwin/14.0.0'
+ family: 'Pinterest'
+ major: '3356'
+ minor:
+ patch:
+
+ - user_agent_string: 'Pinterest/4.1.3 CFNetwork/672.1.14 Darwin/14.0.0'
+ family: 'Pinterest'
+ major: '4'
+ minor: '1'
+ patch: '3'
+
+ - user_agent_string: 'Pinterest/0.2 (+https://www.pinterest.com/bot.html)'
+ family: 'Pinterestbot'
+ major: '0'
+ minor: '2'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (compatible; Pinterestbot/1.0; +https://www.pinterest.com/bot.html)'
+ family: 'Pinterestbot'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Pinterestbot/1.0; +https://www.pinterest.com/bot.html)'
+ family: 'Pinterestbot'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) qutebrowser/0.2.1 Safari/538.1'
+ family: 'qutebrowser'
+ major: '0'
+ minor: '2'
+ patch: '1'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) pagedraw/0.1.0 Chrome/49.0.2623.75 Electron/0.37.8 Safari/537.36'
+ family: 'Electron'
+ major: '0'
+ minor: '37'
+ patch: '8'
+
+ - user_agent_string: 'Mozilla/5.0 (iPad; U; CPU OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile'
+ family: 'Mobile Safari UI/WKWebView'
+ major: '4'
+ minor: '3'
+ patch: '2'
+
+ - user_agent_string: 'Mozilla/5.0 (iPad; U; CPU OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari'
+ family: 'Mobile Safari'
+ major: '5'
+ minor: '0'
+ patch: '2'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) QupZilla/1.6.3 Safari/538.1'
+ family: 'QupZilla'
+ major: '1'
+ minor: '6'
+ patch: '3'
+
+ - user_agent_string: 'Mozilla/5.0 (OS/2 Warp 4.5) AppleWebKit/537.21 (KHTML, like Gecko) QupZilla/1.6.4 Safari/537.21'
+ family: 'QupZilla'
+ major: '1'
+ minor: '6'
+ patch: '4'
+
+ - user_agent_string: 'Mozilla/5.0 (Unknown; UNIX BSD/SYSV system) AppleWebKit/534.34 (KHTML, like Gecko) QupZilla/1.7.0 Safari/534.34'
+ family: 'QupZilla'
+ major: '1'
+ minor: '7'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) QupZilla/1.6.1 Safari/537.21'
+ family: 'QupZilla'
+ major: '1'
+ minor: '6'
+ patch: '1'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/538.1 (KHTML, like Gecko) Otter/0.9.03 beta 3 Safari/538.1'
+ family: 'Otter'
+ major: '0'
+ minor: '9'
+ patch: '03'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/538.1 (KHTML, like Gecko) Otter/0.9.04'
+ family: 'Otter'
+ major: '0'
+ minor: '9'
+ patch: '04'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) Otter/0.9.04-dev'
+ family: 'Otter'
+ major: '0'
+ minor: '9'
+ patch: '04'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) Otter/0.3.01-dev Safari/538.1'
+ family: 'Otter'
+ major: '0'
+ minor: '3'
+ patch: '01'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) Otter/0.9.03 beta 3 Safari/538.1'
+ family: 'Otter'
+ major: '0'
+ minor: '9'
+ patch: '03'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) Otter/0.9.05'
+ family: 'Otter'
+ major: '0'
+ minor: '9'
+ patch: '05'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; NOKIA; Lumia 930) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Mobile Safari/537.36 Edge/12.0'
+ family: 'Edge Mobile'
+ major: '12'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.11 Chrome/47.0.2526.110 Brave/0.36.5 Safari/537.36'
+ family: 'Brave'
+ major: '0'
+ minor: '7'
+ patch: '11'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.12 Chrome/47.0.2526.110 Brave/0.36.7 Safari/537.36 '
+ family: 'Brave'
+ major: '0'
+ minor: '7'
+ patch: '12'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.7.10 Chrome/47.0.2526.110 Brave/0.36.5 Safari/537.36'
+ family: 'Brave'
+ major: '0'
+ minor: '7'
+ patch: '10'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome Safari/537.36'
+ family: 'HeadlessChrome'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3202.89 Safari/537.36'
+ family: 'HeadlessChrome'
+ major: '62'
+ minor: '0'
+ patch: '3202'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/59.0.3071.109 HeadlessChrome/59.0.3071.109 Safari/537.36'
+ family: 'HeadlessChrome'
+ major: '59'
+ minor: '0'
+ patch: '3071'
+
+ - user_agent_string: 'Roku/DVP-6.2 (096.02E06005A)'
+ family: 'Roku'
+ major: '6'
+ minor: '2'
+ patch:
+
+ - user_agent_string: 'Roku/DVP-5.0 (025.00E08043A)'
+ family: 'Roku'
+ major: '5'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Roku/DVP-5.1 (025.01E01195A)'
+ family: 'Roku'
+ major: '5'
+ minor: '1'
+ patch:
+
+ - user_agent_string: 'Microsoft Office/12.0 (Windows NT 6.1; Microsoft Office Outlook 12.0.6739; Pro)'
+ family: 'Outlook'
+ major: '2007'
+ minor:
+ patch:
+
+ - user_agent_string: 'Microsoft Office/14.0 (Windows NT 6.1; Microsoft Outlook 14.0.5128; Pro)'
+ family: 'Outlook'
+ major: '2010'
+ minor:
+ patch:
+
+ - user_agent_string: 'Microsoft Office/16.0 (Microsoft Outlook Mail 16.0.6525; Pro)'
+ family: 'Outlook'
+ major: '2016'
+ minor:
+ patch:
+
+ - user_agent_string: 'Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.6326; Pro)'
+ family: 'Outlook'
+ major: '2016'
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/8.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Microsoft Outlook 16.0.6366; ms-office; MSOffice 16)'
+ family: 'Outlook'
+ major: '2016'
+ minor:
+ patch:
+
+ - user_agent_string: 'Outlook-Express/7.0 (MSIE 7.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; TmstmpExt)'
+ family: 'Windows Live Mail'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Outlook-Express/7.0 (MSIE 7.0; Windows NT 5.1; Trident/4.0; AskTB5.6; TmstmpExt)'
+ family: 'Windows Live Mail'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Outlook-Express/7.0 (MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; Media Center PC 6.0; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; InfoPath.3; FDM; TmstmpExt)'
+ family: 'Windows Live Mail'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Outlook-Express/7.0 (MSIE 6.0; Windows NT 5.1; SV1; GTB6.3; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.2; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; OfficeLiveConnector.1.3; OfficeLivePatch.0.0; TmstmpExt)'
+ family: 'Windows Live Mail'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Outlook-Express/7.0 (MSIE 8; Windows NT 5.1; Trident/4.0; GTB7.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; TmstmpExt)'
+ family: 'Windows Live Mail'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Outlook-Express/7.0 (MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1; TmstmpExt)'
+ family: 'Windows Live Mail'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Outlook-Express/7.0 (MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; HPDTDF; .NET4.0C; BRI/2; AskTbLOL/5.12.5.17640; TmstmpExt)'
+ family: 'Windows Live Mail'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.0.1; GT-I9505 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 YaBrowser/16.2.1.1239.00 Mobile Safari/537.36'
+ family: 'Yandex Browser'
+ major: '16'
+ minor: '2'
+ patch: '1'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.2; SM-G800F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 MobileIron/1.6.0 Mobile Safari/537.36'
+ family: 'MobileIron'
+ major: '1'
+ minor: '6'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.4.4; GT-I9195I Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Crosswalk/14.43.343.17 Mobile Safari/537.36'
+ family: 'Crosswalk'
+ major: '14'
+ minor: '43'
+ patch: '343'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 6.0.1; Z831 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.94 Mobile Crosswalk/11.45.2454.20160425 Mobile Safari/537.36'
+ family: 'Crosswalk'
+ major: '11'
+ minor: '45'
+ patch: '2454'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A372 Safari Line/7.12.0'
+ family: 'LINE'
+ major: '7'
+ minor: '12'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.1; FTJ152B Build/LMY47D; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/51.0.2704.81 Mobile Safari/537.36 Line/6.4.1'
+ family: 'LINE'
+ major: '6'
+ minor: '4'
+ patch: '1'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 4.1.2; GT-S7710 Build/JZO54K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile'
+ family: 'Chrome Mobile'
+ major: '18'
+ minor: '0'
+ patch: '1025'
+ patch_minor: '166'
+
+ - user_agent_string: 'Mozilla/5.0 (iPad; U; CPU OS 5_1_1 like Mac OS X; en-us) AppleWebKit/534.46.0 (KHTML, like Gecko) Chrome/19.0.1084.60 Mobile/9B206 Safari/7534.48.3'
+ family: 'Chrome Mobile'
+ major: '19'
+ minor: '0'
+ patch: '1084'
+ patch_minor: '60'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 4.4.4; de-de; SM-G850F Build/KTU84P) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16 Chrome/33.0.0.0'
+ family: 'Chrome Mobile WebView'
+ major: '33'
+ minor: '0'
+ patch: '0'
+ patch_minor: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 6.0.1; ru-ru; Redmi 4 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/MiuiBrowser/10.3.6-g'
+ family: 'MiuiBrowser'
+ major: '10'
+ minor: '3'
+ patch: '6'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; U; Android 7.1.2; ru-ru; Redmi 4A Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 XiaoMi/Mint Browser/1.3.3'
+ family: 'Mint Browser'
+ major: '1'
+ minor: '3'
+ patch: '3'
+
+ - user_agent_string: 'Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen WebAppManager Safari/537.41'
+ family: 'Safari'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'MacOutlook/15.27.0.161010 (Intelx64 Mac OS X Version 10.11.6 (Build 15G1108))'
+ family: 'MacOutlook'
+ major: '15'
+ minor: '27'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.8 (KHTML, like Gecko) Slack_SSB/2.0.3'
+ family: 'Slack Desktop Client'
+ major: '2'
+ minor: '0'
+ patch: '3'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) AtomShell/2.6.0 Chrome/56.0.2924.87 Electron/1.6.3 Safari/537.36 MacAppStore/16.5.0 Slack_SSB/2.6.0'
+ family: 'Slack Desktop Client'
+ major: '2'
+ minor: '6'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Slack/2.6.0-beta18998559 Chrome/56.0.2924.87 AtomShell/1.6.3 Safari/537.36 Slack_SSB/2.6.0'
+ family: 'Slack Desktop Client'
+ major: '2'
+ minor: '6'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) HipChat/732 (modern)'
+ family: 'HipChat Desktop Client'
+ major: '732'
+ minor:
+ patch:
+
+ - user_agent_string: 'HipChat Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.7.0 Chrome/49.0.2623.111 Safari/537.36'
+ family: 'HipChat Desktop Client'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Microsoft-CryptoAPI/6.1'
+ family: 'Microsoft-CryptoAPI'
+ major: '6'
+ minor: '1'
+ patch:
+
+ - user_agent_string: 'Microsoft SkyDriveSync 17.3.6517.0809 ship; Windows NT 6.1 Service Pack 1 (7601)'
+ family: 'Microsoft SkyDriveSync'
+ major: '17'
+ minor: '3'
+ patch: '6517'
+
+ - user_agent_string: 'ExchangeServicesClient/14.02.0051.000'
+ family: 'ExchangeServicesClient'
+ major: '14'
+ minor: '02'
+ patch: '0051'
+
+ - user_agent_string: 'Mac OS X/10.11.6 (15G1004); ExchangeWebServices/6.0 (243); Mail/9.3 (3124)'
+ family: 'ExchangeWebServices'
+ major: '6'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0+(iPhone;+CPU+iPhone+OS+9_3_1+like+Mac+OS+X)+AppleWebKit/601.1.46+(KHTML,+like+Gecko)+Version/9.0+Mobile/13E238+Safari/601.1'
+ family: 'Mobile Safari'
+ major: '9'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0+(iPad;+CPU+OS+9_3_1+like+Mac+OS+X)+AppleWebKit/601.1.46+(KHTML,+like+Gecko)+Version/9.0+Mobile/13E238+Safari/601.1'
+ family: 'Mobile Safari'
+ major: '9'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)'
+ family: 'Slackbot-LinkExpanding'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Slack-ImgProxy 1.136 (+https://api.slack.com/robots)'
+ family: 'Slack-ImgProxy'
+ major: '1'
+ minor: '136'
+ patch:
+
+ - user_agent_string: 'okhttp/3.4.2'
+ family: 'okhttp'
+ major: '3'
+ minor: '4'
+ patch: '2'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1300.0 Iron/23.0.1300.0 Safari/537.11'
+ family: 'Iron'
+ major: '23'
+ minor: '0'
+ patch: '1300'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Iron/9.0.600.2 Chrome/9.0.600.2 Safari/534.13'
+ family: 'Iron'
+ major: '9'
+ minor: '0'
+ patch: '600'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2750.0 Iron Safari/537.36'
+ family: 'Iron'
+ major: '52'
+ minor: '0'
+ patch: '2750'
+
+ - user_agent_string: 'Mozilla/5.0 (Android; U; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/23.0'
+ family: 'AdobeAIR'
+ major: '23'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/19.0'
+ family: 'AdobeAIR'
+ major: '19'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (iOS; U; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/19.0'
+ family: 'AdobeAIR'
+ major: '19'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Kurio/3.0.8 Build 65303(Android Kitkat 4.4.4; Phone)'
+ family: 'Kurio App'
+ major: '3'
+ minor: '0'
+ patch: '8'
+
+ - user_agent_string: 'BacaBerita App/5.5.0 (Linux; U; Android 4.4.4; en-us) Mobile Safari'
+ family: 'BacaBerita App'
+ major: '5'
+ minor: '5'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) MxBrowser/4.5.2.2000 Chrome/30.0.1551.0 Safari/537.36'
+ family: 'Maxthon'
+ major: '4'
+ minor: '5'
+ patch: '2'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.5.1000 Chrome/30.0.1599.101 Safari/537.36'
+ family: 'Maxthon'
+ major: '4'
+ minor: '4'
+ patch: '5'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G930P Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 MxBrowser/4.5.10.7000'
+ family: 'Maxthon'
+ major: '4'
+ minor: '5'
+ patch: '10'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.6 (KHTML, like Gecko) Chrome/18.0.1025.133 Safari/537.6 Midori/0.5'
+ family: 'Midori'
+ major: '0'
+ minor: '5'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (iPad; U; CPU like Mac OS X; FIT_LANG_REPLACE) AppleWebKit/532+ (KHTML, like Gecko) Version/3.0 Mobile/1A538b Safari/419.3 Midori/0.4'
+ family: 'Midori'
+ major: '0'
+ minor: '4'
+ patch:
+
+ - user_agent_string: 'curl/7.29.0'
+ family: 'curl'
+ major: '7'
+ minor: '29'
+ patch: '0'
+
+ - user_agent_string: 'Debian APT-HTTP/1.3 (1.0.1ubuntu2)'
+ family: 'Debian APT-HTTP'
+ major: '1'
+ minor: '3'
+ patch:
+
+ - user_agent_string: 'jupdate'
+ family: 'jupdate'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'libcurl-agent/1.0'
+ family: 'libcurl-agent'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'libwww-perl/6.05'
+ family: 'libwww-perl'
+ major: '6'
+ minor: '05'
+ patch:
+
+ - user_agent_string: 'Microsoft-CryptoAPI/6.3'
+ family: 'Microsoft-CryptoAPI'
+ major: '6'
+ minor: '3'
+ patch:
+
+ - user_agent_string: 'OpenBSD ftp'
+ family: 'OpenBSD ftp'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'SophosAgent/1.0 (type= spa )'
+ family: 'SophosAgent'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'SophosUpdateManager/1.5.7.50 SDDS/2.0 (u= EO2ANA123G c= 6342da15-f351-4ab7-9656-3f5f2d50885d )'
+ family: 'SophosUpdateManager'
+ major: '1'
+ minor: '5'
+ patch: '7'
+
+ - user_agent_string: 'Ubuntu APT-HTTP/1.3 (0.7.20.2ubuntu6)'
+ family: 'Ubuntu APT-HTTP'
+ major: '1'
+ minor: '3'
+ patch:
+
+ - user_agent_string: 'urlgrabber/3.10 yum/3.4.3'
+ family: 'urlgrabber'
+ major: '3'
+ minor: '10'
+ patch:
+
+ - user_agent_string: 'urlgrabber/3.9.1 yum/3.2.29'
+ family: 'urlgrabber'
+ major: '3'
+ minor: '9'
+ patch: '1'
+
+ - user_agent_string: 'Wget/1.14 (linux-gnu)'
+ family: 'Wget'
+ major: '1'
+ minor: '14'
+ patch:
+
+ - user_agent_string: 'Windows-Update-Agent/7.9.9600.17729 Client-Protocol/1.21'
+ family: 'Windows-Update-Agent'
+ major: '7'
+ minor: '9'
+ patch: '9600'
+
+ - user_agent_string: 'Windows-Update-Agent/7.9.9600.18094 Client-Protocol/1.21'
+ family: 'Windows-Update-Agent'
+ major: '7'
+ minor: '9'
+ patch: '9600'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 5.1.1; MI NOTE Pro Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.116 Mobile Safari/537.36 baidubrowser/7.7.13.0 (Baidu; P1 5.1.1)'
+ family: 'Baidu Browser'
+ major: '7'
+ minor: '7'
+ patch: '13'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Dragon/36.1.1.21 Chrome/36.0.1985.97 Safari/537.36'
+ family: 'Dragon'
+ major: '36'
+ minor: '1'
+ patch: '1'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows; U; Windows CE 5.1; rv:1.8.1a3) Gecko/20060610 Minimo/0.016'
+ family: 'Minimo'
+ major: '0'
+ minor: '016'
+ patch:
+
+ - user_agent_string: 'Opera/9.80 (MAUI Runtime; Opera Mini/4.4.39008/37.9178; U; en) Presto/2.12.423 Version/12.16'
+ family: 'Opera Mini'
+ major: '4'
+ minor: '4'
+ patch: '39008'
+
+ - user_agent_string: 'Mozilla/5.0 (compatible; 008/0.83; http://www.80legs.com/spider.html) Gecko/2008032620'
+ family: '008'
+ major: '0'
+ minor: '83'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_4 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) Outlook-iOS-Android/1.0 Mobile/13G35 Safari/601.1.46")'
+ family: 'Outlook-iOS-Android'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.21 Safari/537.36 MMS/1.0.2459.0'
+ family: 'Opera Neon'
+ major: '1'
+ minor: '0'
+ patch: '2459'
+
+ - user_agent_string: 'PANTECH-EUROPA-U4000-orange/1.0 Obigo/Q04C MMS/1.2.0 profile/MIDP-2.0 configuration/CLDC-1.1'
+ family: 'Obigo'
+ major: '04'
+ minor:
+ patch:
+
+ - user_agent_string: 'masscan/1.0 (https://github.com/robertdavidgraham/masscan)'
+ family: 'masscan'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 SznProhlizec/4.3.0-251281'
+ family: 'Seznam prohlížeč'
+ major: '4'
+ minor: '3'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.1.2; Redmi 4X Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 SznProhlizec/5.2.1a'
+ family: 'Seznam prohlížeč'
+ major: '5'
+ minor: '2'
+ patch: '1'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 SznProhlizec/3.8.4 NWjs/0.19.6'
+ family: 'Seznam prohlížeč'
+ major: '3'
+ minor: '8'
+ patch: '4'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Mobile/14D27 SznProhlizec/4.4i'
+ family: 'Seznam prohlížeč'
+ major: '4'
+ minor: '4'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) coc_coc_browser/42.0 CoRom/36.0.1985.144 Chrome/36.0.1985.144 Safari/537.36'
+ family: 'Coc Coc'
+ major: '42'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) coc_coc_browser/49.0 Chrome/43.0.2357.138 Safari/537.36'
+ family: 'Coc Coc'
+ major: '49'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) coc_coc_browser/50.0.125 Chrome/44.0.2403.125 Safari/537.36'
+ family: 'Coc Coc'
+ major: '50'
+ minor: '0'
+ patch: '125'
+
+ - user_agent_string: 'Mozilla/5.0 (compatible; Qwantify/2.4w; +https://www.qwant.com/)/2.4w'
+ family: 'Qwantify'
+ major: '2'
+ minor: '4'
+ patch:
+
+ - user_agent_string: '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'
+ family: 'Edge'
+ major: '12'
+ minor:
+ patch:
+
+ - user_agent_string: 'Bloglovin/1.0 (http://www.bloglovin.com; 1000 subscribers)'
+ family: 'Bloglovin'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Feedbin feed-id:1033517 - 1000 subscribers'
+ family: 'Feedbin'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Tiny Tiny RSS/16.3 (http://tt-rss.org/)'
+ family: 'Tiny Tiny RSS'
+ major: '16'
+ minor: '3'
+ patch:
+
+ - user_agent_string: 'Mtps Feed Aggregation System'
+ family: 'Mtps Feed Aggregation System'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Stringer'
+ family: 'Stringer'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Box Sync/4.0.7848;Darwin/10.13;i386/64bit'
+ family: 'Box Sync'
+ major: '4'
+ minor: '0'
+ patch: '7848'
+
+ - user_agent_string: 'Box/1.2.93;Darwin/10.13;i386/64bit'
+ family: 'Box'
+ major: '1'
+ minor: '2'
+ patch: '93'
+
+ - user_agent_string: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) BoxNotes/1.3.0 Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36'
+ family: 'BoxNotes'
+ major: '1'
+ minor: '3'
+ patch: '0'
+
+ - user_agent_string: 'Box Sync/4.0.7848;Windows/8.1;x86 Family 6 Model 158 Stepping 9, GenuineIntel/32bit'
+ family: 'Box Sync'
+ major: '4'
+ minor: '0'
+ patch: '7848'
+
+ - user_agent_string: 'Box Sync/4.0.7848;Windows/10;Intel64 Family 6 Model 158 Stepping 9, GenuineIntel/64bit'
+ family: 'Box Sync'
+ major: '4'
+ minor: '0'
+ patch: '7848'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) BoxNotes/1.3.0 Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36'
+ family: 'BoxNotes'
+ major: '1'
+ minor: '3'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) BoxNotes/1.3.0 Chrome/56.0.2924.87 Electron/1.6.8 Safari/537.36'
+ family: 'BoxNotes'
+ major: '1'
+ minor: '3'
+ patch: '0'
+
+ - user_agent_string: 'Box/1.2.93;Windows/10;Intel64 Family 6 Model 158 Stepping 9, GenuineIntel/64bit'
+ family: 'Box'
+ major: '1'
+ minor: '2'
+ patch: '93'
+
+ - user_agent_string: 'Evolution/3.26.2.1'
+ family: 'Evolution'
+ major: '3'
+ minor: '26'
+ patch: '2.1'
+
+ - user_agent_string: 'RCM CardDAV plugin/2.0.4'
+ family: 'RCM CardDAV plugin'
+ major: '2'
+ minor: '0'
+ patch: '4'
+
+ - user_agent_string: 'RCM CardDAV plugin/0.9.2-dev'
+ family: 'RCM CardDAV plugin'
+ major: '0'
+ minor: '9'
+ patch: '2-dev'
+
+ - user_agent_string: 'DAVdroid/1.9.2-gplay (2017/11/04; dav4android; okhttp3) Android/7.1.2'
+ family: 'DAVdroid'
+ major: '1'
+ minor: '9'
+ patch: '2'
+
+ - user_agent_string: 'DAVdroid/1.9-ose (2017/10/19; dav4android; okhttp3) Android/7.1.2'
+ family: 'DAVdroid'
+ major: '1'
+ minor: '9'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Windows) mirall/2.3.2 (build 1) (Nextcloud)'
+ family: 'Nextcloud'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Linux) mirall/2.3.2 (Nextcloud)'
+ family: 'Nextcloud'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (Android) ownCloud-android/2.0.0'
+ family: 'Owncloud'
+ major: '2'
+ minor: '0'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) AppleNews/608.0.1 Version/2.0.1'
+ family: 'Mobile Safari UI/WKWebView'
+ major: '10'
+ minor: '0'
+ patch: '2'
+
+ - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; InfoPath.3)'
+ family: 'IE'
+ major: '11'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Trident/6.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729)'
+ family: 'IE'
+ major: '10'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.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; InfoPath.2)'
+ family: 'IE'
+ major: '9'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Tableau/1.0 (1025794)'
+ family: 'Tableau'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_5 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/11.2.5 Mobile/9B179 Safari/7534.48.3 OktaMobile/5.10.2'
+ family: 'OktaMobile'
+ major: '5'
+ minor: '10'
+ patch: '2'
+
+ - user_agent_string: 'BUbiNG (+http://law.di.unimi.it/BUbiNG.html)'
+ family: 'BUbiNG'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (compatible; SemrushBot/1.2~bl; +http://www.semrush.com/bot.html)'
+ family: 'SemrushBot'
+ major: '1'
+ minor: '2'
+ patch:
+
+ - user_agent_string: 'Outlook-iOS/665.29827.prod.iphone (2.63.0)'
+ family: 'Outlook-iOS'
+ major: '2'
+ minor: '63'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; LG-TP260 Build/NRD90U; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 Instagram 33.0.0.11.92 Android (24/7.0; 320dpi; 720x1193; LGE/lge; LG-TP260; lv517; lv517; en_US; 93117667)'
+ family: 'Instagram'
+ major: '33'
+ minor: '0'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_5 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D60 Instagram 33.0.0.11.96 (iPhone9,3; iOS 11_2_5; en_AU; en-AU; scale=2.00; gamut=wide; 750x1334)'
+ family: 'Instagram'
+ major: '33'
+ minor: '0'
+ patch: '0'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Mobile/15D100 Flipboard/4.2.2'
+ family: 'Flipboard'
+ major: '4'
+ minor: '2'
+ patch: '2'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G610F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36 Flipboard/4.1.9/4323,4.1.9.4323'
+ family: 'Flipboard'
+ major: '4'
+ minor: '1'
+ patch: '9'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-G930F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36 Onefootball/Android/9.10.6'
+ family: 'Onefootball'
+ major: '9'
+ minor: '10'
+ patch: '6'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 7.0; SM-A520F Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/58.0.3029.83 Mobile Safari/537.36 Flipboard-Briefing/2.7.28'
+ family: 'Flipboard-Briefing'
+ major: '2'
+ minor: '7'
+ patch: '28'
+
+
+ - user_agent_string: 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/8.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)'
+ family: 'IE'
+ major: '11'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'ESPN Radio/3.2.113 CFNetwork/485.12.30 Darwin/10.4.0'
+ family: 'ESPN'
+ major: '3'
+ minor: '2'
+ patch: '113'
+
+ - user_agent_string: 'ESPN Radio 4.7.4 rv:1032 (iPhone; iPhone OS 9.2.1; en_US)'
+ family: 'ESPN'
+ major: '4'
+ minor: '7'
+ patch: '4'
+ patch_minor: '1032'
+
+ - user_agent_string: 'ESPN Radio 4.5.1 (iPhone; iPhone OS 5.1.1; en_US)'
+ family: 'ESPN'
+ major: '4'
+ minor: '5'
+ patch: '1'
+
+ - user_agent_string: 'ESPN Radio 4.0 (iPhone; iPhone OS 7.1.2; en_AU)'
+ family: 'ESPN'
+ major: '4'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.2.2 Waterfox/55.2.2'
+ family: 'Waterfox'
+ major: '55'
+ minor: '2'
+ patch: '2'
+
+ - user_agent_string: 'Mozilla/5.0 (X11; Linux x86_64; rv:55.0) Gecko/20100101 Goanna/4.0 Firefox/55.0 Basilisk/20171113'
+ family: 'Basilisk'
+ major: '55'
+ minor: '0'
+ patch: '20171113'
+
+ - user_agent_string: 'Go-http-client/1.1'
+ family: 'Go-http-client'
+ major: '1'
+ minor: '1'
+ patch:
+
+ - user_agent_string: 'scalaj-http/1.0'
+ family: 'scalaj-http'
+ major: '1'
+ minor: '0'
+ patch:
+
+ - user_agent_string: 'reqwest/0.8.1'
+ family: 'reqwest'
+ major: '0'
+ minor: '8'
+ patch: '1'
+
+ - user_agent_string: 'Boto/2.48.0 Python/2.7.14 Linux/4.2.0-41-generic'
+ family: 'Boto'
+ major: '2'
+ minor: '48'
+ patch: '0'
+
+ - user_agent_string: 'aws-cli/1.14.9 Python/2.7.12 Linux/4.9.76-3.78.amzn1.x86_64 botocore/1.8.13'
+ family: 'aws-cli'
+ major: '1'
+ minor: '14'
+ patch: '9'
+
+ - user_agent_string: 'Boto3/1.6.2 Python/3.4.3 Linux/4.4.35-33.55.amzn1.x86_64 Botocore/1.9.2 Resource'
+ family: 'Boto3'
+ major: '1'
+ minor: '6'
+ patch: '2'
+
+ - user_agent_string: 'ElasticMapReduce/1.0.0 emrfs/s3n {}, aws-sdk-java/1.11.129 Linux/4.4.35-33.55.amzn1.x86_64 OpenJDK_64-Bit_Server_VM/25.141-b16/1.8.0_141 scala/2.11.8'
+ family: 'aws-sdk-java'
+ major: '1'
+ minor: '11'
+ patch: '129'
+
+ - user_agent_string: 'Hadoop 2.6.0-cdh5.14.0, aws-sdk-java/1.11.134 Linux/4.4.0-1052-aws OpenJDK_64-Bit_Server_VM/25.151-b12/1.8.0_151'
+ family: 'aws-sdk-java'
+ major: '1'
+ minor: '11'
+ patch: '134'
+
+ - user_agent_string: 'Hadoop 2.8.3-amzn-0, aws-sdk-java/1.11.267 Linux/4.9.77-31.58.amzn1.x86_64 OpenJDK_64-Bit_Server_VM/25.161-b14 java/1.8.0_161 scala/2.11.8'
+ family: 'aws-sdk-java'
+ major: '1'
+ minor: '11'
+ patch: '267'
+
+ - user_agent_string: 'aws-sdk-java/1.11.226 Mac_OS_X/10.12.6 Java_HotSpot(TM)_64-Bit_Server_VM/25.131-b11 java/1.8.0_131 scala/2.11.11'
+ family: 'aws-sdk-java'
+ major: '1'
+ minor: '11'
+ patch: '226'
+
+ - user_agent_string: 'aws-sdk-ruby2/2.2.18 ruby/2.1.5 x86_64-linux'
+ family: 'aws-sdk-ruby2'
+ major: '2'
+ minor: '2'
+ patch: '18'
+
+ - user_agent_string: 'aws-sdk-cpp/1.0.64 Linux/4.4.0-66-generic x86_64'
+ family: 'aws-sdk-cpp'
+ major: '1'
+ minor: '0'
+ patch: '64'
+
+ - user_agent_string: 'aws-sdk-go/1.4.12 (go1.6; linux; amd64) S3Manager'
+ family: 'aws-sdk-go'
+ major: '1'
+ minor: '4'
+ patch: '12'
+
+ - user_agent_string: 'aws-sdk-nodejs/2.141.0 win32/v8.4.0'
+ family: 'aws-sdk-nodejs'
+ major: '2'
+ minor: '141'
+ patch: '0'
+
+ - user_agent_string: 'JetS3t/0.9.0 (Linux/4.4.0-1044-aws; amd64; en; JVM 1.8.0_131)'
+ family: 'JetS3t'
+ major: '0'
+ minor: '9'
+ patch: '0'
+
+ - user_agent_string: 's3fs/1.80 (commit hash 6be3236; OpenSSL)'
+ family: 's3fs'
+ major: '1'
+ minor: '80'
+ patch:
+
+ - user_agent_string: 'Cyberduck/6.3.0.27105 (Windows 10/10.0) (x86)'
+ family: 'Cyberduck'
+ major: '6'
+ minor: '3'
+ patch: '0'
+
+ - user_agent_string: 'S3 Browser 7-4-5 https://s3browser.com'
+ family: 'S3 Browser'
+ major: '7'
+ minor: '4'
+ patch: '5'
+
+ - user_agent_string: 'rclone/v1.34'
+ family: 'rclone'
+ major: '1'
+ minor: '34'
+ patch:
+
+ - user_agent_string: 'PycURL/7.43.0 libcurl/7.38.0 OpenSSL/1.0.1t zlib/1.2.8 libidn/1.29 libssh2/1.4.3 librtmp/2.3'
+ family: 'PycURL'
+ major: '7'
+ minor: '43'
+ patch: '0'
+
+ - user_agent_string: 'Axel 2.4 (Linux)'
+ family: 'Axel'
+ major: '2'
+ minor: '4'
+ patch:
+
+ - user_agent_string: 'lftp/4.7.7'
+ family: 'lftp'
+ major: '4'
+ minor: '7'
+ patch: '7'
+
+ - user_agent_string: 'aria2/1.19.0'
+ family: 'aria2'
+ major: '1'
+ minor: '19'
+ patch: '0'
+
+ - user_agent_string: 'SalesforceMobileSDK/5.3.0 android mobile/7.1.1 (XT1635-02) Salesforce1/15.2 Native uid_bef1747905d064c6 ftr_ Cordova/6.2.3'
+ family: 'Salesforce'
+ major: '15'
+ minor: '2'
+ patch:
+
+ - user_agent_string: 'YahooMailProxy; https://help.yahoo.com/kb/yahoo-mail-proxy-SLN28749.html'
+ family: 'YahooMailProxy'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_6 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Snapchat/10.38.0.25 (iPhone8,1; iOS 11.2.6; gzip)'
+ family: 'Snapchat'
+ major: '10'
+ minor: '38'
+ patch: '0'
+ patch_minor: '25'
+
+ - user_agent_string: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0_2 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) GSA/36.0.169645775 Mobile/15A421 Safari/604.1'
+ family: 'Google'
+ major: '36'
+ minor: '0'
+ patch: '169645775'
+
+ - user_agent_string: 'ViaFree-DK/3.8.3 (com.MTGx.ViaFree.dk; build:7383; iOS 12.1.0) Alamofire/4.7.0'
+ family: 'ViaFree'
+ major: '3'
+ minor: '8'
+ patch: '3'
+
+ - user_agent_string: 'Viafree-tvOS-DK/3.7.1 (com.MTGx.ViaFree.dk; build:7341; tvOS 12.1.0) Alamofire/4.7.0'
+ family: 'ViaFree'
+ major: '3'
+ minor: '7'
+ patch: '1'
+
+ - user_agent_string: 'OC/15.0.5071.1000 (Skype for Business)'
+ family: 'Skype'
+ major: '15'
+ minor: '0'
+ patch: '5071'
+ patch_minor: '1000'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.1.0; TA-1024 Build/OPR1.170623.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36 GSA/8.65.5.21.arm64'
+ family: 'Google'
+ major: '8'
+ minor: '65'
+ patch: '5'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36 GSA/8.65.5.21.arm64'
+ family: 'Google'
+ major: '8'
+ minor: '65'
+ patch: '5'
+
+ - user_agent_string: 'Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181205.006; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36 GSA/8.65.5.21.arm64'
+ family: 'Google'
+ major: '8'
+ minor: '65'
+ patch: '5'
+
+ - user_agent_string: 'Microsoft Office Word 2014'
+ family: 'Word'
+ major:
+ minor:
+ patch:
+
+ - user_agent_string: 'Ghost/2.13.1+moya (https://github.com/TryGhost/Ghost)'
+ family: 'Ghost'
+ major: '2'
+ minor: '13'
+ patch: '1'
+
+ - user_agent_string: 'Ghost/2.10.8 (https://github.com/TryGhost/Ghost)'
+ family: 'Ghost'
+ major: '2'
+ minor: '10'
+ patch: '8'
+
+ - user_agent_string: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3763.0 Safari/537.36 Edg/75.0.131.0'
+ family: 'Edge'
+ major: '75'
+ minor: '0'
+ patch: '131'
+ patch_minor: '0'