Socket
Socket
Sign inDemoInstall

useragent

Package Overview
Dependencies
0
Maintainers
1
Versions
39
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 2.0.0 to 2.0.1

features/db.js

6

CHANGELOG.md

@@ -9,3 +9,9 @@ ## Version 2.0

- Removed the fromAgent method
- semver is removed from the dependencies, if you use the useragent/features
you should add it to your own dependencies.
* __v2.0.1__
- Fixed broken reference to the update module.
- Updated with some new parsers.
## Version 1.0

@@ -12,0 +18,0 @@ * __v1.1.0__

2

index.js

@@ -378,3 +378,3 @@ 'use strict';

module.exports = function updater() {
require('./lib/update')(function updating(err, results) {
require('./lib/update').update(function updating(err, results) {
if (err) return; // fail silently

@@ -381,0 +381,0 @@

@@ -1,285 +0,2137 @@

exports.browser = [
[ new RegExp("^(Opera)/(\\d+)\\.(\\d+) \\(Nintendo Wii"), "Wii", 0, 0, 0 ]
, [ new RegExp("(SeaMonkey|Camino)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)"), 0, 0, 0, 0 ]
, [ new RegExp("(Pale[Mm]oon)/(\\d+)\\.(\\d+)\\.?(\\d+)?"), "Pale Moon (Firefox Variant)", 0, 0, 0 ]
, [ new RegExp("(Fennec)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)"), "Firefox Mobile", 0, 0, 0 ]
, [ new RegExp("(Fennec)/(\\d+)\\.(\\d+)(pre)"), "Firefox Mobile", 0, 0, 0 ]
, [ new RegExp("(Fennec)/(\\d+)\\.(\\d+)"), "Firefox Mobile", 0, 0, 0 ]
, [ new RegExp("Mobile.*(Firefox)/(\\d+)\\.(\\d+)"), "Firefox Mobile", 0, 0, 0 ]
, [ new RegExp("(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?)"), "Firefox ($1)", 0, 0, 0 ]
, [ new RegExp("(Firefox)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)"), "Firefox Alpha", 0, 0, 0 ]
, [ new RegExp("(Firefox)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)"), "Firefox Beta", 0, 0, 0 ]
, [ new RegExp("(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(a\\d+[a-z]*)"), "Firefox Alpha", 0, 0, 0 ]
, [ new RegExp("(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(b\\d+[a-z]*)"), "Firefox Beta", 0, 0, 0 ]
, [ new RegExp("(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?"), "Firefox ($1)", 0, 0, 0 ]
, [ new RegExp("(Firefox).*Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)"), "MicroB", 0, 0, 0 ]
, [ new RegExp("(MozillaDeveloperPreview)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?"), 0, 0, 0, 0 ]
, [ new RegExp("(Flock)/(\\d+)\\.(\\d+)(b\\d+?)"), 0, 0, 0, 0 ]
, [ new RegExp("(RockMelt)/(\\d+)\\.(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Navigator)/(\\d+)\\.(\\d+)\\.(\\d+)"), "Netscape", 0, 0, 0 ]
, [ new RegExp("(Navigator)/(\\d+)\\.(\\d+)([ab]\\d+)"), "Netscape", 0, 0, 0 ]
, [ new RegExp("(Netscape6)/(\\d+)\\.(\\d+)\\.(\\d+)"), "Netscape", 0, 0, 0 ]
, [ new RegExp("(MyIBrow)/(\\d+)\\.(\\d+)"), "My Internet Browser", 0, 0, 0 ]
, [ new RegExp("(Opera Tablet).*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?"), 0, 0, 0, 0 ]
, [ new RegExp("(Opera)/.+Opera Mobi.+Version/(\\d+)\\.(\\d+)"), "Opera Mobile", 0, 0, 0 ]
, [ new RegExp("Opera Mobi"), "Opera Mobile", 0, 0, 0 ]
, [ new RegExp("(Opera Mini)/(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Opera Mini)/att/(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Opera)/9.80.*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?"), 0, 0, 0, 0 ]
, [ new RegExp("(webOSBrowser)/(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(webOS)/(\\d+)\\.(\\d+)"), "webOSBrowser", 0, 0, 0 ]
, [ new RegExp("(wOSBrowser).+TouchPad/(\\d+)\\.(\\d+)"), "webOS TouchPad", 0, 0, 0 ]
, [ new RegExp("(luakit)"), "LuaKit", 0, 0, 0 ]
, [ new RegExp("(Lightning)/(\\d+)\\.(\\d+)([ab]?\\d+[a-z]*)"), 0, 0, 0, 0 ]
, [ new RegExp("(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?) \\(Swiftfox\\)"), "Swiftfox", 0, 0, 0 ]
, [ new RegExp("(Firefox)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)? \\(Swiftfox\\)"), "Swiftfox", 0, 0, 0 ]
, [ new RegExp("(rekonq)/(\\d+)\\.(\\d+) Safari"), "Rekonq", 0, 0, 0 ]
, [ new RegExp("rekonq"), "Rekonq", 0, 0, 0 ]
, [ new RegExp("(conkeror|Conkeror)/(\\d+)\\.(\\d+)\\.?(\\d+)?"), "Conkeror", 0, 0, 0 ]
, [ new RegExp("(konqueror)/(\\d+)\\.(\\d+)\\.(\\d+)"), "Konqueror", 0, 0, 0 ]
, [ new RegExp("(WeTab)-Browser"), 0, 0, 0, 0 ]
, [ new RegExp("(Comodo_Dragon)/(\\d+)\\.(\\d+)\\.(\\d+)"), "Comodo Dragon", 0, 0, 0 ]
, [ new RegExp("(YottaaMonitor|BrowserMob|HttpMonitor|YandexBot|Slurp|BingPreview|PagePeeker|ThumbShotsBot|WebThumb|URL2PNG|ZooShot|GomezA|Catchpoint bot|Willow Internet Crawler|Google SketchUp|Read%20Later)"), 0, 0, 0, 0 ]
, [ new RegExp("(Symphony) (\\d+).(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Minimo)"), 0, 0, 0, 0 ]
, [ new RegExp("(CrMo)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)"), "Chrome Mobile", 0, 0, 0 ]
, [ new RegExp("(CriOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)"), "Chrome Mobile iOS", 0, 0, 0 ]
, [ new RegExp("(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile"), "Chrome Mobile", 0, 0, 0 ]
, [ new RegExp("(chromeframe)/(\\d+)\\.(\\d+)\\.(\\d+)"), "Chrome Frame", 0, 0, 0 ]
, [ new RegExp("(UC Browser)(\\d+)\\.(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(SLP Browser)/(\\d+)\\.(\\d+)"), "Tizen Browser", 0, 0, 0 ]
, [ new RegExp("(Epiphany)/(\\d+)\\.(\\d+).(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(SE 2\\.X) MetaSr (\\d+)\\.(\\d+)"), "Sogou Explorer", 0, 0, 0 ]
, [ new RegExp("(FlyFlow)/(\\d+)\\.(\\d+)"), "Baidu Explorer", 0, 0, 0 ]
, [ new RegExp("(Pingdom.com_bot_version_)(\\d+)\\.(\\d+)"), "PingdomBot", 0, 0, 0 ]
, [ new RegExp("(facebookexternalhit)/(\\d+)\\.(\\d+)"), "FacebookBot", 0, 0, 0 ]
, [ new RegExp("(Twitterbot)/(\\d+)\\.(\\d+)"), "TwitterBot", 0, 0, 0 ]
, [ new RegExp("(PyAMF)/(\\d+)\\.(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(AdobeAIR|Chromium|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Shiira|Sunrise|Chrome|Flock|Netscape|Lunascape|WebPilot|Vodafone|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\\.Browser|Bunjaloo|Google Earth|Raven for Mac)/(\\d+)\\.(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser)/(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\\d+)\\.(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(iCab|Lunascape|Opera|Android|Jasmine|Polaris|BREW) (\\d+)\\.(\\d+)\\.?(\\d+)?"), 0, 0, 0, 0 ]
, [ new RegExp("(Kindle)/(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Android) Donut"), 0, "1", "2", 0 ]
, [ new RegExp("(Android) Eclair"), 0, "2", "1", 0 ]
, [ new RegExp("(Android) Froyo"), 0, "2", "2", 0 ]
, [ new RegExp("(Android) Gingerbread"), 0, "2", "3", 0 ]
, [ new RegExp("(Android) Honeycomb"), 0, "3", 0, 0 ]
, [ new RegExp("(IEMobile)[ /](\\d+)\\.(\\d+)"), "IE Mobile", 0, 0, 0 ]
, [ new RegExp("(MSIE) (\\d+)\\.(\\d+).*XBLWP7"), "IE Large Screen", 0, 0, 0 ]
, [ new RegExp("(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Firefox)/(\\d+)\\.(\\d+)(pre|[ab]\\d+[a-z]*)?"), 0, 0, 0, 0 ]
, [ new RegExp("(Obigo)InternetBrowser"), 0, 0, 0, 0 ]
, [ new RegExp("(Obigo)\\-Browser"), 0, 0, 0, 0 ]
, [ new RegExp("(Obigo|OBIGO)[^\\d]*(\\d+)(?:.(\\d+))?"), 0, 0, 0, 0 ]
, [ new RegExp("(MAXTHON|Maxthon) (\\d+)\\.(\\d+)"), "Maxthon", 0, 0, 0 ]
, [ new RegExp("(Maxthon|MyIE2|Uzbl|Shiira)"), 0, "0", 0, 0 ]
, [ new RegExp("(PLAYSTATION) (\\d+)"), "PlayStation", 0, 0, 0 ]
, [ new RegExp("(PlayStation Portable)[^\\d]+(\\d+).(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(BrowseX) \\((\\d+)\\.(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(POLARIS)/(\\d+)\\.(\\d+)"), "Polaris", 0, 0, 0 ]
, [ new RegExp("(Embider)/(\\d+)\\.(\\d+)"), "Polaris", 0, 0, 0 ]
, [ new RegExp("(BonEcho)/(\\d+)\\.(\\d+)\\.(\\d+)"), "Bon Echo", 0, 0, 0 ]
, [ new RegExp("(iPod).+Version/(\\d+)\\.(\\d+)\\.(\\d+)"), "Mobile Safari", 0, 0, 0 ]
, [ new RegExp("(iPod).*Version/(\\d+)\\.(\\d+)"), "Mobile Safari", 0, 0, 0 ]
, [ new RegExp("(iPhone).*Version/(\\d+)\\.(\\d+)\\.(\\d+)"), "Mobile Safari", 0, 0, 0 ]
, [ new RegExp("(iPhone).*Version/(\\d+)\\.(\\d+)"), "Mobile Safari", 0, 0, 0 ]
, [ new RegExp("(iPad).*Version/(\\d+)\\.(\\d+)\\.(\\d+)"), "Mobile Safari", 0, 0, 0 ]
, [ new RegExp("(iPad).*Version/(\\d+)\\.(\\d+)"), "Mobile Safari", 0, 0, 0 ]
, [ new RegExp("(iPod|iPhone|iPad);.*CPU.*OS (\\d+)(?:_\\d+)?_(\\d+).*Mobile"), "Mobile Safari", 0, 0, 0 ]
, [ new RegExp("(iPod|iPhone|iPad)"), "Mobile Safari", 0, 0, 0 ]
, [ new RegExp("(AvantGo) (\\d+).(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Avant)"), 0, "1", 0, 0 ]
, [ new RegExp("(QtCarBrowser)"), 0, "1", 0, 0 ]
, [ new RegExp("^(Nokia)"), "Nokia Services (WAP) Browser", 0, 0, 0 ]
, [ new RegExp("(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(NokiaBrowser)/(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(BrowserNG)/(\\d+)\\.(\\d+).(\\d+)"), "NokiaBrowser", 0, 0, 0 ]
, [ new RegExp("(Series60)/5\\.0"), "NokiaBrowser", "7", "0", 0 ]
, [ new RegExp("(Series60)/(\\d+)\\.(\\d+)"), "Nokia OSS Browser", 0, 0, 0 ]
, [ new RegExp("(S40OviBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)"), "Nokia Series 40 Ovi Browser", 0, 0, 0 ]
, [ new RegExp("(Nokia)[EN]?(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(BB10);"), "Blackberry WebKit", 0, 0, 0 ]
, [ new RegExp("(PlayBook).+RIM Tablet OS (\\d+)\\.(\\d+)\\.(\\d+)"), "Blackberry WebKit", 0, 0, 0 ]
, [ new RegExp("(Black[bB]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)"), "Blackberry WebKit", 0, 0, 0 ]
, [ new RegExp("(Black[bB]erry)\\s?(\\d+)"), "Blackberry", 0, 0, 0 ]
, [ new RegExp("(OmniWeb)/v(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Blazer)/(\\d+)\\.(\\d+)"), "Palm Blazer", 0, 0, 0 ]
, [ new RegExp("(Pre)/(\\d+)\\.(\\d+)"), "Palm Pre", 0, 0, 0 ]
, [ new RegExp("(Links) \\((\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(QtWeb) Internet Browser/(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+))?"), "Amazon Silk", 0, 0, 0 ]
, [ new RegExp("(AppleWebKit)/(\\d+)\\.?(\\d+)?\\+ .* Safari"), "WebKit Nightly", 0, 0, 0 ]
, [ new RegExp("(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*Safari/"), "Safari", 0, 0, 0 ]
, [ new RegExp("(Safari)/\\d+"), 0, 0, 0, 0 ]
, [ new RegExp("(OLPC)/Update(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(OLPC)/Update()\\.(\\d+)"), 0, "0", 0, 0 ]
, [ new RegExp("(SEMC\\-Browser)/(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Teleca)"), "Teleca Browser", 0, 0, 0 ]
, [ new RegExp("(MSIE) (\\d+)\\.(\\d+)"), "IE", 0, 0, 0 ]
, [ new RegExp("(Nintendo 3DS).* Version/(\\d+)\\.(\\d+)(?:\\.(\\w+))"), 0, 0, 0, 0 ]
, [ new RegExp("(python-requests)/(\\d+)\\.(\\d+)"), "Python Requests", 0, 0, 0 ]
, [ new RegExp("(Thunderbird)/(\\d+)\\.(\\d+)\\.?(\\d+)?"), 0, 0, 0, 0 ]
, [ new RegExp("(Wget)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)"), 0, 0, 0, 0 ]
, [ new RegExp("(curl)/(\\d+)\\.(\\d+)\\.(\\d+)"), "cURL", 0, 0, 0 ]
];
var parser;
exports.device = [
[ new RegExp("HTC ([A-Z][a-z0-9]+) Build"), "HTC $1", 0, 0, 0 ]
, [ new RegExp("HTC ([A-Z][a-z0-9 ]+) \\d+\\.\\d+\\.\\d+\\.\\d+"), "HTC $1", 0, 0, 0 ]
, [ new RegExp("HTC_Touch_([A-Za-z0-9]+)"), "HTC Touch ($1)", 0, 0, 0 ]
, [ new RegExp("USCCHTC(\\d+)"), "HTC $1 (US Cellular)", 0, 0, 0 ]
, [ new RegExp("Sprint APA(9292)"), "HTC $1 (Sprint)", 0, 0, 0 ]
, [ new RegExp("HTC ([A-Za-z0-9]+ [A-Z])"), "HTC $1", 0, 0, 0 ]
, [ new RegExp("HTC-([A-Za-z0-9]+)"), "HTC $1", 0, 0, 0 ]
, [ new RegExp("HTC_([A-Za-z0-9]+)"), "HTC $1", 0, 0, 0 ]
, [ new RegExp("HTC ([A-Za-z0-9]+)"), "HTC $1", 0, 0, 0 ]
, [ new RegExp("(ADR[A-Za-z0-9]+)"), "HTC $1", 0, 0, 0 ]
, [ new RegExp("(HTC)"), 0, 0, 0, 0 ]
, [ new RegExp("(QtCarBrowser)"), "Tesla Model S", 0, 0, 0 ]
, [ new RegExp("(SamsungSGHi560)"), "Samsung SGHi560", 0, 0, 0 ]
, [ new RegExp("SonyEricsson([A-Za-z0-9]+)/"), "Ericsson $1", 0, 0, 0 ]
, [ new RegExp("(KFOT Build)"), "Kindle Fire", 0, 0, 0 ]
, [ new RegExp("(KFTT Build)"), "Kindle Fire HD", 0, 0, 0 ]
, [ new RegExp("(KFJWI Build)"), "Kindle Fire HD 8.9\" WiFi", 0, 0, 0 ]
, [ new RegExp("(KFJWA Build)"), "Kindle Fire HD 8.9\" 4G", 0, 0, 0 ]
, [ new RegExp("(Kindle Fire)"), 0, 0, 0, 0 ]
, [ new RegExp("(Kindle)"), 0, 0, 0, 0 ]
, [ new RegExp("(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+))?"), "Kindle Fire", 0, 0, 0 ]
, [ new RegExp("Android[\\- ][\\d]+\\.[\\d]+\\; [A-Za-z]{2}\\-[A-Za-z]{2}\\; WOWMobile (.+) Build"), 0, 0, 0, 0 ]
, [ new RegExp("Android[\\- ][\\d]+\\.[\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{2}\\; (.+) Build"), 0, 0, 0, 0 ]
, [ new RegExp("Android[\\- ][\\d]+\\.[\\d]+\\-update1\\; [A-Za-z]{2}\\-[A-Za-z]{2}\\; (.+) Build"), 0, 0, 0, 0 ]
, [ new RegExp("Android[\\- ][\\d]+\\.[\\d]+\\; [A-Za-z]{2}\\-[A-Za-z]{2}\\; (.+) Build"), 0, 0, 0, 0 ]
, [ new RegExp("Android[\\- ][\\d]+\\.[\\d]+\\.[\\d]+; (.+) Build"), 0, 0, 0, 0 ]
, [ new RegExp("NokiaN([0-9]+)"), "Nokia N$1", 0, 0, 0 ]
, [ new RegExp("Nokia([A-Za-z0-9\\v-]+)"), "Nokia $1", 0, 0, 0 ]
, [ new RegExp("NOKIA ([A-Za-z0-9\\-]+)"), "Nokia $1", 0, 0, 0 ]
, [ new RegExp("Nokia ([A-Za-z0-9\\-]+)"), "Nokia $1", 0, 0, 0 ]
, [ new RegExp("Lumia ([A-Za-z0-9\\-]+)"), "Lumia $1", 0, 0, 0 ]
, [ new RegExp("Symbian"), "Nokia", 0, 0, 0 ]
, [ new RegExp("BB10; ([A-Za-z0-9\\- ]+)\\)"), "BlackBerry $1", 0, 0, 0 ]
, [ new RegExp("(PlayBook).+RIM Tablet OS"), "Blackberry Playbook", 0, 0, 0 ]
, [ new RegExp("(Black[Bb]erry [0-9]+);"), 0, 0, 0, 0 ]
, [ new RegExp("Black[Bb]erry([0-9]+)"), "BlackBerry $1", 0, 0, 0 ]
, [ new RegExp("(Pre)/(\\d+)\\.(\\d+)"), "Palm Pre", 0, 0, 0 ]
, [ new RegExp("(Pixi)/(\\d+)\\.(\\d+)"), "Palm Pixi", 0, 0, 0 ]
, [ new RegExp("(Touchpad)/(\\d+)\\.(\\d+)"), "HP Touchpad", 0, 0, 0 ]
, [ new RegExp("HPiPAQ([A-Za-z0-9]+)/(\\d+).(\\d+)"), "HP iPAQ $1", 0, 0, 0 ]
, [ new RegExp("Palm([A-Za-z0-9]+)"), "Palm $1", 0, 0, 0 ]
, [ new RegExp("Treo([A-Za-z0-9]+)"), "Palm Treo $1", 0, 0, 0 ]
, [ new RegExp("webOS.*(P160UNA)/(\\d+).(\\d+)"), "HP Veer", 0, 0, 0 ]
, [ new RegExp("(PlayStation Portable)"), 0, 0, 0, 0 ]
, [ new RegExp("(PlayStation Vita)"), 0, 0, 0, 0 ]
, [ new RegExp("(AppleTV)"), "AppleTV", 0, 0, 0 ]
, [ new RegExp("(iPad) Simulator;"), 0, 0, 0, 0 ]
, [ new RegExp("(iPad);"), 0, 0, 0, 0 ]
, [ new RegExp("(iPod);"), 0, 0, 0, 0 ]
, [ new RegExp("(iPhone) Simulator;"), 0, 0, 0, 0 ]
, [ new RegExp("(iPhone);"), 0, 0, 0, 0 ]
, [ new RegExp("acer_([A-Za-z0-9]+)_"), "Acer $1", 0, 0, 0 ]
, [ new RegExp("acer_([A-Za-z0-9]+)_"), "Acer $1", 0, 0, 0 ]
, [ new RegExp("Amoi\\-([A-Za-z0-9]+)"), "Amoi $1", 0, 0, 0 ]
, [ new RegExp("AMOI\\-([A-Za-z0-9]+)"), "Amoi $1", 0, 0, 0 ]
, [ new RegExp("Asus\\-([A-Za-z0-9]+)"), "Asus $1", 0, 0, 0 ]
, [ new RegExp("ASUS\\-([A-Za-z0-9]+)"), "Asus $1", 0, 0, 0 ]
, [ new RegExp("BIRD\\-([A-Za-z0-9]+)"), "Bird $1", 0, 0, 0 ]
, [ new RegExp("BIRD\\.([A-Za-z0-9]+)"), "Bird $1", 0, 0, 0 ]
, [ new RegExp("BIRD ([A-Za-z0-9]+)"), "Bird $1", 0, 0, 0 ]
, [ new RegExp("Dell ([A-Za-z0-9]+)"), "Dell $1", 0, 0, 0 ]
, [ new RegExp("DoCoMo/2\\.0 ([A-Za-z0-9]+)"), "DoCoMo $1", 0, 0, 0 ]
, [ new RegExp("([A-Za-z0-9]+)_W\\;FOMA"), "DoCoMo $1", 0, 0, 0 ]
, [ new RegExp("([A-Za-z0-9]+)\\;FOMA"), "DoCoMo $1", 0, 0, 0 ]
, [ new RegExp("vodafone([A-Za-z0-9]+)"), "Huawei Vodafone $1", 0, 0, 0 ]
, [ new RegExp("i\\-mate ([A-Za-z0-9]+)"), "i-mate $1", 0, 0, 0 ]
, [ new RegExp("Kyocera\\-([A-Za-z0-9]+)"), "Kyocera $1", 0, 0, 0 ]
, [ new RegExp("KWC\\-([A-Za-z0-9]+)"), "Kyocera $1", 0, 0, 0 ]
, [ new RegExp("Lenovo\\-([A-Za-z0-9]+)"), "Lenovo $1", 0, 0, 0 ]
, [ new RegExp("Lenovo_([A-Za-z0-9]+)"), "Lenovo $1", 0, 0, 0 ]
, [ new RegExp("LG/([A-Za-z0-9]+)"), "LG $1", 0, 0, 0 ]
, [ new RegExp("LG-LG([A-Za-z0-9]+)"), "LG $1", 0, 0, 0 ]
, [ new RegExp("LGE-LG([A-Za-z0-9]+)"), "LG $1", 0, 0, 0 ]
, [ new RegExp("LGE VX([A-Za-z0-9]+)"), "LG $1", 0, 0, 0 ]
, [ new RegExp("LG ([A-Za-z0-9]+)"), "LG $1", 0, 0, 0 ]
, [ new RegExp("LGE LG\\-AX([A-Za-z0-9]+)"), "LG $1", 0, 0, 0 ]
, [ new RegExp("LG\\-([A-Za-z0-9]+)"), "LG $1", 0, 0, 0 ]
, [ new RegExp("LGE\\-([A-Za-z0-9]+)"), "LG $1", 0, 0, 0 ]
, [ new RegExp("LG([A-Za-z0-9]+)"), "LG $1", 0, 0, 0 ]
, [ new RegExp("(KIN)\\.One (\\d+)\\.(\\d+)"), "Microsoft $1", 0, 0, 0 ]
, [ new RegExp("(KIN)\\.Two (\\d+)\\.(\\d+)"), "Microsoft $1", 0, 0, 0 ]
, [ new RegExp("(Motorola)\\-([A-Za-z0-9]+)"), 0, 0, 0, 0 ]
, [ new RegExp("MOTO\\-([A-Za-z0-9]+)"), "Motorola $1", 0, 0, 0 ]
, [ new RegExp("MOT\\-([A-Za-z0-9]+)"), "Motorola $1", 0, 0, 0 ]
, [ new RegExp("Philips([A-Za-z0-9]+)"), "Philips $1", 0, 0, 0 ]
, [ new RegExp("Philips ([A-Za-z0-9]+)"), "Philips $1", 0, 0, 0 ]
, [ new RegExp("SAMSUNG-([A-Za-z0-9\\-]+)"), "Samsung $1", 0, 0, 0 ]
, [ new RegExp("SAMSUNG\\; ([A-Za-z0-9\\-]+)"), "Samsung $1", 0, 0, 0 ]
, [ new RegExp("Softbank/1\\.0/([A-Za-z0-9]+)"), "Softbank $1", 0, 0, 0 ]
, [ new RegExp("Softbank/2\\.0/([A-Za-z0-9]+)"), "Softbank $1", 0, 0, 0 ]
, [ new RegExp("(PlayStation3 PPC)"), "Playstation 3", 0, 0, 0 ]
, [ new RegExp("(hiptop|avantgo|plucker|xiino|blazer|elaine|up.browser|up.link|mmp|smartphone|midp|wap|vodafone|o2|pocket|mobile|pda)"), "Generic Smartphone", 0, 0, 0 ]
, [ new RegExp("^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\\-|airn|alav|asus|attw|au\\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bell|bird|bw\\-n|bw\\-u|beck|benq|bilb|blac|c55/|cdm\\-|chtm|capi|comp|cond|craw|dall|dbte|dc\\-s|dica|ds\\-d|ds12|dait|devi|dmob|doco|dopo|el49|erk0|esl8|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\\-|fly_|g\\-mo|g1 u|g560|gf\\-5|grun|gene|go.w|good|grad|hcit|hd\\-m|hd\\-p|hd\\-t|hei\\-|hp i|hpip|hs\\-c|htc |htc\\-|htca|htcg)"), "Generic Feature Phone", 0, 0, 0 ]
, [ new RegExp("^(htcp|htcs|htct|htc_|haie|hita|huaw|hutc|i\\-20|i\\-go|i\\-ma|i230|iac|iac\\-|iac/|ig01|im1k|inno|iris|jata|java|kddi|kgt|kgt/|kpt |kwc\\-|klon|lexi|lg g|lg\\-a|lg\\-b|lg\\-c|lg\\-d|lg\\-f|lg\\-g|lg\\-k|lg\\-l|lg\\-m|lg\\-o|lg\\-p|lg\\-s|lg\\-t|lg\\-u|lg\\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\\-|lge/|lynx|leno|m1\\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\\-|nem\\-|newg|neon)"), "Generic Feature Phone", 0, 0, 0 ]
, [ new RegExp("^(netf|noki|nzph|o2 x|o2\\-x|opwv|owg1|opti|oran|ot\\-s|p800|pand|pg\\-1|pg\\-2|pg\\-3|pg\\-6|pg\\-8|pg\\-c|pg13|phil|pn\\-2|pt\\-g|palm|pana|pire|pock|pose|psio|qa\\-a|qc\\-2|qc\\-3|qc\\-5|qc\\-7|qc07|qc12|qc21|qc32|qc60|qci\\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\\-|scp\\-|sdk/|se47|sec\\-|sec0|sec1|semc|sgh\\-|shar|sie\\-|sk\\-0|sl45|slid|smb3|smt5|sp01|sph\\-|spv |spv\\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\\-mo|t218|t250|t600|t610|t618|tcl\\-|tdg\\-|telm|tim\\-|ts70|tsm\\-|tsm3|tsm5|tx\\-9|tagt)"), "Generic Feature Phone", 0, 0, 0 ]
, [ new RegExp("^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vite|voda|vulc|w3c |w3c\\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\\-|your|zte\\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\\-|webc|whit|wmlb|xda\\-|xda_)"), "Generic Feature Phone", 0, 0, 0 ]
, [ new RegExp("(bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\\-webcrawler|converacrawler|dataparksearch|findlinks)"), "Spider", 0, 0, 0 ]
];
exports.browser = Object.create(null);
exports.os = [
[ new RegExp("(Android) (\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+))?"), 0, 0, 0, 0 ]
, [ new RegExp("(Android)\\-(\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+))?"), 0, 0, 0, 0 ]
, [ new RegExp("(Android) Donut"), 0, "1", "2", 0 ]
, [ new RegExp("(Android) Eclair"), 0, "2", "1", 0 ]
, [ new RegExp("(Android) Froyo"), 0, "2", "2", 0 ]
, [ new RegExp("(Android) Gingerbread"), 0, "2", "3", 0 ]
, [ new RegExp("(Android) Honeycomb"), 0, "3", 0, 0 ]
, [ new RegExp("(Silk-Accelerated=[a-z]{4,5})"), "Android", 0, 0, 0 ]
, [ new RegExp("(Windows Phone 6\\.5)"), 0, 0, 0, 0 ]
, [ new RegExp("(Windows (?:NT 5\\.2|NT 5\\.1))"), "Windows XP", 0, 0, 0 ]
, [ new RegExp("(XBLWP7)"), "Windows Phone OS", 0, 0, 0 ]
, [ new RegExp("(Windows NT 6\\.1)"), "Windows 7", 0, 0, 0 ]
, [ new RegExp("(Windows NT 6\\.0)"), "Windows Vista", 0, 0, 0 ]
, [ new RegExp("(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\\.0|Windows Vista|Windows 2000)"), 0, 0, 0, 0 ]
, [ new RegExp("(Windows NT 6\\.2; ARM;)"), "Windows RT", 0, 0, 0 ]
, [ new RegExp("(Windows NT 6\\.2)"), "Windows 8", 0, 0, 0 ]
, [ new RegExp("(Windows NT 5\\.0)"), "Windows 2000", 0, 0, 0 ]
, [ new RegExp("(Windows Phone OS) (\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Windows ?Mobile)"), "Windows Mobile", 0, 0, 0 ]
, [ new RegExp("(WinNT4.0)"), "Windows NT 4.0", 0, 0, 0 ]
, [ new RegExp("(Win98)"), "Windows 98", 0, 0, 0 ]
, [ new RegExp("(Tizen)/(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Mac OS X) (\\d+)[_.](\\d+)(?:[_.](\\d+))?"), 0, 0, 0, 0 ]
, [ new RegExp("(?:PPC|Intel) (Mac OS X)"), 0, 0, 0, 0 ]
, [ new RegExp("(CPU OS|iPhone OS) (\\d+)_(\\d+)(?:_(\\d+))?"), "iOS", 0, 0, 0 ]
, [ new RegExp("(iPhone|iPad|iPod); Opera"), "iOS", 0, 0, 0 ]
, [ new RegExp("(iPhone|iPad|iPod).*Mac OS X.*Version/(\\d+)\\.(\\d+)"), "iOS", 0, 0, 0 ]
, [ new RegExp("(AppleTV)/(\\d+)\\.(\\d+)"), "ATV OS X", "$1", "$2", 0 ]
, [ new RegExp("(CrOS) [a-z0-9_]+ (\\d+)\\.(\\d+)(?:\\.(\\d+))?"), "Chrome OS", 0, 0, 0 ]
, [ new RegExp("(Debian)-(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?"), 0, 0, 0, 0 ]
, [ new RegExp("(Linux Mint)(?:/(\\d+))?"), 0, 0, 0, 0 ]
, [ new RegExp("(Mandriva)(?: Linux)?/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?"), 0, 0, 0, 0 ]
, [ new RegExp("(Symbian[Oo][Ss])/(\\d+)\\.(\\d+)"), "Symbian OS", 0, 0, 0 ]
, [ new RegExp("(Symbian/3).+NokiaBrowser/7\\.3"), "Symbian^3 Anna", 0, 0, 0 ]
, [ new RegExp("(Symbian/3).+NokiaBrowser/7\\.4"), "Symbian^3 Belle", 0, 0, 0 ]
, [ new RegExp("(Symbian/3)"), "Symbian^3", 0, 0, 0 ]
, [ new RegExp("(Series 60|SymbOS|S60)"), "Symbian OS", 0, 0, 0 ]
, [ new RegExp("(MeeGo)"), 0, 0, 0, 0 ]
, [ new RegExp("Symbian [Oo][Ss]"), "Symbian OS", 0, 0, 0 ]
, [ new RegExp("(BB10);.+Version/(\\d+)\\.(\\d+)\\.(\\d+)"), "BlackBerry OS", 0, 0, 0 ]
, [ new RegExp("(Black[Bb]erry)[0-9a-z]+/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?"), "BlackBerry OS", 0, 0, 0 ]
, [ new RegExp("(Black[Bb]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?"), "BlackBerry OS", 0, 0, 0 ]
, [ new RegExp("(RIM Tablet OS) (\\d+)\\.(\\d+)\\.(\\d+)"), "BlackBerry Tablet OS", 0, 0, 0 ]
, [ new RegExp("(Play[Bb]ook)"), "BlackBerry Tablet OS", 0, 0, 0 ]
, [ new RegExp("(Black[Bb]erry)"), "Blackberry OS", 0, 0, 0 ]
, [ new RegExp("(GoogleTV) (\\d+)\\.(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(GoogleTV)\\/\\d+"), 0, 0, 0, 0 ]
, [ new RegExp("(webOS|hpwOS)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?"), "webOS", 0, 0, 0 ]
, [ new RegExp("(SUSE|Fedora|Red Hat|PCLinuxOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(SUSE|Fedora|Red Hat|Puppy|PCLinuxOS|CentOS)/(\\d+)\\.(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Red Hat|Slackware)/(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(PlayStation Vita) (\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Windows|OpenBSD|FreeBSD|NetBSD|Ubuntu|Kubuntu|Android|Arch Linux|CentOS|WeTab|Slackware)"), 0, 0, 0, 0 ]
, [ new RegExp("(Linux)/(\\d+)\\.(\\d+)"), 0, 0, 0, 0 ]
, [ new RegExp("(Linux|BSD)"), 0, 0, 0, 0 ]
, [ new RegExp("(Red Hat)"), 0, 0, 0, 0 ]
];
parser = Object.create(null);
parser[0] = new RegExp("(SeaMonkey|Camino)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[0] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Pale[Mm]oon)/(\\d+)\\.(\\d+)\\.?(\\d+)?");
parser[1] = "Pale Moon (Firefox Variant)";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[1] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Fennec)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)");
parser[1] = "Firefox Mobile";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[2] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Fennec)/(\\d+)\\.(\\d+)(pre)");
parser[1] = "Firefox Mobile";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[3] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Fennec)/(\\d+)\\.(\\d+)");
parser[1] = "Firefox Mobile";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[4] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Mobile.*(Firefox)/(\\d+)\\.(\\d+)");
parser[1] = "Firefox Mobile";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[5] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?)");
parser[1] = "Firefox ($1)";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[6] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Firefox)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)");
parser[1] = "Firefox Alpha";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[7] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Firefox)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)");
parser[1] = "Firefox Beta";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[8] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(a\\d+[a-z]*)");
parser[1] = "Firefox Alpha";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[9] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(b\\d+[a-z]*)");
parser[1] = "Firefox Beta";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[10] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?");
parser[1] = "Firefox ($1)";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[11] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Firefox).*Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "MicroB";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[12] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(MozillaDeveloperPreview)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[13] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Flock)/(\\d+)\\.(\\d+)(b\\d+?)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[14] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(RockMelt)/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[15] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Navigator)/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Netscape";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[16] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Navigator)/(\\d+)\\.(\\d+)([ab]\\d+)");
parser[1] = "Netscape";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[17] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Netscape6)/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Netscape";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[18] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(MyIBrow)/(\\d+)\\.(\\d+)");
parser[1] = "My Internet Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[19] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Opera Tablet).*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[20] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Opera)/.+Opera Mobi.+Version/(\\d+)\\.(\\d+)");
parser[1] = "Opera Mobile";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[21] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Opera Mobi");
parser[1] = "Opera Mobile";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[22] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Opera Mini)/(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[23] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Opera Mini)/att/(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[24] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Opera)/9.80.*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[25] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+))?");
parser[1] = "webOS Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[26] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(luakit)");
parser[1] = "LuaKit";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[27] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Snowshoe)/(\\d+)\\.(\\d+).(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[28] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Lightning)/(\\d+)\\.(\\d+)([ab]?\\d+[a-z]*)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[29] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?) \\(Swiftfox\\)");
parser[1] = "Swiftfox";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[30] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Firefox)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)? \\(Swiftfox\\)");
parser[1] = "Swiftfox";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[31] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(rekonq)/(\\d+)\\.(\\d+) Safari");
parser[1] = "Rekonq";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[32] = parser;
parser = Object.create(null);
parser[0] = new RegExp("rekonq");
parser[1] = "Rekonq";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[33] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(conkeror|Conkeror)/(\\d+)\\.(\\d+)\\.?(\\d+)?");
parser[1] = "Conkeror";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[34] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(konqueror)/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Konqueror";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[35] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(WeTab)-Browser");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[36] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Comodo_Dragon)/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Comodo Dragon";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[37] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(YottaaMonitor|BrowserMob|HttpMonitor|YandexBot|Slurp|BingPreview|PagePeeker|ThumbShotsBot|WebThumb|URL2PNG|ZooShot|GomezA|Catchpoint bot|Willow Internet Crawler|Google SketchUp|Read%20Later)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[38] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Symphony) (\\d+).(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[39] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Minimo)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[40] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(CrMo)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Chrome Mobile";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[41] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(CriOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Chrome Mobile iOS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[42] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile");
parser[1] = "Chrome Mobile";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[43] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(chromeframe)/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Chrome Frame";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[44] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(UCBrowser)[ /](\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "UC Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[45] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(UC Browser)[ /](\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[46] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(UC Browser|UCBrowser|UCWEB)(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "UC Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[47] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(SLP Browser)/(\\d+)\\.(\\d+)");
parser[1] = "Tizen Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[48] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Epiphany)/(\\d+)\\.(\\d+).(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[49] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(SE 2\\.X) MetaSr (\\d+)\\.(\\d+)");
parser[1] = "Sogou Explorer";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[50] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(baidubrowser)[/\\s](\\d+)");
parser[1] = "Baidu Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[51] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(FlyFlow)/(\\d+)\\.(\\d+)");
parser[1] = "Baidu Explorer";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[52] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Pingdom.com_bot_version_)(\\d+)\\.(\\d+)");
parser[1] = "PingdomBot";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[53] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(facebookexternalhit)/(\\d+)\\.(\\d+)");
parser[1] = "FacebookBot";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[54] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Twitterbot)/(\\d+)\\.(\\d+)");
parser[1] = "TwitterBot";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[55] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Rackspace Monitoring)/(\\d+)\\.(\\d+)");
parser[1] = "RackspaceBot";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[56] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(PyAMF)/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[57] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(AdobeAIR|Chromium|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Shiira|Sunrise|Chrome|Flock|Netscape|Lunascape|WebPilot|Vodafone|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+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[58] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser)/(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[59] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[60] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iCab|Lunascape|Opera|Android|Jasmine|Polaris) (\\d+)\\.(\\d+)\\.?(\\d+)?");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[61] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Kindle)/(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[62] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Android) Donut");
parser[1] = 0;
parser[2] = "1";
parser[3] = "2";
parser[4] = 0;
exports.browser[63] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Android) Eclair");
parser[1] = 0;
parser[2] = "2";
parser[3] = "1";
parser[4] = 0;
exports.browser[64] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Android) Froyo");
parser[1] = 0;
parser[2] = "2";
parser[3] = "2";
parser[4] = 0;
exports.browser[65] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Android) Gingerbread");
parser[1] = 0;
parser[2] = "2";
parser[3] = "3";
parser[4] = 0;
exports.browser[66] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Android) Honeycomb");
parser[1] = 0;
parser[2] = "3";
parser[3] = 0;
parser[4] = 0;
exports.browser[67] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(IEMobile)[ /](\\d+)\\.(\\d+)");
parser[1] = "IE Mobile";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[68] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(MSIE) (\\d+)\\.(\\d+).*XBLWP7");
parser[1] = "IE Large Screen";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[69] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[70] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Firefox)/(\\d+)\\.(\\d+)(pre|[ab]\\d+[a-z]*)?");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[71] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Obigo)InternetBrowser");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[72] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Obigo)\\-Browser");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[73] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Obigo|OBIGO)[^\\d]*(\\d+)(?:.(\\d+))?");
parser[1] = "Obigo";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[74] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(MAXTHON|Maxthon) (\\d+)\\.(\\d+)");
parser[1] = "Maxthon";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[75] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Maxthon|MyIE2|Uzbl|Shiira)");
parser[1] = 0;
parser[2] = "0";
parser[3] = 0;
parser[4] = 0;
exports.browser[76] = parser;
parser = Object.create(null);
parser[0] = new RegExp("PLAYSTATION 3.+WebKit");
parser[1] = "NetFront NX";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[77] = parser;
parser = Object.create(null);
parser[0] = new RegExp("PLAYSTATION 3");
parser[1] = "NetFront";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[78] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(PlayStation Portable)");
parser[1] = "NetFront";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[79] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(PlayStation Vita)");
parser[1] = "NetFront NX";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[80] = parser;
parser = Object.create(null);
parser[0] = new RegExp("AppleWebKit.+ (NX)/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "NetFront NX";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[81] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Nintendo 3DS)");
parser[1] = "NetFront NX";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[82] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(BrowseX) \\((\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[83] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(NCSA_Mosaic)/(\\d+)\\.(\\d+)");
parser[1] = "NCSA Mosaic";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[84] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(POLARIS)/(\\d+)\\.(\\d+)");
parser[1] = "Polaris";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[85] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Embider)/(\\d+)\\.(\\d+)");
parser[1] = "Polaris";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[86] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(BonEcho)/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Bon Echo";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[87] = parser;
parser = Object.create(null);
parser[0] = new RegExp("M?QQBrowser");
parser[1] = "QQ Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[88] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPod).+Version/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Mobile Safari";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[89] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPod).*Version/(\\d+)\\.(\\d+)");
parser[1] = "Mobile Safari";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[90] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPhone).*Version/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Mobile Safari";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[91] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPhone).*Version/(\\d+)\\.(\\d+)");
parser[1] = "Mobile Safari";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[92] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPad).*Version/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Mobile Safari";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[93] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPad).*Version/(\\d+)\\.(\\d+)");
parser[1] = "Mobile Safari";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[94] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPod|iPhone|iPad);.*CPU.*OS (\\d+)(?:_\\d+)?_(\\d+).*Mobile");
parser[1] = "Mobile Safari";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[95] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPod|iPhone|iPad)");
parser[1] = "Mobile Safari";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[96] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(AvantGo) (\\d+).(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[97] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(OneBrowser)/(\\d+).(\\d+)");
parser[1] = "ONE Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[98] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Avant)");
parser[1] = 0;
parser[2] = "1";
parser[3] = 0;
parser[4] = 0;
exports.browser[99] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(QtCarBrowser)");
parser[1] = 0;
parser[2] = "1";
parser[3] = 0;
parser[4] = 0;
exports.browser[100] = parser;
parser = Object.create(null);
parser[0] = new RegExp("^(Nokia)");
parser[1] = "Nokia Services (WAP) Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[101] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)\\.(\\d+)");
parser[1] = "Nokia Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[102] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)");
parser[1] = "Nokia Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[103] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(NokiaBrowser)/(\\d+)\\.(\\d+)");
parser[1] = "Nokia Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[104] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(BrowserNG)/(\\d+)\\.(\\d+).(\\d+)");
parser[1] = "Nokia Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[105] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Series60)/5\\.0");
parser[1] = "Nokia Browser";
parser[2] = "7";
parser[3] = "0";
parser[4] = 0;
exports.browser[106] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Series60)/(\\d+)\\.(\\d+)");
parser[1] = "Nokia OSS Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[107] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(S40OviBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Ovi Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[108] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Nokia)[EN]?(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[109] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(BB10);");
parser[1] = "BlackBerry WebKit";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[110] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(PlayBook).+RIM Tablet OS (\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "BlackBerry WebKit";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[111] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Black[bB]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "BlackBerry WebKit";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[112] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Black[bB]erry)\\s?(\\d+)");
parser[1] = "BlackBerry";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[113] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(OmniWeb)/v(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[114] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Blazer)/(\\d+)\\.(\\d+)");
parser[1] = "Palm Blazer";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[115] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Pre)/(\\d+)\\.(\\d+)");
parser[1] = "Palm Pre";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[116] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Links) \\((\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[117] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(QtWeb) Internet Browser/(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[118] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+))?");
parser[1] = "Amazon Silk";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[119] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(AppleWebKit)/(\\d+)\\.?(\\d+)?\\+ .* Safari");
parser[1] = "WebKit Nightly";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[120] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*Safari/");
parser[1] = "Safari";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[121] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Safari)/\\d+");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[122] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(OLPC)/Update(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[123] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(OLPC)/Update()\\.(\\d+)");
parser[1] = 0;
parser[2] = "0";
parser[3] = 0;
parser[4] = 0;
exports.browser[124] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(SEMC\\-Browser)/(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[125] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Teleca)");
parser[1] = "Teleca Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[126] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Phantom)/V(\\d+)\\.(\\d+)");
parser[1] = "Phantom Browser";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[127] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(MSIE) (\\d+)\\.(\\d+)");
parser[1] = "IE";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[128] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(python-requests)/(\\d+)\\.(\\d+)");
parser[1] = "Python Requests";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[129] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Thunderbird)/(\\d+)\\.(\\d+)\\.?(\\d+)?");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[130] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Wget)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[131] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(curl)/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "cURL";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.browser[132] = parser;
exports.browser.length = 133;
exports.device = Object.create(null);
parser = Object.create(null);
parser[0] = new RegExp("HTC ([A-Z][a-z0-9]+) Build");
parser[1] = "HTC $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[0] = parser;
parser = Object.create(null);
parser[0] = new RegExp("HTC ([A-Z][a-z0-9 ]+) \\d+\\.\\d+\\.\\d+\\.\\d+");
parser[1] = "HTC $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[1] = parser;
parser = Object.create(null);
parser[0] = new RegExp("HTC_Touch_([A-Za-z0-9]+)");
parser[1] = "HTC Touch ($1)";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[2] = parser;
parser = Object.create(null);
parser[0] = new RegExp("USCCHTC(\\d+)");
parser[1] = "HTC $1 (US Cellular)";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[3] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Sprint APA(9292)");
parser[1] = "HTC $1 (Sprint)";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[4] = parser;
parser = Object.create(null);
parser[0] = new RegExp("HTC ([A-Za-z0-9]+ [A-Z])");
parser[1] = "HTC $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[5] = parser;
parser = Object.create(null);
parser[0] = new RegExp("HTC[-_/\\s]([A-Za-z0-9]+)");
parser[1] = "HTC $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[6] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(ADR[A-Za-z0-9]+)");
parser[1] = "HTC $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[7] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(HTC)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[8] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(QtCarBrowser)");
parser[1] = "Tesla Model S";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[9] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(SamsungSGHi560)");
parser[1] = "Samsung SGHi560";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[10] = parser;
parser = Object.create(null);
parser[0] = new RegExp("SonyEricsson([A-Za-z0-9]+)/");
parser[1] = "Ericsson $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[11] = parser;
parser = Object.create(null);
parser[0] = new RegExp("PLAYSTATION 3");
parser[1] = "PlayStation 3";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[12] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(PlayStation Portable)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[13] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(PlayStation Vita)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[14] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(KFOT Build)");
parser[1] = "Kindle Fire";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[15] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(KFTT Build)");
parser[1] = "Kindle Fire HD";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[16] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(KFJWI Build)");
parser[1] = "Kindle Fire HD 8.9\" WiFi";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[17] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(KFJWA Build)");
parser[1] = "Kindle Fire HD 8.9\" 4G";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[18] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Kindle Fire)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[19] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Kindle)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[20] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+))?");
parser[1] = "Kindle Fire";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[21] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Android[\\- ][\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{2}; WOWMobile (.+) Build");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[22] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Android[\\- ][\\d]+\\.[\\d]+\\-update1; [A-Za-z]{2}\\-[A-Za-z]{2}; (.+) Build");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[23] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Android[\\- ][\\d]+\\.[\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{2}; (.+) Build");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[24] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Android[\\- ][\\d]+\\.[\\d]+\\.[\\d]+;[A-Za-z]{2}\\-[A-Za-z]{2};(.+) Build");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[25] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Android[\\- ][\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{2}; (.+) Build");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[26] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Android[\\- ][\\d]+\\.[\\d]+\\.[\\d]+; (.+) Build");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[27] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Android[\\- ][\\d]+\\.[\\d]+; (.+) Build");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[28] = parser;
parser = Object.create(null);
parser[0] = new RegExp("NokiaN([0-9]+)");
parser[1] = "Nokia N$1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[29] = parser;
parser = Object.create(null);
parser[0] = new RegExp("NOKIA([A-Za-z0-9\\v-]+)");
parser[1] = "Nokia $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[30] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Nokia([A-Za-z0-9\\v-]+)");
parser[1] = "Nokia $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[31] = parser;
parser = Object.create(null);
parser[0] = new RegExp("NOKIA ([A-Za-z0-9\\-]+)");
parser[1] = "Nokia $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[32] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Nokia ([A-Za-z0-9\\-]+)");
parser[1] = "Nokia $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[33] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Lumia ([A-Za-z0-9\\-]+)");
parser[1] = "Lumia $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[34] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Symbian");
parser[1] = "Nokia";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[35] = parser;
parser = Object.create(null);
parser[0] = new RegExp("BB10; ([A-Za-z0-9\\- ]+)\\)");
parser[1] = "BlackBerry $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[36] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(PlayBook).+RIM Tablet OS");
parser[1] = "BlackBerry Playbook";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[37] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Black[Bb]erry ([0-9]+);");
parser[1] = "BlackBerry $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[38] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Black[Bb]erry([0-9]+)");
parser[1] = "BlackBerry $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[39] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Black[Bb]erry;");
parser[1] = "BlackBerry";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[40] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Pre)/(\\d+)\\.(\\d+)");
parser[1] = "Palm Pre";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[41] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Pixi)/(\\d+)\\.(\\d+)");
parser[1] = "Palm Pixi";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[42] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Touch[Pp]ad)/(\\d+)\\.(\\d+)");
parser[1] = "HP TouchPad";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[43] = parser;
parser = Object.create(null);
parser[0] = new RegExp("HPiPAQ([A-Za-z0-9]+)/(\\d+).(\\d+)");
parser[1] = "HP iPAQ $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[44] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Palm([A-Za-z0-9]+)");
parser[1] = "Palm $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[45] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Treo([A-Za-z0-9]+)");
parser[1] = "Palm Treo $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[46] = parser;
parser = Object.create(null);
parser[0] = new RegExp("webOS.*(P160UNA)/(\\d+).(\\d+)");
parser[1] = "HP Veer";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[47] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(AppleTV)");
parser[1] = "AppleTV";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[48] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPad) Simulator;");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[49] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPad);");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[50] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPod);");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[51] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPhone) Simulator;");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[52] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPhone);");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[53] = parser;
parser = Object.create(null);
parser[0] = new RegExp("acer_([A-Za-z0-9]+)_");
parser[1] = "Acer $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[54] = parser;
parser = Object.create(null);
parser[0] = new RegExp("acer_([A-Za-z0-9]+)_");
parser[1] = "Acer $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[55] = parser;
parser = Object.create(null);
parser[0] = new RegExp("ALCATEL-([A-Za-z0-9]+)");
parser[1] = "Alcatel $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[56] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Alcatel-([A-Za-z0-9]+)");
parser[1] = "Alcatel $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[57] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Amoi\\-([A-Za-z0-9]+)");
parser[1] = "Amoi $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[58] = parser;
parser = Object.create(null);
parser[0] = new RegExp("AMOI\\-([A-Za-z0-9]+)");
parser[1] = "Amoi $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[59] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Asus\\-([A-Za-z0-9]+)");
parser[1] = "Asus $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[60] = parser;
parser = Object.create(null);
parser[0] = new RegExp("ASUS\\-([A-Za-z0-9]+)");
parser[1] = "Asus $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[61] = parser;
parser = Object.create(null);
parser[0] = new RegExp("BIRD\\-([A-Za-z0-9]+)");
parser[1] = "Bird $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[62] = parser;
parser = Object.create(null);
parser[0] = new RegExp("BIRD\\.([A-Za-z0-9]+)");
parser[1] = "Bird $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[63] = parser;
parser = Object.create(null);
parser[0] = new RegExp("BIRD ([A-Za-z0-9]+)");
parser[1] = "Bird $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[64] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Dell ([A-Za-z0-9]+)");
parser[1] = "Dell $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[65] = parser;
parser = Object.create(null);
parser[0] = new RegExp("DoCoMo/2\\.0 ([A-Za-z0-9]+)");
parser[1] = "DoCoMo $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[66] = parser;
parser = Object.create(null);
parser[0] = new RegExp("([A-Za-z0-9]+)_W\\;FOMA");
parser[1] = "DoCoMo $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[67] = parser;
parser = Object.create(null);
parser[0] = new RegExp("([A-Za-z0-9]+)\\;FOMA");
parser[1] = "DoCoMo $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[68] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Huawei([A-Za-z0-9]+)");
parser[1] = "Huawei $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[69] = parser;
parser = Object.create(null);
parser[0] = new RegExp("HUAWEI-([A-Za-z0-9]+)");
parser[1] = "Huawei $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[70] = parser;
parser = Object.create(null);
parser[0] = new RegExp("vodafone([A-Za-z0-9]+)");
parser[1] = "Huawei Vodafone $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[71] = parser;
parser = Object.create(null);
parser[0] = new RegExp("i\\-mate ([A-Za-z0-9]+)");
parser[1] = "i-mate $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[72] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Kyocera\\-([A-Za-z0-9]+)");
parser[1] = "Kyocera $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[73] = parser;
parser = Object.create(null);
parser[0] = new RegExp("KWC\\-([A-Za-z0-9]+)");
parser[1] = "Kyocera $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[74] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Lenovo\\-([A-Za-z0-9]+)");
parser[1] = "Lenovo $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[75] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Lenovo_([A-Za-z0-9]+)");
parser[1] = "Lenovo $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[76] = parser;
parser = Object.create(null);
parser[0] = new RegExp("LG/([A-Za-z0-9]+)");
parser[1] = "LG $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[77] = parser;
parser = Object.create(null);
parser[0] = new RegExp("LG-LG([A-Za-z0-9]+)");
parser[1] = "LG $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[78] = parser;
parser = Object.create(null);
parser[0] = new RegExp("LGE-LG([A-Za-z0-9]+)");
parser[1] = "LG $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[79] = parser;
parser = Object.create(null);
parser[0] = new RegExp("LGE VX([A-Za-z0-9]+)");
parser[1] = "LG $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[80] = parser;
parser = Object.create(null);
parser[0] = new RegExp("LG ([A-Za-z0-9]+)");
parser[1] = "LG $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[81] = parser;
parser = Object.create(null);
parser[0] = new RegExp("LGE LG\\-AX([A-Za-z0-9]+)");
parser[1] = "LG $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[82] = parser;
parser = Object.create(null);
parser[0] = new RegExp("LG\\-([A-Za-z0-9]+)");
parser[1] = "LG $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[83] = parser;
parser = Object.create(null);
parser[0] = new RegExp("LGE\\-([A-Za-z0-9]+)");
parser[1] = "LG $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[84] = parser;
parser = Object.create(null);
parser[0] = new RegExp("LG([A-Za-z0-9]+)");
parser[1] = "LG $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[85] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(KIN)\\.One (\\d+)\\.(\\d+)");
parser[1] = "Microsoft $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[86] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(KIN)\\.Two (\\d+)\\.(\\d+)");
parser[1] = "Microsoft $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[87] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Motorola)\\-([A-Za-z0-9]+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[88] = parser;
parser = Object.create(null);
parser[0] = new RegExp("MOTO\\-([A-Za-z0-9]+)");
parser[1] = "Motorola $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[89] = parser;
parser = Object.create(null);
parser[0] = new RegExp("MOT\\-([A-Za-z0-9]+)");
parser[1] = "Motorola $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[90] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Nintendo WiiU)");
parser[1] = "Nintendo Wii U";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[91] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Nintendo (DS|3DS|DSi|Wii);");
parser[1] = "Nintendo $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[92] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Pantech([A-Za-z0-9]+)");
parser[1] = "Pantech $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[93] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Philips([A-Za-z0-9]+)");
parser[1] = "Philips $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[94] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Philips ([A-Za-z0-9]+)");
parser[1] = "Philips $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[95] = parser;
parser = Object.create(null);
parser[0] = new RegExp("SAMSUNG-([A-Za-z0-9\\-]+)");
parser[1] = "Samsung $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[96] = parser;
parser = Object.create(null);
parser[0] = new RegExp("SAMSUNG\\; ([A-Za-z0-9\\-]+)");
parser[1] = "Samsung $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[97] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Dreamcast");
parser[1] = "Sega Dreamcast";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[98] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Softbank/1\\.0/([A-Za-z0-9]+)");
parser[1] = "Softbank $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[99] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Softbank/2\\.0/([A-Za-z0-9]+)");
parser[1] = "Softbank $1";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[100] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(hiptop|avantgo|plucker|xiino|blazer|elaine|up.browser|up.link|mmp|smartphone|midp|wap|vodafone|o2|pocket|mobile|pda)");
parser[1] = "Generic Smartphone";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[101] = parser;
parser = Object.create(null);
parser[0] = new RegExp("^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\\-|airn|alav|asus|attw|au\\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bell|bird|bw\\-n|bw\\-u|beck|benq|bilb|blac|c55/|cdm\\-|chtm|capi|comp|cond|craw|dall|dbte|dc\\-s|dica|ds\\-d|ds12|dait|devi|dmob|doco|dopo|el49|erk0|esl8|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\\-|fly_|g\\-mo|g1 u|g560|gf\\-5|grun|gene|go.w|good|grad|hcit|hd\\-m|hd\\-p|hd\\-t|hei\\-|hp i|hpip|hs\\-c|htc |htc\\-|htca|htcg)");
parser[1] = "Generic Feature Phone";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[102] = parser;
parser = Object.create(null);
parser[0] = new RegExp("^(htcp|htcs|htct|htc_|haie|hita|huaw|hutc|i\\-20|i\\-go|i\\-ma|i230|iac|iac\\-|iac/|ig01|im1k|inno|iris|jata|java|kddi|kgt|kgt/|kpt |kwc\\-|klon|lexi|lg g|lg\\-a|lg\\-b|lg\\-c|lg\\-d|lg\\-f|lg\\-g|lg\\-k|lg\\-l|lg\\-m|lg\\-o|lg\\-p|lg\\-s|lg\\-t|lg\\-u|lg\\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\\-|lge/|lynx|leno|m1\\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\\-|nem\\-|newg|neon)");
parser[1] = "Generic Feature Phone";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[103] = parser;
parser = Object.create(null);
parser[0] = new RegExp("^(netf|noki|nzph|o2 x|o2\\-x|opwv|owg1|opti|oran|ot\\-s|p800|pand|pg\\-1|pg\\-2|pg\\-3|pg\\-6|pg\\-8|pg\\-c|pg13|phil|pn\\-2|pt\\-g|palm|pana|pire|pock|pose|psio|qa\\-a|qc\\-2|qc\\-3|qc\\-5|qc\\-7|qc07|qc12|qc21|qc32|qc60|qci\\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\\-|scp\\-|sdk/|se47|sec\\-|sec0|sec1|semc|sgh\\-|shar|sie\\-|sk\\-0|sl45|slid|smb3|smt5|sp01|sph\\-|spv |spv\\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\\-mo|t218|t250|t600|t610|t618|tcl\\-|tdg\\-|telm|tim\\-|ts70|tsm\\-|tsm3|tsm5|tx\\-9|tagt)");
parser[1] = "Generic Feature Phone";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[104] = parser;
parser = Object.create(null);
parser[0] = new RegExp("^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vite|voda|vulc|w3c |w3c\\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\\-|your|zte\\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\\-|webc|whit|wmlb|xda\\-|xda_)");
parser[1] = "Generic Feature Phone";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[105] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\\-webcrawler|converacrawler|dataparksearch|findlinks)");
parser[1] = "Spider";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.device[106] = parser;
exports.device.length = 107;
exports.os = Object.create(null);
parser = Object.create(null);
parser[0] = new RegExp("(Android) (\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+))?");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[0] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Android)\\-(\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+))?");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[1] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Android) Donut");
parser[1] = 0;
parser[2] = "1";
parser[3] = "2";
parser[4] = 0;
exports.os[2] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Android) Eclair");
parser[1] = 0;
parser[2] = "2";
parser[3] = "1";
parser[4] = 0;
exports.os[3] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Android) Froyo");
parser[1] = 0;
parser[2] = "2";
parser[3] = "2";
parser[4] = 0;
exports.os[4] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Android) Gingerbread");
parser[1] = 0;
parser[2] = "2";
parser[3] = "3";
parser[4] = 0;
exports.os[5] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Android) Honeycomb");
parser[1] = 0;
parser[2] = "3";
parser[3] = 0;
parser[4] = 0;
exports.os[6] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Silk-Accelerated=[a-z]{4,5})");
parser[1] = "Android";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[7] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Windows (?:NT 5\\.2|NT 5\\.1))");
parser[1] = "Windows XP";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[8] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(XBLWP7)");
parser[1] = "Windows Phone";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[9] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Windows NT 6\\.1)");
parser[1] = "Windows 7";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[10] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Windows NT 6\\.0)");
parser[1] = "Windows Vista";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[11] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\\.0|Windows Vista|Windows 2000|Windows 3.1)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[12] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Windows NT 6\\.2; ARM;)");
parser[1] = "Windows RT";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[13] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Windows NT 6\\.2)");
parser[1] = "Windows 8";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[14] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Windows NT 5\\.0)");
parser[1] = "Windows 2000";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[15] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Windows Phone) (\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[16] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Windows Phone) OS (\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[17] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Windows ?Mobile)");
parser[1] = "Windows Mobile";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[18] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(WinNT4.0)");
parser[1] = "Windows NT 4.0";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[19] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Win98)");
parser[1] = "Windows 98";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[20] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Tizen)/(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[21] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Mac OS X) (\\d+)[_.](\\d+)(?:[_.](\\d+))?");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[22] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Mac_PowerPC");
parser[1] = "Mac OS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[23] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(?:PPC|Intel) (Mac OS X)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[24] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(CPU OS|iPhone OS) (\\d+)_(\\d+)(?:_(\\d+))?");
parser[1] = "iOS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[25] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPhone|iPad|iPod); Opera");
parser[1] = "iOS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[26] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(iPhone|iPad|iPod).*Mac OS X.*Version/(\\d+)\\.(\\d+)");
parser[1] = "iOS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[27] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(AppleTV)/(\\d+)\\.(\\d+)");
parser[1] = "ATV OS X";
parser[2] = "$1";
parser[3] = "$2";
parser[4] = 0;
exports.os[28] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(CrOS) [a-z0-9_]+ (\\d+)\\.(\\d+)(?:\\.(\\d+))?");
parser[1] = "Chrome OS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[29] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Debian)-(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[30] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Linux Mint)(?:/(\\d+))?");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[31] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Mandriva)(?: Linux)?/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[32] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Symbian[Oo][Ss])/(\\d+)\\.(\\d+)");
parser[1] = "Symbian OS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[33] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Symbian/3).+NokiaBrowser/7\\.3");
parser[1] = "Symbian^3 Anna";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[34] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Symbian/3).+NokiaBrowser/7\\.4");
parser[1] = "Symbian^3 Belle";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[35] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Symbian/3)");
parser[1] = "Symbian^3";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[36] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Series 60|SymbOS|S60)");
parser[1] = "Symbian OS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[37] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(MeeGo)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[38] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Symbian [Oo][Ss]");
parser[1] = "Symbian OS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[39] = parser;
parser = Object.create(null);
parser[0] = new RegExp("Series40;");
parser[1] = "Nokia Series 40";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[40] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(BB10);.+Version/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "BlackBerry OS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[41] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Black[Bb]erry)[0-9a-z]+/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?");
parser[1] = "BlackBerry OS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[42] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Black[Bb]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?");
parser[1] = "BlackBerry OS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[43] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(RIM Tablet OS) (\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "BlackBerry Tablet OS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[44] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Play[Bb]ook)");
parser[1] = "BlackBerry Tablet OS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[45] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Black[Bb]erry)");
parser[1] = "BlackBerry OS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[46] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(BREW)[ /](\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[47] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(BREW);");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[48] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Brew MP|BMP)[ /](\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = "Brew MP";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[49] = parser;
parser = Object.create(null);
parser[0] = new RegExp("BMP;");
parser[1] = "Brew MP";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[50] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(GoogleTV) (\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[51] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(GoogleTV)\\/\\d+");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[52] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+))?");
parser[1] = "webOS";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[53] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(VRE);");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[54] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(SUSE|Fedora|Red Hat|PCLinuxOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[55] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(SUSE|Fedora|Red Hat|Puppy|PCLinuxOS|CentOS)/(\\d+)\\.(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[56] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Red Hat|Slackware)/(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[57] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Windows|OpenBSD|FreeBSD|NetBSD|Ubuntu|Kubuntu|Android|Arch Linux|CentOS|WeTab|Slackware)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[58] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Linux)/(\\d+)\\.(\\d+)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[59] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Linux|BSD)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[60] = parser;
parser = Object.create(null);
parser[0] = new RegExp("SunOS");
parser[1] = "Solaris";
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[61] = parser;
parser = Object.create(null);
parser[0] = new RegExp("(Red Hat)");
parser[1] = 0;
parser[2] = 0;
parser[3] = 0;
parser[4] = 0;
exports.os[62] = parser;
exports.os.length = 63;

@@ -30,3 +30,3 @@ 'use strict';

if (!err && source) {
if (source) {
fs.writeFile(exports.output, source, function idk(err) {

@@ -46,3 +46,3 @@ if (err) {

sources.forEach(function parser(data) {
var data = sources.reduce(function parser(memo, data) {
// Try to repair some of the odd structures that are in the yaml files

@@ -60,52 +60,87 @@ // before parsing it so we generate a uniform structure:

callback(e);
return callback = null;
callback = null;
return memo;
}
[
{ resource: 'user_agent_parsers', replacement: 'family_replacement' }
, { resource: 'device_parsers', replacement: 'device_replacement' }
, { resource: 'os_parsers', replacement: 'os_replacement' }
].forEach(function parsing(details) {
results[details.resource] = results[details.resource] || [];
// merge the data with the memo;
Object.keys(data).forEach(function (key) {
var results = data[key];
memo[key] = memo[key] || [];
var resources = data[details.resource]
, resource
, parser;
for (var i = 0, l = results.length; i < l; i++) {
memo[key].push(results[i]);
}
});
for (var i = 0, l = resources.length; i < l; i++) {
resource = resources[i];
return memo;
}, {});
// We need to JSON stringify the data to properly add slashes escape other
// kinds of crap in the RegularExpression. If we don't do thing we get
// some illegal token warnings.
parser = 'new RegExp('+ JSON.stringify(resource.regex) + ')';
[
{
resource: 'user_agent_parsers'
, replacement: 'family_replacement'
, name: 'browser'
}
, {
resource: 'device_parsers'
, replacement: 'device_replacement'
, name: 'device'
}
, {
resource: 'os_parsers'
, replacement: 'os_replacement'
, name: 'os'
}
].forEach(function parsing(details) {
results[details.resource] = results[details.resource] || [];
// Check if we have replacement for the parsed family name
if (resource[details.replacement]) {
parser += ', "'+ resource[details.replacement].replace('"', '\\"') +'"';
} else {
parser += ', 0';
}
var resources = data[details.resource]
, name = details.resource.replace('_parsers', '')
, resource
, parser;
if (resource.v1_replacement) {
parser += ', "'+ resource.v1_replacement.replace('"', '\\"') +'"';
} else {
parser += ', 0';
}
for (var i = 0, l = resources.length; i < l; i++) {
resource = resources[i];
if (resource.v2_replacement) {
parser += ', "'+ resource.v2_replacement.replace('"', '\\"') +'"';
} else {
parser += ', 0';
}
// We need to JSON stringify the data to properly add slashes escape other
// kinds of crap in the RegularExpression. If we don't do thing we get
// some illegal token warnings.
parser = 'parser = Object.create(null);\n';
parser += 'parser[0] = new RegExp('+ JSON.stringify(resource.regex) + ');\n';
if (resource.v3_replacement) {
parser += ', "'+ resource.v3_replacement.replace('"', '\\"') +'"';
} else {
parser += ', 0';
}
// Check if we have replacement for the parsed family name
if (resource[details.replacement]) {
parser += 'parser[1] = "'+ resource[details.replacement].replace('"', '\\"') +'";';
} else {
parser += 'parser[1] = 0;';
}
results[details.resource].push('[ ' + parser + ' ]');
parser += '\n';
if (resource.v1_replacement) {
parser += 'parser[2] = "'+ resource.v1_replacement.replace('"', '\\"') +'";';
} else {
parser += 'parser[2] = 0;';
}
});
parser += '\n';
if (resource.v2_replacement) {
parser += 'parser[3] = "'+ resource.v2_replacement.replace('"', '\\"') +'";';
} else {
parser += 'parser[3] = 0;';
}
parser += '\n';
if (resource.v3_replacement) {
parser += 'parser[4] = "'+ resource.v3_replacement.replace('"', '\\"') +'";';
} else {
parser += 'parser[4] = 0;';
}
parser += '\n';
parser += 'exports.'+ details.name +'['+ i +'] = parser;';
results[details.resource].push(parser);
}
});

@@ -119,5 +154,14 @@

var regexps = [
'exports.browser = [\n '+ results.user_agent_parsers.join('\n , ') +'\n];'
, 'exports.device = [\n '+ results.device_parsers.join('\n , ') +'\n];'
, 'exports.os = [\n '+ results.os_parsers.join('\n , ') +'\n];'
'var parser;'
, 'exports.browser = Object.create(null);'
, results.user_agent_parsers.join('\n')
, 'exports.browser.length = '+ results.user_agent_parsers.length +';'
, 'exports.device = Object.create(null);'
, results.device_parsers.join('\n')
, 'exports.device.length = '+ results.device_parsers.length +';'
, 'exports.os = Object.create(null);'
, results.os_parsers.join('\n')
, 'exports.os.length = '+ results.os_parsers.length +';'
].join('\n\n');

@@ -135,3 +179,3 @@

try { vm.runInNewContext(regexps, sandbox, 'validating.vm'); }
catch (e) { return callback(e); }
catch (e) { return callback(e, null, regexps); }

@@ -138,0 +182,0 @@ callback(undefined, sandbox.exports, regexps);

{
"name": "useragent"
, "version": "2.0.0"
, "version": "2.0.1"
, "description": "Fastest, most accurate & effecient user agent string parser, uses browserscope's research for parsing"

@@ -5,0 +5,0 @@ , "author": "Arnout Kazemier"

@@ -29,12 +29,12 @@ # useragent - high performance user agent parser for Node.js

Executed benchmark against node module: "useragent"
Count (49), Cycles (4), Elapsed (5.531), Hz (946.8647887795141)
Count (61), Cycles (5), Elapsed (5.559), Hz (1141.3739447904327)
Executed benchmark against node module: "useragent_parser"
Count (25), Cycles (2), Elapsed (5.359), Hz (463.63241573609633)
Count (29), Cycles (3), Elapsed (5.448), Hz (545.6817291171243)
Executed benchmark against node module: "useragent-parser"
Count (13), Cycles (4), Elapsed (5.468), Hz (246.70547120951275)
Count (16), Cycles (4), Elapsed (5.48), Hz (304.5373431830105)
Executed benchmark against node module: "ua-parser"
Count (13), Cycles (3), Elapsed (5.481), Hz (243.57388988788998)
Count (54), Cycles (3), Elapsed (5.512), Hz (1018.7561434659247)

@@ -365,2 +365,4 @@ Module: "useragent" is the user agent fastest parser.

still a string only representation do `agent.os.toString()`.
- `semver` has been removed from the dependencies, so if you are using the
`require('useragent/features')` you need to add it to your own dependencies

@@ -367,0 +369,0 @@ #### Upgrading from 0.1.2 to 1.0.0

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc