ua-parser-js 0.7.19 → 0.7.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ua-parser-js might be problematic. Click here for more details.

package/src/ua-parser.js CHANGED
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * UAParser.js v0.7.19
2
+ * UAParser.js v0.7.23
3
3
  * Lightweight JavaScript-based User-Agent string parser
4
4
  * https://github.com/faisalman/ua-parser-js
5
5
  *
6
- * Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com>
7
- * Dual licensed under GPLv2 or MIT
6
+ * Copyright © 2012-2019 Faisal Salman <f@faisalman.com>
7
+ * Licensed under MIT License
8
8
  */
9
9
 
10
10
  (function (window, undefined) {
@@ -16,7 +16,7 @@
16
16
  /////////////
17
17
 
18
18
 
19
- var LIBVERSION = '0.7.19',
19
+ var LIBVERSION = '0.7.23',
20
20
  EMPTY = '',
21
21
  UNKNOWN = '?',
22
22
  FUNC_TYPE = 'function',
@@ -45,15 +45,15 @@
45
45
 
46
46
  var util = {
47
47
  extend : function (regexes, extensions) {
48
- var margedRegexes = {};
48
+ var mergedRegexes = {};
49
49
  for (var i in regexes) {
50
50
  if (extensions[i] && extensions[i].length % 2 === 0) {
51
- margedRegexes[i] = extensions[i].concat(regexes[i]);
51
+ mergedRegexes[i] = extensions[i].concat(regexes[i]);
52
52
  } else {
53
- margedRegexes[i] = regexes[i];
53
+ mergedRegexes[i] = regexes[i];
54
54
  }
55
55
  }
56
- return margedRegexes;
56
+ return mergedRegexes;
57
57
  },
58
58
  has : function (str1, str2) {
59
59
  if (typeof str1 === "string") {
@@ -83,14 +83,7 @@
83
83
 
84
84
  rgx : function (ua, arrays) {
85
85
 
86
- //var result = {},
87
- var i = 0, j, k, p, q, matches, match;//, args = arguments;
88
-
89
- /*// construct object barebones
90
- for (p = 0; p < args[1].length; p++) {
91
- q = args[1][p];
92
- result[typeof q === OBJ_TYPE ? q[0] : q] = undefined;
93
- }*/
86
+ var i = 0, j, k, p, q, matches, match;
94
87
 
95
88
  // loop through all regexes maps
96
89
  while (i < arrays.length && !matches) {
@@ -138,8 +131,6 @@
138
131
  }
139
132
  i += 2;
140
133
  }
141
- // console.log(this);
142
- //return this;
143
134
  },
144
135
 
145
136
  str : function (str, map) {
@@ -231,7 +222,7 @@
231
222
 
232
223
  // Presto based
233
224
  /(opera\smini)\/([\w\.-]+)/i, // Opera Mini
234
- /(opera\s[mobiletab]+).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
225
+ /(opera\s[mobiletab]{3,6}).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
235
226
  /(opera).+version\/([\w\.]+)/i, // Opera > 9.80
236
227
  /(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
237
228
  ], [NAME, VERSION], [
@@ -246,27 +237,36 @@
246
237
  /(kindle)\/([\w\.]+)/i, // Kindle
247
238
  /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i,
248
239
  // Lunascape/Maxthon/Netfront/Jasmine/Blazer
249
-
250
240
  // Trident based
251
- /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,
252
- // Avant/IEMobile/SlimBrowser/Baidu
241
+ /(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i,
242
+ // Avant/IEMobile/SlimBrowser
243
+ /(bidubrowser|baidubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
253
244
  /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
254
245
 
255
246
  // Webkit/KHTML based
256
247
  /(rekonq)\/([\w\.]*)/i, // Rekonq
257
- /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark)\/([\w\.-]+)/i
258
- // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser
248
+ /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i
249
+ // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
259
250
  ], [NAME, VERSION], [
260
251
 
261
- /(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
252
+ /(konqueror)\/([\w\.]+)/i // Konqueror
253
+ ], [[NAME, 'Konqueror'], VERSION], [
254
+
255
+ /(trident).+rv[:\s]([\w\.]{1,9}).+like\sgecko/i // IE11
262
256
  ], [[NAME, 'IE'], VERSION], [
263
257
 
264
- /(edge|edgios|edga)\/((\d+)?[\w\.]+)/i // Microsoft Edge
258
+ /(edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i // Microsoft Edge
265
259
  ], [[NAME, 'Edge'], VERSION], [
266
260
 
267
261
  /(yabrowser)\/([\w\.]+)/i // Yandex
268
262
  ], [[NAME, 'Yandex'], VERSION], [
269
263
 
264
+ /(Avast)\/([\w\.]+)/i // Avast Secure Browser
265
+ ], [[NAME, 'Avast Secure Browser'], VERSION], [
266
+
267
+ /(AVG)\/([\w\.]+)/i // AVG Secure Browser
268
+ ], [[NAME, 'AVG Secure Browser'], VERSION], [
269
+
270
270
  /(puffin)\/([\w\.]+)/i // Puffin
271
271
  ], [[NAME, 'Puffin'], VERSION], [
272
272
 
@@ -282,12 +282,18 @@
282
282
  /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
283
283
  ], [[NAME, /_/g, ' '], VERSION], [
284
284
 
285
+ /(windowswechat qbcore)\/([\w\.]+)/i // WeChat Desktop for Windows Built-in Browser
286
+ ], [[NAME, 'WeChat(Win) Desktop'], VERSION], [
287
+
285
288
  /(micromessenger)\/([\w\.]+)/i // WeChat
286
289
  ], [[NAME, 'WeChat'], VERSION], [
287
290
 
288
- /(brave)\/([\w\.]+)/i // Brave browser
291
+ /(brave)\/([\w\.]+)/i // Brave browser
289
292
  ], [[NAME, 'Brave'], VERSION], [
290
293
 
294
+ /(whale)\/([\w\.]+)/i // Whale browser
295
+ ], [[NAME, 'Whale'], VERSION], [
296
+
291
297
  /(qqbrowserlite)\/([\w\.]+)/i // QQBrowserLite
292
298
  ], [NAME, VERSION], [
293
299
 
@@ -297,7 +303,7 @@
297
303
  /m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
298
304
  ], [NAME, VERSION], [
299
305
 
300
- /(BIDUBrowser)[\/\s]?([\w\.]+)/i // Baidu Browser
306
+ /(baiduboxapp)[\/\s]?([\w\.]+)/i // Baidu App
301
307
  ], [NAME, VERSION], [
302
308
 
303
309
  /(2345Explorer)[\/\s]?([\w\.]+)/i // 2345 Browser
@@ -306,14 +312,17 @@
306
312
  /(MetaSr)[\/\s]?([\w\.]+)/i // SouGouBrowser
307
313
  ], [NAME], [
308
314
 
309
- /(LBBROWSER)/i // LieBao Browser
315
+ /(LBBROWSER)/i // LieBao Browser
310
316
  ], [NAME], [
311
317
 
312
318
  /xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
313
319
  ], [VERSION, [NAME, 'MIUI Browser']], [
314
320
 
315
- /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
321
+ /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android with version
316
322
  ], [VERSION, [NAME, 'Facebook']], [
323
+
324
+ /FBAN\/FBIOS|FB_IAB\/FB4A/i // Facebook App for iOS & Android without version
325
+ ], [[NAME, 'Facebook']], [
317
326
 
318
327
  /safari\s(line)\/([\w\.]+)/i, // Line App for iOS
319
328
  /android.+(line)\/([\w\.]+)\/iab/i // Line App for Android
@@ -331,6 +340,9 @@
331
340
  /android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
332
341
  ], [VERSION, [NAME, 'Android Browser']], [
333
342
 
343
+ /(sailfishbrowser)\/([\w\.]+)/i // Sailfish Browser
344
+ ], [[NAME, 'Sailfish Browser'], VERSION], [
345
+
334
346
  /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
335
347
  // Chrome/OmniWeb/Arora/Tizen/Nokia
336
348
  ], [NAME, VERSION], [
@@ -338,6 +350,9 @@
338
350
  /(dolfin)\/([\w\.]+)/i // Dolphin
339
351
  ], [[NAME, 'Dolphin'], VERSION], [
340
352
 
353
+ /(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
354
+ ], [[NAME, '360 Browser']], [
355
+
341
356
  /((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
342
357
  ], [[NAME, 'Chrome'], VERSION], [
343
358
 
@@ -347,19 +362,18 @@
347
362
  /fxios\/([\w\.-]+)/i // Firefox for iOS
348
363
  ], [VERSION, [NAME, 'Firefox']], [
349
364
 
350
- /version\/([\w\.]+).+?mobile\/\w+\s(safari)/i // Mobile Safari
365
+ /version\/([\w\.]+)\s.*mobile\/\w+\s(safari)/i // Mobile Safari
351
366
  ], [VERSION, [NAME, 'Mobile Safari']], [
352
367
 
353
- /version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
368
+ /version\/([\w\.]+)\s.*(mobile\s?safari|safari)/i // Safari & Safari Mobile
354
369
  ], [VERSION, NAME], [
355
370
 
356
- /webkit.+?(gsa)\/([\w\.]+).+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Google Search Appliance on iOS
371
+ /webkit.+?(gsa)\/([\w\.]+)\s.*(mobile\s?safari|safari)(\/[\w\.]+)/i // Google Search Appliance on iOS
357
372
  ], [[NAME, 'GSA'], VERSION], [
358
373
 
359
374
  /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
360
375
  ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
361
376
 
362
- /(konqueror)\/([\w\.]+)/i, // Konqueror
363
377
  /(webkit|khtml)\/([\w\.]+)/i
364
378
  ], [NAME, VERSION], [
365
379
 
@@ -372,7 +386,8 @@
372
386
  /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,
373
387
 
374
388
  // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
375
- /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
389
+ /(firefox)\/([\w\.]+)\s[\w\s\-]+\/[\w\.]+$/i, // Other Firefox-based
390
+ /(mozilla)\/([\w\.]+)\s.+rv\:.+gecko\/\d+/i, // Mozilla
376
391
 
377
392
  // Other
378
393
  /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,
@@ -382,117 +397,6 @@
382
397
  /(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
383
398
  /(mosaic)[\/\s]([\w\.]+)/i // Mosaic
384
399
  ], [NAME, VERSION]
385
-
386
- /* /////////////////////
387
- // Media players BEGIN
388
- ////////////////////////
389
-
390
- , [
391
-
392
- /(apple(?:coremedia|))\/((\d+)[\w\._]+)/i, // Generic Apple CoreMedia
393
- /(coremedia) v((\d+)[\w\._]+)/i
394
- ], [NAME, VERSION], [
395
-
396
- /(aqualung|lyssna|bsplayer)\/((\d+)?[\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
397
- ], [NAME, VERSION], [
398
-
399
- /(ares|ossproxy)\s((\d+)[\w\.-]+)/i // Ares/OSSProxy
400
- ], [NAME, VERSION], [
401
-
402
- /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/((\d+)[\w\.-]+)/i,
403
- // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
404
- // NSPlayer/PSP-InternetRadioPlayer/Videos
405
- /(clementine|music player daemon)\s((\d+)[\w\.-]+)/i, // Clementine/MPD
406
- /(lg player|nexplayer)\s((\d+)[\d\.]+)/i,
407
- /player\/(nexplayer|lg player)\s((\d+)[\w\.-]+)/i // NexPlayer/LG Player
408
- ], [NAME, VERSION], [
409
- /(nexplayer)\s((\d+)[\w\.-]+)/i // Nexplayer
410
- ], [NAME, VERSION], [
411
-
412
- /(flrp)\/((\d+)[\w\.-]+)/i // Flip Player
413
- ], [[NAME, 'Flip Player'], VERSION], [
414
-
415
- /(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
416
- // FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
417
- ], [NAME], [
418
-
419
- /(gstreamer) souphttpsrc (?:\([^\)]+\)){0,1} libsoup\/((\d+)[\w\.-]+)/i
420
- // Gstreamer
421
- ], [NAME, VERSION], [
422
-
423
- /(htc streaming player)\s[\w_]+\s\/\s((\d+)[\d\.]+)/i, // HTC Streaming Player
424
- /(java|python-urllib|python-requests|wget|libcurl)\/((\d+)[\w\.-_]+)/i,
425
- // Java/urllib/requests/wget/cURL
426
- /(lavf)((\d+)[\d\.]+)/i // Lavf (FFMPEG)
427
- ], [NAME, VERSION], [
428
-
429
- /(htc_one_s)\/((\d+)[\d\.]+)/i // HTC One S
430
- ], [[NAME, /_/g, ' '], VERSION], [
431
-
432
- /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+){0,1})/i
433
- // MPlayer SVN
434
- ], [NAME, VERSION], [
435
-
436
- /(mplayer)(?:\s|\/|[unkow-]+)((\d+)[\w\.-]+)/i // MPlayer
437
- ], [NAME, VERSION], [
438
-
439
- /(mplayer)/i, // MPlayer (no other info)
440
- /(yourmuze)/i, // YourMuze
441
- /(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
442
- ], [NAME], [
443
-
444
- /(nero (?:home|scout))\/((\d+)[\w\.-]+)/i // Nero Home/Nero Scout
445
- ], [NAME, VERSION], [
446
-
447
- /(nokia\d+)\/((\d+)[\w\.-]+)/i // Nokia
448
- ], [NAME, VERSION], [
449
-
450
- /\s(songbird)\/((\d+)[\w\.-]+)/i // Songbird/Philips-Songbird
451
- ], [NAME, VERSION], [
452
-
453
- /(winamp)3 version ((\d+)[\w\.-]+)/i, // Winamp
454
- /(winamp)\s((\d+)[\w\.-]+)/i,
455
- /(winamp)mpeg\/((\d+)[\w\.-]+)/i
456
- ], [NAME, VERSION], [
457
-
458
- /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
459
- // inlight radio
460
- ], [NAME], [
461
-
462
- /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/((\d+)[\w\.-]+)/i
463
- // QuickTime/RealMedia/RadioApp/RadioClientApplication/
464
- // SoundTap/Totem/Stagefright/Streamium
465
- ], [NAME, VERSION], [
466
-
467
- /(smp)((\d+)[\d\.]+)/i // SMP
468
- ], [NAME, VERSION], [
469
-
470
- /(vlc) media player - version ((\d+)[\w\.]+)/i, // VLC Videolan
471
- /(vlc)\/((\d+)[\w\.-]+)/i,
472
- /(xbmc|gvfs|xine|xmms|irapp)\/((\d+)[\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
473
- /(foobar2000)\/((\d+)[\d\.]+)/i, // Foobar2000
474
- /(itunes)\/((\d+)[\d\.]+)/i // iTunes
475
- ], [NAME, VERSION], [
476
-
477
- /(wmplayer)\/((\d+)[\w\.-]+)/i, // Windows Media Player
478
- /(windows-media-player)\/((\d+)[\w\.-]+)/i
479
- ], [[NAME, /-/g, ' '], VERSION], [
480
-
481
- /windows\/((\d+)[\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i
482
- // Windows Media Server
483
- ], [VERSION, [NAME, 'Windows']], [
484
-
485
- /(com\.riseupradioalarm)\/((\d+)[\d\.]*)/i // RiseUP Radio Alarm
486
- ], [NAME, VERSION], [
487
-
488
- /(rad.io)\s((\d+)[\d\.]+)/i, // Rad.io
489
- /(radio.(?:de|at|fr))\s((\d+)[\d\.]+)/i
490
- ], [[NAME, 'rad.io'], VERSION]
491
-
492
- //////////////////////
493
- // Media players END
494
- ////////////////////*/
495
-
496
400
  ],
497
401
 
498
402
  cpu : [[
@@ -523,14 +427,14 @@
523
427
 
524
428
  device : [[
525
429
 
526
- /\((ipad|playbook);[\w\s\);-]+(rim|apple)/i // iPad/PlayBook
430
+ /\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i // iPad/PlayBook
527
431
  ], [MODEL, VENDOR, [TYPE, TABLET]], [
528
432
 
529
433
  /applecoremedia\/[\w\.]+ \((ipad)/ // iPad
530
434
  ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
531
435
 
532
436
  /(apple\s{0,1}tv)/i // Apple TV
533
- ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple']], [
437
+ ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple'], [TYPE, SMARTTV]], [
534
438
 
535
439
  /(archos)\s(gamepad2?)/i, // Archos
536
440
  /(hp).+(touchpad)/i, // HP TouchPad
@@ -540,9 +444,9 @@
540
444
  /(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
541
445
  ], [VENDOR, MODEL, [TYPE, TABLET]], [
542
446
 
543
- /(kf[A-z]+)\sbuild\/.+silk\//i // Kindle Fire HD
447
+ /(kf[A-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD
544
448
  ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
545
- /(sd|kf)[0349hijorstuw]+\sbuild\/.+silk\//i // Fire Phone
449
+ /(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone
546
450
  ], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
547
451
  /android.+aft([bms])\sbuild/i // Fire TV
548
452
  ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
@@ -561,13 +465,13 @@
561
465
  /\(bb10;\s(\w+)/i // BlackBerry 10
562
466
  ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
563
467
  // Asus Tablets
564
- /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i
468
+ /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i
565
469
  ], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
566
470
 
567
471
  /(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
568
472
  /(sony)?(?:sgp.+)\sbuild\//i
569
473
  ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
570
- /android.+\s([c-g]\d{4}|so[-l]\w+)\sbuild\//i
474
+ /android.+\s([c-g]\d{4}|so[-l]\w+)(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
571
475
  ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
572
476
 
573
477
  /\s(ouya)\s/i, // Ouya
@@ -583,22 +487,23 @@
583
487
  /(sprint\s(\w+))/i // Sprint Phones
584
488
  ], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
585
489
 
586
- /(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i // Lenovo tablets
587
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
588
-
589
- /(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
490
+ /(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
590
491
  /(zte)-(\w*)/i, // ZTE
591
- /(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
592
- // Alcatel/GeeksPhone/Lenovo/Nexian/Panasonic/Sony
492
+ /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
493
+ // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
593
494
  ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
594
495
 
595
496
  /(nexus\s9)/i // HTC Nexus 9
596
497
  ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
597
498
 
598
- /d\/huawei([\w\s-]+)[;\)]/i,
599
- /(nexus\s6p)/i // Huawei
499
+ /d\/huawei([\w\s-]+)[;\)]/i, // Huawei
500
+ /android.+\s(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?)/i
501
+
600
502
  ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
601
503
 
504
+ /android.+(bah2?-a?[lw]\d{2})/i // Huawei MediaPad
505
+ ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
506
+
602
507
  /(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
603
508
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
604
509
 
@@ -625,7 +530,7 @@
625
530
  /\(dtv[\);].+(aquos)/i // Sharp
626
531
  ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
627
532
 
628
- /android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,
533
+ /android.+((sch-i[89]0\d|shw-m380s|SM-P605|SM-P610|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,
629
534
  /((SM-T\w+))/i
630
535
  ], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
631
536
  /smart-tv.+(samsung)/i
@@ -642,22 +547,27 @@
642
547
  /(nokia)[\s_-]?([\w-]*)/i
643
548
  ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
644
549
 
645
- /android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer
550
+ /android[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i // Acer
646
551
  ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
647
552
 
648
553
  /android.+([vl]k\-?\d{3})\s+build/i // LG Tablet
649
554
  ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
650
555
  /android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
651
556
  ], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
652
- /(lg) netcast\.tv/i // LG SmartTV
653
- ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
557
+ /linux;\snetcast.+smarttv/i, // LG SmartTV
558
+ /lg\snetcast\.tv-201\d/i
559
+ ], [[VENDOR, 'LG'], MODEL, [TYPE, SMARTTV]], [
654
560
  /(nexus\s[45])/i, // LG
655
561
  /lg[e;\s\/-]+(\w*)/i,
656
562
  /android.+lg(\-?[\d\w]+)\s+build/i
657
563
  ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
658
564
 
565
+ /(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+))/i // Lenovo tablets
566
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
659
567
  /android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
660
568
  ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
569
+ /(lenovo)[_\s-]?([\w-]+)/i
570
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
661
571
 
662
572
  /linux;.+((jolla));/i // Jolla
663
573
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
@@ -669,7 +579,7 @@
669
579
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
670
580
 
671
581
  /crkey/i // Google Chromecast
672
- ], [[MODEL, 'Chromecast'], [VENDOR, 'Google']], [
582
+ ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
673
583
 
674
584
  /android.+;\s(glass)\s\d/i // Google Glass
675
585
  ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
@@ -677,29 +587,31 @@
677
587
  /android.+;\s(pixel c)[\s)]/i // Google Pixel C
678
588
  ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
679
589
 
680
- /android.+;\s(pixel( [23])?( xl)?)\s/i // Google Pixel
590
+ /android.+;\s(pixel( [2-9]a?)?( xl)?)[\s)]/i // Google Pixel
681
591
  ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
682
592
 
683
593
  /android.+;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
684
- /android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
685
- /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i, // Xiaomi Mi
686
- /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i // Redmi Phones
594
+ /android.+(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi
595
+ /android.+(redmi[\s\-_]?(?:note|k)?(?:[\s_]?[\w\s]+))(?:\sbuild|\))/i,
596
+ // Xiaomi Redmi
597
+ /android.+(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i
598
+ // Xiaomi Mi
687
599
  ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
688
- /android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i // Mi Pad tablets
600
+ /android.+(mi[\s\-_]?(?:pad)(?:[\s_]?[\w\s]+))(?:\sbuild|\))/i // Mi Pad tablets
689
601
  ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
690
- /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu Tablet
691
- ], [MODEL, [VENDOR, 'Meizu'], [TYPE, TABLET]], [
692
- /(mz)-([\w-]{2,})/i // Meizu Phone
602
+ /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu
603
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
604
+ /(mz)-([\w-]{2,})/i
693
605
  ], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
694
606
 
695
607
  /android.+a000(1)\s+build/i, // OnePlus
696
- /android.+oneplus\s(a\d{4})\s+build/i
608
+ /android.+oneplus\s(a\d{4})[\s)]/i
697
609
  ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
698
610
 
699
611
  /android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
700
612
  ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
701
613
 
702
- /android.+[;\/\s]+(Venue[\d\s]{2,7})\s+build/i // Dell Venue Tablets
614
+ /android.+[;\/\s](Venue[\d\s]{2,7})\s+build/i // Dell Venue Tablets
703
615
  ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
704
616
 
705
617
  /android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
@@ -748,7 +660,7 @@
748
660
  /android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i // Le Pan Tablets
749
661
  ], [VENDOR, MODEL, [TYPE, TABLET]], [
750
662
 
751
- /android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i // MachSpeed Tablets
663
+ /android.+[;\/]\s*(Trio[\s\w\-\.]+)\s+build/i // MachSpeed Tablets
752
664
  ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
753
665
 
754
666
  /android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i // Trinity Tablets
@@ -757,70 +669,27 @@
757
669
  /android.+[;\/]\s*TU_(1491)\s+build/i // Rotor Tablets
758
670
  ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
759
671
 
760
- /android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
761
- ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
672
+ //android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
673
+ //], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
762
674
 
763
675
  /android.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i // Gigaset Tablets
764
676
  ], [VENDOR, MODEL, [TYPE, TABLET]], [
677
+ // Android Phones from Unidentified Vendors
678
+ /android .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i
679
+ ], [MODEL, [TYPE, MOBILE]], [
680
+ // Android Tablets from Unidentified Vendors
681
+ /android .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i
682
+ ], [MODEL, [TYPE, TABLET]], [
765
683
 
766
684
  /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
767
685
  /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
768
686
  ], [[TYPE, util.lowerize], VENDOR, MODEL], [
769
687
 
688
+ /[\s\/\(](smart-?tv)[;\)]/i // SmartTV
689
+ ], [[TYPE, SMARTTV]], [
690
+
770
691
  /(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
771
692
  ], [MODEL, [VENDOR, 'Generic']]
772
-
773
-
774
- /*//////////////////////////
775
- // TODO: move to string map
776
- ////////////////////////////
777
-
778
- /(C6603)/i // Sony Xperia Z C6603
779
- ], [[MODEL, 'Xperia Z C6603'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
780
- /(C6903)/i // Sony Xperia Z 1
781
- ], [[MODEL, 'Xperia Z 1'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
782
-
783
- /(SM-G900[F|H])/i // Samsung Galaxy S5
784
- ], [[MODEL, 'Galaxy S5'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
785
- /(SM-G7102)/i // Samsung Galaxy Grand 2
786
- ], [[MODEL, 'Galaxy Grand 2'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
787
- /(SM-G530H)/i // Samsung Galaxy Grand Prime
788
- ], [[MODEL, 'Galaxy Grand Prime'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
789
- /(SM-G313HZ)/i // Samsung Galaxy V
790
- ], [[MODEL, 'Galaxy V'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
791
- /(SM-T805)/i // Samsung Galaxy Tab S 10.5
792
- ], [[MODEL, 'Galaxy Tab S 10.5'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
793
- /(SM-G800F)/i // Samsung Galaxy S5 Mini
794
- ], [[MODEL, 'Galaxy S5 Mini'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
795
- /(SM-T311)/i // Samsung Galaxy Tab 3 8.0
796
- ], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
797
-
798
- /(T3C)/i // Advan Vandroid T3C
799
- ], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [
800
- /(ADVAN T1J\+)/i // Advan Vandroid T1J+
801
- ], [[MODEL, 'Vandroid T1J+'], [VENDOR, 'Advan'], [TYPE, TABLET]], [
802
- /(ADVAN S4A)/i // Advan Vandroid S4A
803
- ], [[MODEL, 'Vandroid S4A'], [VENDOR, 'Advan'], [TYPE, MOBILE]], [
804
-
805
- /(V972M)/i // ZTE V972M
806
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
807
-
808
- /(i-mobile)\s(IQ\s[\d\.]+)/i // i-mobile IQ
809
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
810
- /(IQ6.3)/i // i-mobile IQ IQ 6.3
811
- ], [[MODEL, 'IQ 6.3'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
812
- /(i-mobile)\s(i-style\s[\d\.]+)/i // i-mobile i-STYLE
813
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
814
- /(i-STYLE2.1)/i // i-mobile i-STYLE 2.1
815
- ], [[MODEL, 'i-STYLE 2.1'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
816
-
817
- /(mobiistar touch LAI 512)/i // mobiistar touch LAI 512
818
- ], [[MODEL, 'Touch LAI 512'], [VENDOR, 'mobiistar'], [TYPE, MOBILE]], [
819
-
820
- /////////////
821
- // END TODO
822
- ///////////*/
823
-
824
693
  ],
825
694
 
826
695
  engine : [[
@@ -828,8 +697,12 @@
828
697
  /windows.+\sedge\/([\w\.]+)/i // EdgeHTML
829
698
  ], [VERSION, [NAME, 'EdgeHTML']], [
830
699
 
700
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
701
+ ], [VERSION, [NAME, 'Blink']], [
702
+
831
703
  /(presto)\/([\w\.]+)/i, // Presto
832
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m
704
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
705
+ // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
833
706
  /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
834
707
  /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
835
708
  ], [NAME, VERSION], [
@@ -854,10 +727,9 @@
854
727
  /\((bb)(10);/i // BlackBerry 10
855
728
  ], [[NAME, 'BlackBerry'], VERSION], [
856
729
  /(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
857
- /(tizen)[\/\s]([\w\.]+)/i, // Tizen
858
- /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]*)/i,
859
- // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki
860
- /linux;.+(sailfish);/i // Sailfish OS
730
+ /(tizen|kaios)[\/\s]([\w\.]+)/i, // Tizen/KaiOS
731
+ /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i
732
+ // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
861
733
  ], [NAME, VERSION], [
862
734
  /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i // Symbian
863
735
  ], [[NAME, 'Symbian'], VERSION], [
@@ -866,6 +738,10 @@
866
738
  /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
867
739
  ], [[NAME, 'Firefox OS'], VERSION], [
868
740
 
741
+ // Google Chromecast
742
+ /crkey\/([\d\.]+)/i // Google Chromecast
743
+ ], [VERSION, [NAME, 'Chromecast']], [
744
+
869
745
  // Console
870
746
  /(nintendo|playstation)\s([wids34portablevu]+)/i, // Nintendo/Playstation
871
747
 
@@ -915,22 +791,6 @@
915
791
  /////////////////
916
792
  // Constructor
917
793
  ////////////////
918
- /*
919
- var Browser = function (name, version) {
920
- this[NAME] = name;
921
- this[VERSION] = version;
922
- };
923
- var CPU = function (arch) {
924
- this[ARCHITECTURE] = arch;
925
- };
926
- var Device = function (vendor, model, type) {
927
- this[VENDOR] = vendor;
928
- this[MODEL] = model;
929
- this[TYPE] = type;
930
- };
931
- var Engine = Browser;
932
- var OS = Browser;
933
- */
934
794
  var UAParser = function (uastring, extensions) {
935
795
 
936
796
  if (typeof uastring === 'object') {
@@ -944,11 +804,6 @@
944
804
 
945
805
  var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
946
806
  var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
947
- //var browser = new Browser();
948
- //var cpu = new CPU();
949
- //var device = new Device();
950
- //var engine = new Engine();
951
- //var os = new OS();
952
807
 
953
808
  this.getBrowser = function () {
954
809
  var browser = { name: undefined, version: undefined };
@@ -991,11 +846,6 @@
991
846
  };
992
847
  this.setUA = function (uastring) {
993
848
  ua = uastring;
994
- //browser = new Browser();
995
- //cpu = new CPU();
996
- //device = new Device();
997
- //engine = new Engine();
998
- //os = new OS();
999
849
  return this;
1000
850
  };
1001
851
  return this;
@@ -1029,7 +879,6 @@
1029
879
  NAME : NAME,
1030
880
  VERSION : VERSION
1031
881
  };
1032
- //UAParser.Utils = util;
1033
882
 
1034
883
  ///////////
1035
884
  // Export
@@ -1042,39 +891,10 @@
1042
891
  if (typeof module !== UNDEF_TYPE && module.exports) {
1043
892
  exports = module.exports = UAParser;
1044
893
  }
1045
- // TODO: test!!!!!!!!
1046
- /*
1047
- if (require && require.main === module && process) {
1048
- // cli
1049
- var jsonize = function (arr) {
1050
- var res = [];
1051
- for (var i in arr) {
1052
- res.push(new UAParser(arr[i]).getResult());
1053
- }
1054
- process.stdout.write(JSON.stringify(res, null, 2) + '\n');
1055
- };
1056
- if (process.stdin.isTTY) {
1057
- // via args
1058
- jsonize(process.argv.slice(2));
1059
- } else {
1060
- // via pipe
1061
- var str = '';
1062
- process.stdin.on('readable', function() {
1063
- var read = process.stdin.read();
1064
- if (read !== null) {
1065
- str += read;
1066
- }
1067
- });
1068
- process.stdin.on('end', function () {
1069
- jsonize(str.replace(/\n$/, '').split('\n'));
1070
- });
1071
- }
1072
- }
1073
- */
1074
894
  exports.UAParser = UAParser;
1075
895
  } else {
1076
896
  // requirejs env (optional)
1077
- if (typeof(define) === FUNC_TYPE && define.amd) {
897
+ if (typeof(define) === 'function' && define.amd) {
1078
898
  define(function () {
1079
899
  return UAParser;
1080
900
  });
@@ -1090,7 +910,7 @@
1090
910
  // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
1091
911
  // and we should catch that.
1092
912
  var $ = window && (window.jQuery || window.Zepto);
1093
- if (typeof $ !== UNDEF_TYPE && !$.ua) {
913
+ if ($ && !$.ua) {
1094
914
  var parser = new UAParser();
1095
915
  $.ua = parser.getResult();
1096
916
  $.ua.get = function () {