ua-parser-js 0.7.16 → 0.7.20

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
- /**
2
- * UAParser.js v0.7.16
1
+ /*!
2
+ * UAParser.js v0.7.20
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 & 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.16',
19
+ var LIBVERSION = '0.7.20',
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) {
@@ -244,7 +235,7 @@
244
235
 
245
236
  // Mixed
246
237
  /(kindle)\/([\w\.]+)/i, // Kindle
247
- /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,
238
+ /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i,
248
239
  // Lunascape/Maxthon/Netfront/Jasmine/Blazer
249
240
 
250
241
  // Trident based
@@ -253,16 +244,19 @@
253
244
  /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
254
245
 
255
246
  // Webkit/KHTML based
256
- /(rekonq)\/([\w\.]+)*/i, // Rekonq
257
- /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser)\/([\w\.-]+)/i
258
- // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser
247
+ /(rekonq)\/([\w\.]*)/i, // Rekonq
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
 
252
+ /(konqueror)\/([\w\.]+)/i // Konqueror
253
+ ], [[NAME, 'Konqueror'], VERSION], [
254
+
261
255
  /(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
262
256
  ], [[NAME, 'IE'], VERSION], [
263
257
 
264
- /(edge)\/((\d+)?[\w\.]+)/i // Microsoft Edge
265
- ], [NAME, VERSION], [
258
+ /(edge|edgios|edga|edg)\/((\d+)?[\w\.]+)/i // Microsoft Edge
259
+ ], [[NAME, 'Edge'], VERSION], [
266
260
 
267
261
  /(yabrowser)\/([\w\.]+)/i // Yandex
268
262
  ], [[NAME, 'Yandex'], VERSION], [
@@ -270,28 +264,58 @@
270
264
  /(puffin)\/([\w\.]+)/i // Puffin
271
265
  ], [[NAME, 'Puffin'], VERSION], [
272
266
 
273
- /((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i
274
- // UCBrowser
267
+ /(focus)\/([\w\.]+)/i // Firefox Focus
268
+ ], [[NAME, 'Firefox Focus'], VERSION], [
269
+
270
+ /(opt)\/([\w\.]+)/i // Opera Touch
271
+ ], [[NAME, 'Opera Touch'], VERSION], [
272
+
273
+ /((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
275
274
  ], [[NAME, 'UCBrowser'], VERSION], [
276
275
 
277
276
  /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
278
277
  ], [[NAME, /_/g, ' '], VERSION], [
279
278
 
279
+ /(windowswechat qbcore)\/([\w\.]+)/i // WeChat Desktop for Windows Built-in Browser
280
+ ], [[NAME, 'WeChat(Win) Desktop'], VERSION], [
281
+
280
282
  /(micromessenger)\/([\w\.]+)/i // WeChat
281
283
  ], [[NAME, 'WeChat'], VERSION], [
282
284
 
285
+ /(brave)\/([\w\.]+)/i // Brave browser
286
+ ], [[NAME, 'Brave'], VERSION], [
287
+
288
+ /(qqbrowserlite)\/([\w\.]+)/i // QQBrowserLite
289
+ ], [NAME, VERSION], [
290
+
283
291
  /(QQ)\/([\d\.]+)/i // QQ, aka ShouQ
284
292
  ], [NAME, VERSION], [
285
293
 
286
294
  /m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
287
295
  ], [NAME, VERSION], [
288
296
 
297
+ /(BIDUBrowser)[\/\s]?([\w\.]+)/i // Baidu Browser
298
+ ], [NAME, VERSION], [
299
+
300
+ /(2345Explorer)[\/\s]?([\w\.]+)/i // 2345 Browser
301
+ ], [NAME, VERSION], [
302
+
303
+ /(MetaSr)[\/\s]?([\w\.]+)/i // SouGouBrowser
304
+ ], [NAME], [
305
+
306
+ /(LBBROWSER)/i // LieBao Browser
307
+ ], [NAME], [
308
+
289
309
  /xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
290
310
  ], [VERSION, [NAME, 'MIUI Browser']], [
291
311
 
292
312
  /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
293
313
  ], [VERSION, [NAME, 'Facebook']], [
294
314
 
315
+ /safari\s(line)\/([\w\.]+)/i, // Line App for iOS
316
+ /android.+(line)\/([\w\.]+)\/iab/i // Line App for Android
317
+ ], [NAME, VERSION], [
318
+
295
319
  /headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
296
320
  ], [VERSION, [NAME, 'Chrome Headless']], [
297
321
 
@@ -304,6 +328,9 @@
304
328
  /android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
305
329
  ], [VERSION, [NAME, 'Android Browser']], [
306
330
 
331
+ /(sailfishbrowser)\/([\w\.]+)/i // Sailfish Browser
332
+ ], [[NAME, 'Sailfish Browser'], VERSION], [
333
+
307
334
  /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
308
335
  // Chrome/OmniWeb/Arora/Tizen/Nokia
309
336
  ], [NAME, VERSION], [
@@ -332,7 +359,6 @@
332
359
  /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
333
360
  ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
334
361
 
335
- /(konqueror)\/([\w\.]+)/i, // Konqueror
336
362
  /(webkit|khtml)\/([\w\.]+)/i
337
363
  ], [NAME, VERSION], [
338
364
 
@@ -342,7 +368,8 @@
342
368
  /(swiftfox)/i, // Swiftfox
343
369
  /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
344
370
  // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
345
- /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,
371
+ /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,
372
+
346
373
  // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
347
374
  /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
348
375
 
@@ -350,121 +377,10 @@
350
377
  /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,
351
378
  // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir
352
379
  /(links)\s\(([\w\.]+)/i, // Links
353
- /(gobrowser)\/?([\w\.]+)*/i, // GoBrowser
380
+ /(gobrowser)\/?([\w\.]*)/i, // GoBrowser
354
381
  /(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
355
382
  /(mosaic)[\/\s]([\w\.]+)/i // Mosaic
356
383
  ], [NAME, VERSION]
357
-
358
- /* /////////////////////
359
- // Media players BEGIN
360
- ////////////////////////
361
-
362
- , [
363
-
364
- /(apple(?:coremedia|))\/((\d+)[\w\._]+)/i, // Generic Apple CoreMedia
365
- /(coremedia) v((\d+)[\w\._]+)/i
366
- ], [NAME, VERSION], [
367
-
368
- /(aqualung|lyssna|bsplayer)\/((\d+)?[\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
369
- ], [NAME, VERSION], [
370
-
371
- /(ares|ossproxy)\s((\d+)[\w\.-]+)/i // Ares/OSSProxy
372
- ], [NAME, VERSION], [
373
-
374
- /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/((\d+)[\w\.-]+)/i,
375
- // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
376
- // NSPlayer/PSP-InternetRadioPlayer/Videos
377
- /(clementine|music player daemon)\s((\d+)[\w\.-]+)/i, // Clementine/MPD
378
- /(lg player|nexplayer)\s((\d+)[\d\.]+)/i,
379
- /player\/(nexplayer|lg player)\s((\d+)[\w\.-]+)/i // NexPlayer/LG Player
380
- ], [NAME, VERSION], [
381
- /(nexplayer)\s((\d+)[\w\.-]+)/i // Nexplayer
382
- ], [NAME, VERSION], [
383
-
384
- /(flrp)\/((\d+)[\w\.-]+)/i // Flip Player
385
- ], [[NAME, 'Flip Player'], VERSION], [
386
-
387
- /(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
388
- // FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
389
- ], [NAME], [
390
-
391
- /(gstreamer) souphttpsrc (?:\([^\)]+\)){0,1} libsoup\/((\d+)[\w\.-]+)/i
392
- // Gstreamer
393
- ], [NAME, VERSION], [
394
-
395
- /(htc streaming player)\s[\w_]+\s\/\s((\d+)[\d\.]+)/i, // HTC Streaming Player
396
- /(java|python-urllib|python-requests|wget|libcurl)\/((\d+)[\w\.-_]+)/i,
397
- // Java/urllib/requests/wget/cURL
398
- /(lavf)((\d+)[\d\.]+)/i // Lavf (FFMPEG)
399
- ], [NAME, VERSION], [
400
-
401
- /(htc_one_s)\/((\d+)[\d\.]+)/i // HTC One S
402
- ], [[NAME, /_/g, ' '], VERSION], [
403
-
404
- /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+){0,1})/i
405
- // MPlayer SVN
406
- ], [NAME, VERSION], [
407
-
408
- /(mplayer)(?:\s|\/|[unkow-]+)((\d+)[\w\.-]+)/i // MPlayer
409
- ], [NAME, VERSION], [
410
-
411
- /(mplayer)/i, // MPlayer (no other info)
412
- /(yourmuze)/i, // YourMuze
413
- /(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
414
- ], [NAME], [
415
-
416
- /(nero (?:home|scout))\/((\d+)[\w\.-]+)/i // Nero Home/Nero Scout
417
- ], [NAME, VERSION], [
418
-
419
- /(nokia\d+)\/((\d+)[\w\.-]+)/i // Nokia
420
- ], [NAME, VERSION], [
421
-
422
- /\s(songbird)\/((\d+)[\w\.-]+)/i // Songbird/Philips-Songbird
423
- ], [NAME, VERSION], [
424
-
425
- /(winamp)3 version ((\d+)[\w\.-]+)/i, // Winamp
426
- /(winamp)\s((\d+)[\w\.-]+)/i,
427
- /(winamp)mpeg\/((\d+)[\w\.-]+)/i
428
- ], [NAME, VERSION], [
429
-
430
- /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
431
- // inlight radio
432
- ], [NAME], [
433
-
434
- /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/((\d+)[\w\.-]+)/i
435
- // QuickTime/RealMedia/RadioApp/RadioClientApplication/
436
- // SoundTap/Totem/Stagefright/Streamium
437
- ], [NAME, VERSION], [
438
-
439
- /(smp)((\d+)[\d\.]+)/i // SMP
440
- ], [NAME, VERSION], [
441
-
442
- /(vlc) media player - version ((\d+)[\w\.]+)/i, // VLC Videolan
443
- /(vlc)\/((\d+)[\w\.-]+)/i,
444
- /(xbmc|gvfs|xine|xmms|irapp)\/((\d+)[\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
445
- /(foobar2000)\/((\d+)[\d\.]+)/i, // Foobar2000
446
- /(itunes)\/((\d+)[\d\.]+)/i // iTunes
447
- ], [NAME, VERSION], [
448
-
449
- /(wmplayer)\/((\d+)[\w\.-]+)/i, // Windows Media Player
450
- /(windows-media-player)\/((\d+)[\w\.-]+)/i
451
- ], [[NAME, /-/g, ' '], VERSION], [
452
-
453
- /windows\/((\d+)[\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i
454
- // Windows Media Server
455
- ], [VERSION, [NAME, 'Windows']], [
456
-
457
- /(com\.riseupradioalarm)\/((\d+)[\d\.]*)/i // RiseUP Radio Alarm
458
- ], [NAME, VERSION], [
459
-
460
- /(rad.io)\s((\d+)[\d\.]+)/i, // Rad.io
461
- /(radio.(?:de|at|fr))\s((\d+)[\d\.]+)/i
462
- ], [[NAME, 'rad.io'], VERSION]
463
-
464
- //////////////////////
465
- // Media players END
466
- ////////////////////*/
467
-
468
384
  ],
469
385
 
470
386
  cpu : [[
@@ -488,14 +404,14 @@
488
404
  /(sun4\w)[;\)]/i // SPARC
489
405
  ], [[ARCHITECTURE, 'sparc']], [
490
406
 
491
- /((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
407
+ /((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+[;l]))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
492
408
  // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
493
409
  ], [[ARCHITECTURE, util.lowerize]]
494
410
  ],
495
411
 
496
412
  device : [[
497
413
 
498
- /\((ipad|playbook);[\w\s\);-]+(rim|apple)/i // iPad/PlayBook
414
+ /\((ipad|playbook);[\w\s\),;-]+(rim|apple)/i // iPad/PlayBook
499
415
  ], [MODEL, VENDOR, [TYPE, TABLET]], [
500
416
 
501
417
  /applecoremedia\/[\w\.]+ \((ipad)/ // iPad
@@ -512,10 +428,12 @@
512
428
  /(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
513
429
  ], [VENDOR, MODEL, [TYPE, TABLET]], [
514
430
 
515
- /(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i // Kindle Fire HD
431
+ /(kf[A-z]+)\sbuild\/.+silk\//i // Kindle Fire HD
516
432
  ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
517
- /(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i // Fire Phone
433
+ /(sd|kf)[0349hijorstuw]+\sbuild\/.+silk\//i // Fire Phone
518
434
  ], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
435
+ /android.+aft([bms])\sbuild/i // Fire TV
436
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
519
437
 
520
438
  /\((ip[honed|\s\w*]+);.+(apple)/i // iPod/iPhone
521
439
  ], [MODEL, VENDOR, [TYPE, MOBILE]], [
@@ -523,7 +441,7 @@
523
441
  ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
524
442
 
525
443
  /(blackberry)[\s-]?(\w+)/i, // BlackBerry
526
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,
444
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
527
445
  // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
528
446
  /(hp)\s([\w\s]+\w)/i, // HP iPAQ
529
447
  /(asus)-?(\w+)/i // Asus
@@ -531,13 +449,13 @@
531
449
  /\(bb10;\s(\w+)/i // BlackBerry 10
532
450
  ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
533
451
  // Asus Tablets
534
- /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i
452
+ /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone|p00c)/i
535
453
  ], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
536
454
 
537
455
  /(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
538
456
  /(sony)?(?:sgp.+)\sbuild\//i
539
457
  ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
540
- /android.+\s([c-g]\d{4}|so[-l]\w+)\sbuild\//i
458
+ /android.+\s([c-g]\d{4}|so[-l]\w+)(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
541
459
  ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
542
460
 
543
461
  /\s(ouya)\s/i, // Ouya
@@ -553,13 +471,10 @@
553
471
  /(sprint\s(\w+))/i // Sprint Phones
554
472
  ], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
555
473
 
556
- /(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i // Lenovo tablets
557
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
558
-
559
- /(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
560
- /(zte)-(\w+)*/i, // ZTE
561
- /(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
562
- // Alcatel/GeeksPhone/Lenovo/Nexian/Panasonic/Sony
474
+ /(htc)[;_\s-]+([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
475
+ /(zte)-(\w*)/i, // ZTE
476
+ /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i
477
+ // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
563
478
  ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
564
479
 
565
480
  /(nexus\s9)/i // HTC Nexus 9
@@ -578,8 +493,8 @@
578
493
  ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
579
494
 
580
495
  // Motorola
581
- /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i,
582
- /mot[\s-]?(\w+)*/i,
496
+ /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i,
497
+ /mot[\s-]?(\w*)/i,
583
498
  /(XT\d{3,4}) build\//i,
584
499
  /(nexus\s6)/i
585
500
  ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
@@ -601,18 +516,18 @@
601
516
  /smart-tv.+(samsung)/i
602
517
  ], [VENDOR, [TYPE, SMARTTV], MODEL], [
603
518
  /((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
604
- /(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,
519
+ /(sam[sung]*)[\s-]*(\w+-?[\w-]*)/i,
605
520
  /sec-((sgh\w+))/i
606
521
  ], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
607
522
 
608
- /sie-(\w+)*/i // Siemens
523
+ /sie-(\w*)/i // Siemens
609
524
  ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
610
525
 
611
526
  /(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia
612
- /(nokia)[\s_-]?([\w-]+)*/i
527
+ /(nokia)[\s_-]?([\w-]*)/i
613
528
  ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
614
529
 
615
- /android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer
530
+ /android[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i // Acer
616
531
  ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
617
532
 
618
533
  /android.+([vl]k\-?\d{3})\s+build/i // LG Tablet
@@ -622,12 +537,16 @@
622
537
  /(lg) netcast\.tv/i // LG SmartTV
623
538
  ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
624
539
  /(nexus\s[45])/i, // LG
625
- /lg[e;\s\/-]+(\w+)*/i,
540
+ /lg[e;\s\/-]+(\w*)/i,
626
541
  /android.+lg(\-?[\d\w]+)\s+build/i
627
542
  ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
628
543
 
544
+ /(lenovo)\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+))/i // Lenovo tablets
545
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
629
546
  /android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
630
547
  ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
548
+ /(lenovo)[_\s-]?([\w-]+)/i
549
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
631
550
 
632
551
  /linux;.+((jolla));/i // Jolla
633
552
  ], [VENDOR, MODEL, [TYPE, MOBILE]], [
@@ -644,29 +563,33 @@
644
563
  /android.+;\s(glass)\s\d/i // Google Glass
645
564
  ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
646
565
 
647
- /android.+;\s(pixel c)\s/i // Google Pixel C
566
+ /android.+;\s(pixel c)[\s)]/i // Google Pixel C
648
567
  ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
649
568
 
650
- /android.+;\s(pixel xl|pixel)\s/i // Google Pixel
569
+ /android.+;\s(pixel( [23])?( xl)?)[\s)]/i // Google Pixel
651
570
  ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
652
571
 
653
- /android.+(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
572
+ /android.+;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
654
573
  /android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
655
- /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Mi
656
- /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+)?)\s+build/i // Redmi Phones
574
+ /android.+(mi[\s\-_]*(?:a\d|one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i,
575
+ // Xiaomi Mi
576
+ /android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i // Redmi Phones
657
577
  ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
658
- /android.+(mi[\s\-_]*(?:pad)?(?:[\s_]*[\w\s]+)?)\s+build/i // Mi Pad tablets
578
+ /android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i // Mi Pad tablets
659
579
  ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
660
- /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu Tablet
661
- ], [MODEL, [VENDOR, 'Meizu'], [TYPE, TABLET]], [
580
+ /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu
581
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
582
+ /(mz)-([\w-]{2,})/i
583
+ ], [[VENDOR, 'Meizu'], MODEL, [TYPE, MOBILE]], [
662
584
 
663
- /android.+a000(1)\s+build/i // OnePlus
585
+ /android.+a000(1)\s+build/i, // OnePlus
586
+ /android.+oneplus\s(a\d{4})\s+build/i
664
587
  ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
665
588
 
666
589
  /android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
667
590
  ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
668
591
 
669
- /android.+[;\/]\s*(Venue[\d\s]*)\s+build/i // Dell Venue Tablets
592
+ /android.+[;\/\s]+(Venue[\d\s]{2,7})\s+build/i // Dell Venue Tablets
670
593
  ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
671
594
 
672
595
  /android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
@@ -678,8 +601,8 @@
678
601
  /android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet
679
602
  ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
680
603
 
681
- /android.+[;\/]\s*(zte)?.+(k\d{2})\s+build/i // ZTE K Series Tablet
682
- ], [[VENDOR, 'ZTE'], MODEL, [TYPE, TABLET]], [
604
+ /android.+;\s(k88)\sbuild/i // ZTE K Series Tablet
605
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
683
606
 
684
607
  /android.+[;\/]\s*(gen\d{3})\s+build.*49h/i // Swiss GEN Mobile
685
608
  ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
@@ -690,26 +613,29 @@
690
613
  /android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets
691
614
  ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
692
615
 
693
- /(android).+[;\/]\s+([YR]\d{2}x?.*)\s+build/i,
694
- /android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(.+)\s+build/i // Dragon Touch Tablet
616
+ /(android).+[;\/]\s+([YR]\d{2})\s+build/i,
617
+ /android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i // Dragon Touch Tablet
695
618
  ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
696
619
 
697
- /android.+[;\/]\s*(NS-?.+)\s+build/i // Insignia Tablets
620
+ /android.+[;\/]\s*(NS-?\w{0,9})\sbuild/i // Insignia Tablets
698
621
  ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
699
622
 
700
- /android.+[;\/]\s*((NX|Next)-?.+)\s+build/i // NextBook Tablets
623
+ /android.+[;\/]\s*((NX|Next)-?\w{0,9})\s+build/i // NextBook Tablets
701
624
  ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
702
625
 
703
- /android.+[;\/]\s*(Xtreme\_?)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
626
+ /android.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
704
627
  ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
705
628
 
706
- /android.+[;\/]\s*(LVTEL\-?)?(V1[12])\s+build/i // LvTel Phones
629
+ /android.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i // LvTel Phones
707
630
  ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
708
631
 
632
+ /android.+;\s(PH-1)\s/i
633
+ ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
634
+
709
635
  /android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
710
636
  ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
711
637
 
712
- /android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(.*\b)\s+build/i // Le Pan Tablets
638
+ /android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i // Le Pan Tablets
713
639
  ], [VENDOR, MODEL, [TYPE, TABLET]], [
714
640
 
715
641
  /android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i // MachSpeed Tablets
@@ -724,67 +650,18 @@
724
650
  /android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
725
651
  ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
726
652
 
727
- /android.+(Gigaset)[\s\-]+(Q.+)\s+build/i // Gigaset Tablets
653
+ /android.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i // Gigaset Tablets
728
654
  ], [VENDOR, MODEL, [TYPE, TABLET]], [
729
655
 
730
656
  /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
731
657
  /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
732
658
  ], [[TYPE, util.lowerize], VENDOR, MODEL], [
733
659
 
734
- /(android.+)[;\/].+build/i // Generic Android Device
735
- ], [MODEL, [VENDOR, 'Generic']]
736
-
737
-
738
- /*//////////////////////////
739
- // TODO: move to string map
740
- ////////////////////////////
741
-
742
- /(C6603)/i // Sony Xperia Z C6603
743
- ], [[MODEL, 'Xperia Z C6603'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
744
- /(C6903)/i // Sony Xperia Z 1
745
- ], [[MODEL, 'Xperia Z 1'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
746
-
747
- /(SM-G900[F|H])/i // Samsung Galaxy S5
748
- ], [[MODEL, 'Galaxy S5'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
749
- /(SM-G7102)/i // Samsung Galaxy Grand 2
750
- ], [[MODEL, 'Galaxy Grand 2'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
751
- /(SM-G530H)/i // Samsung Galaxy Grand Prime
752
- ], [[MODEL, 'Galaxy Grand Prime'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
753
- /(SM-G313HZ)/i // Samsung Galaxy V
754
- ], [[MODEL, 'Galaxy V'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
755
- /(SM-T805)/i // Samsung Galaxy Tab S 10.5
756
- ], [[MODEL, 'Galaxy Tab S 10.5'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
757
- /(SM-G800F)/i // Samsung Galaxy S5 Mini
758
- ], [[MODEL, 'Galaxy S5 Mini'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
759
- /(SM-T311)/i // Samsung Galaxy Tab 3 8.0
760
- ], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
761
-
762
- /(T3C)/i // Advan Vandroid T3C
763
- ], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [
764
- /(ADVAN T1J\+)/i // Advan Vandroid T1J+
765
- ], [[MODEL, 'Vandroid T1J+'], [VENDOR, 'Advan'], [TYPE, TABLET]], [
766
- /(ADVAN S4A)/i // Advan Vandroid S4A
767
- ], [[MODEL, 'Vandroid S4A'], [VENDOR, 'Advan'], [TYPE, MOBILE]], [
768
-
769
- /(V972M)/i // ZTE V972M
770
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
771
-
772
- /(i-mobile)\s(IQ\s[\d\.]+)/i // i-mobile IQ
773
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
774
- /(IQ6.3)/i // i-mobile IQ IQ 6.3
775
- ], [[MODEL, 'IQ 6.3'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
776
- /(i-mobile)\s(i-style\s[\d\.]+)/i // i-mobile i-STYLE
777
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
778
- /(i-STYLE2.1)/i // i-mobile i-STYLE 2.1
779
- ], [[MODEL, 'i-STYLE 2.1'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
780
-
781
- /(mobiistar touch LAI 512)/i // mobiistar touch LAI 512
782
- ], [[MODEL, 'Touch LAI 512'], [VENDOR, 'mobiistar'], [TYPE, MOBILE]], [
783
-
784
- /////////////
785
- // END TODO
786
- ///////////*/
660
+ /[\s\/\(](smart-?tv)[;\)]/i // SmartTV
661
+ ], [[TYPE, SMARTTV]], [
787
662
 
663
+ /(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
664
+ ], [MODEL, [VENDOR, 'Generic']]
788
665
  ],
789
666
 
790
667
  engine : [[
@@ -792,13 +669,17 @@
792
669
  /windows.+\sedge\/([\w\.]+)/i // EdgeHTML
793
670
  ], [VERSION, [NAME, 'EdgeHTML']], [
794
671
 
672
+ /webkit\/537\.36.+chrome\/(?!27)/i // Blink
673
+ ], [[NAME, 'Blink']], [
674
+
795
675
  /(presto)\/([\w\.]+)/i, // Presto
796
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m
676
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i,
677
+ // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
797
678
  /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
798
679
  /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
799
680
  ], [NAME, VERSION], [
800
681
 
801
- /rv\:([\w\.]+).*(gecko)/i // Gecko
682
+ /rv\:([\w\.]{1,9}).+(gecko)/i // Gecko
802
683
  ], [VERSION, NAME]
803
684
  ],
804
685
 
@@ -808,7 +689,7 @@
808
689
  /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
809
690
  ], [NAME, VERSION], [
810
691
  /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
811
- /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s]+\w)*/i, // Windows Phone
692
+ /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone
812
693
  /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
813
694
  ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
814
695
  /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
@@ -817,13 +698,12 @@
817
698
  // Mobile/Embedded OS
818
699
  /\((bb)(10);/i // BlackBerry 10
819
700
  ], [[NAME, 'BlackBerry'], VERSION], [
820
- /(blackberry)\w*\/?([\w\.]+)*/i, // Blackberry
701
+ /(blackberry)\w*\/?([\w\.]*)/i, // Blackberry
821
702
  /(tizen)[\/\s]([\w\.]+)/i, // Tizen
822
- /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,
823
- // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki
824
- /linux;.+(sailfish);/i // Sailfish OS
703
+ /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i
704
+ // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
825
705
  ], [NAME, VERSION], [
826
- /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i // Symbian
706
+ /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i // Symbian
827
707
  ], [[NAME, 'Symbian'], VERSION], [
828
708
  /\((series40);/i // Series 40
829
709
  ], [NAME], [
@@ -834,43 +714,43 @@
834
714
  /(nintendo|playstation)\s([wids34portablevu]+)/i, // Nintendo/Playstation
835
715
 
836
716
  // GNU/Linux based
837
- /(mint)[\/\s\(]?(\w+)*/i, // Mint
717
+ /(mint)[\/\s\(]?(\w*)/i, // Mint
838
718
  /(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
839
- /(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]+)*/i,
719
+ /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]*)/i,
840
720
  // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
841
721
  // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
842
- /(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux
843
- /(gnu)\s?([\w\.]+)*/i // GNU
722
+ /(hurd|linux)\s?([\w\.]*)/i, // Hurd/Linux
723
+ /(gnu)\s?([\w\.]*)/i // GNU
844
724
  ], [NAME, VERSION], [
845
725
 
846
726
  /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
847
727
  ], [[NAME, 'Chromium OS'], VERSION],[
848
728
 
849
729
  // Solaris
850
- /(sunos)\s?([\w\.]+\d)*/i // Solaris
730
+ /(sunos)\s?([\w\.\d]*)/i // Solaris
851
731
  ], [[NAME, 'Solaris'], VERSION], [
852
732
 
853
733
  // BSD based
854
- /\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
734
+ /\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]*)/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
855
735
  ], [NAME, VERSION],[
856
736
 
857
- /(haiku)\s(\w+)/i // Haiku
737
+ /(haiku)\s(\w+)/i // Haiku
858
738
  ], [NAME, VERSION],[
859
739
 
860
740
  /cfnetwork\/.+darwin/i,
861
- /ip[honead]+(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
741
+ /ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i // iOS
862
742
  ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
863
743
 
864
- /(mac\sos\sx)\s?([\w\s\.]+\w)*/i,
744
+ /(mac\sos\sx)\s?([\w\s\.]*)/i,
865
745
  /(macintosh|mac(?=_powerpc)\s)/i // Mac OS
866
746
  ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
867
747
 
868
748
  // Other
869
- /((?:open)?solaris)[\/\s-]?([\w\.]+)*/i, // Solaris
870
- /(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX
871
- /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,
872
- // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS
873
- /(unix)\s?([\w\.]+)*/i // UNIX
749
+ /((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris
750
+ /(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX
751
+ /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i,
752
+ // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
753
+ /(unix)\s?([\w\.]*)/i // UNIX
874
754
  ], [NAME, VERSION]
875
755
  ]
876
756
  };
@@ -879,22 +759,6 @@
879
759
  /////////////////
880
760
  // Constructor
881
761
  ////////////////
882
- /*
883
- var Browser = function (name, version) {
884
- this[NAME] = name;
885
- this[VERSION] = version;
886
- };
887
- var CPU = function (arch) {
888
- this[ARCHITECTURE] = arch;
889
- };
890
- var Device = function (vendor, model, type) {
891
- this[VENDOR] = vendor;
892
- this[MODEL] = model;
893
- this[TYPE] = type;
894
- };
895
- var Engine = Browser;
896
- var OS = Browser;
897
- */
898
762
  var UAParser = function (uastring, extensions) {
899
763
 
900
764
  if (typeof uastring === 'object') {
@@ -908,11 +772,6 @@
908
772
 
909
773
  var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
910
774
  var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
911
- //var browser = new Browser();
912
- //var cpu = new CPU();
913
- //var device = new Device();
914
- //var engine = new Engine();
915
- //var os = new OS();
916
775
 
917
776
  this.getBrowser = function () {
918
777
  var browser = { name: undefined, version: undefined };
@@ -955,11 +814,6 @@
955
814
  };
956
815
  this.setUA = function (uastring) {
957
816
  ua = uastring;
958
- //browser = new Browser();
959
- //cpu = new CPU();
960
- //device = new Device();
961
- //engine = new Engine();
962
- //os = new OS();
963
817
  return this;
964
818
  };
965
819
  return this;
@@ -993,7 +847,6 @@
993
847
  NAME : NAME,
994
848
  VERSION : VERSION
995
849
  };
996
- //UAParser.Utils = util;
997
850
 
998
851
  ///////////
999
852
  // Export
@@ -1006,37 +859,10 @@
1006
859
  if (typeof module !== UNDEF_TYPE && module.exports) {
1007
860
  exports = module.exports = UAParser;
1008
861
  }
1009
- // TODO: test!!!
1010
- if (require && require.main === module && process) {
1011
- // cli
1012
- var jsonize = function (arr) {
1013
- var res = [];
1014
- for (var i in arr) {
1015
- res.push(new UAParser(arr[i]).getResult());
1016
- }
1017
- process.stdout.write(JSON.stringify(res, null, 2) + '\n');
1018
- };
1019
- if (process.stdin.isTTY) {
1020
- // via args
1021
- jsonize(process.argv.slice(2));
1022
- } else {
1023
- // via pipe
1024
- var str = '';
1025
- process.stdin.on('readable', function() {
1026
- var read = process.stdin.read();
1027
- if (read !== null) {
1028
- str += read;
1029
- }
1030
- });
1031
- process.stdin.on('end', function () {
1032
- jsonize(str.replace(/\n$/, '').split('\n'));
1033
- });
1034
- }
1035
- }
1036
862
  exports.UAParser = UAParser;
1037
863
  } else {
1038
864
  // requirejs env (optional)
1039
- if (typeof(define) === FUNC_TYPE && define.amd) {
865
+ if (typeof(define) === 'function' && define.amd) {
1040
866
  define(function () {
1041
867
  return UAParser;
1042
868
  });
@@ -1052,7 +878,7 @@
1052
878
  // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
1053
879
  // and we should catch that.
1054
880
  var $ = window && (window.jQuery || window.Zepto);
1055
- if (typeof $ !== UNDEF_TYPE) {
881
+ if (typeof $ !== UNDEF_TYPE && !$.ua) {
1056
882
  var parser = new UAParser();
1057
883
  $.ua = parser.getResult();
1058
884
  $.ua.get = function () {