ua-parser-js 0.7.27 → 0.7.28

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,890 +1,901 @@
1
- /*!@license
2
- * UAParser.js v0.7.27
3
- * Lightweight JavaScript-based User-Agent string parser
4
- * https://github.com/faisalman/ua-parser-js
5
- *
6
- * Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
7
- * Licensed under MIT License
8
- */
9
-
10
- (function (window, undefined) {
11
-
12
- 'use strict';
13
-
14
- //////////////
15
- // Constants
16
- /////////////
17
-
18
-
19
- var LIBVERSION = '0.7.27',
20
- EMPTY = '',
21
- UNKNOWN = '?',
22
- FUNC_TYPE = 'function',
23
- UNDEF_TYPE = 'undefined',
24
- OBJ_TYPE = 'object',
25
- STR_TYPE = 'string',
26
- MAJOR = 'major', // deprecated
27
- MODEL = 'model',
28
- NAME = 'name',
29
- TYPE = 'type',
30
- VENDOR = 'vendor',
31
- VERSION = 'version',
32
- ARCHITECTURE= 'architecture',
33
- CONSOLE = 'console',
34
- MOBILE = 'mobile',
35
- TABLET = 'tablet',
36
- SMARTTV = 'smarttv',
37
- WEARABLE = 'wearable',
38
- EMBEDDED = 'embedded',
39
- UA_MAX_LENGTH = 255;
40
-
41
-
42
- ///////////
43
- // Helper
44
- //////////
45
-
46
-
47
- var util = {
48
- extend : function (regexes, extensions) {
49
- var mergedRegexes = {};
50
- for (var i in regexes) {
51
- if (extensions[i] && extensions[i].length % 2 === 0) {
52
- mergedRegexes[i] = extensions[i].concat(regexes[i]);
53
- } else {
54
- mergedRegexes[i] = regexes[i];
55
- }
56
- }
57
- return mergedRegexes;
58
- },
59
- has : function (str1, str2) {
60
- return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false;
61
- },
62
- lowerize : function (str) {
63
- return str.toLowerCase();
64
- },
65
- major : function (version) {
66
- return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g,'').split(".")[0] : undefined;
67
- },
68
- trim : function (str, len) {
69
- str = str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
70
- return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
71
- }
72
- };
73
-
74
-
75
- ///////////////
76
- // Map helper
77
- //////////////
78
-
79
-
80
- var mapper = {
81
-
82
- rgx : function (ua, arrays) {
83
-
84
- var i = 0, j, k, p, q, matches, match;
85
-
86
- // loop through all regexes maps
87
- while (i < arrays.length && !matches) {
88
-
89
- var regex = arrays[i], // even sequence (0,2,4,..)
90
- props = arrays[i + 1]; // odd sequence (1,3,5,..)
91
- j = k = 0;
92
-
93
- // try matching uastring with regexes
94
- while (j < regex.length && !matches) {
95
-
96
- matches = regex[j++].exec(ua);
97
-
98
- if (!!matches) {
99
- for (p = 0; p < props.length; p++) {
100
- match = matches[++k];
101
- q = props[p];
102
- // check if given property is actually array
103
- if (typeof q === OBJ_TYPE && q.length > 0) {
104
- if (q.length == 2) {
105
- if (typeof q[1] == FUNC_TYPE) {
106
- // assign modified match
107
- this[q[0]] = q[1].call(this, match);
108
- } else {
109
- // assign given value, ignore regex match
110
- this[q[0]] = q[1];
111
- }
112
- } else if (q.length == 3) {
113
- // check whether function or regex
114
- if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
115
- // call function (usually string mapper)
116
- this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
117
- } else {
118
- // sanitize match using given regex
119
- this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
120
- }
121
- } else if (q.length == 4) {
122
- this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
123
- }
124
- } else {
125
- this[q] = match ? match : undefined;
126
- }
127
- }
128
- }
129
- }
130
- i += 2;
131
- }
132
- },
133
-
134
- str : function (str, map) {
135
-
136
- for (var i in map) {
137
- // check if array
138
- if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
139
- for (var j = 0; j < map[i].length; j++) {
140
- if (util.has(map[i][j], str)) {
141
- return (i === UNKNOWN) ? undefined : i;
142
- }
143
- }
144
- } else if (util.has(map[i], str)) {
145
- return (i === UNKNOWN) ? undefined : i;
146
- }
147
- }
148
- return str;
149
- }
150
- };
151
-
152
-
153
- ///////////////
154
- // String map
155
- //////////////
156
-
157
-
158
- var maps = {
159
-
160
- browser : {
161
- // Safari < 3.0
162
- oldSafari : {
163
- version : {
164
- '1.0' : '/8',
165
- '1.2' : '/1',
166
- '1.3' : '/3',
167
- '2.0' : '/412',
168
- '2.0.2' : '/416',
169
- '2.0.3' : '/417',
170
- '2.0.4' : '/419',
171
- '?' : '/'
172
- }
173
- },
174
- oldEdge : {
175
- version : {
176
- '0.1' : '12.',
177
- '21' : '13.',
178
- '31' : '14.',
179
- '39' : '15.',
180
- '41' : '16.',
181
- '42' : '17.',
182
- '44' : '18.'
183
- }
184
- }
185
- },
186
-
187
- os : {
188
- windows : {
189
- version : {
190
- 'ME' : '4.90',
191
- 'NT 3.11' : 'NT3.51',
192
- 'NT 4.0' : 'NT4.0',
193
- '2000' : 'NT 5.0',
194
- 'XP' : ['NT 5.1', 'NT 5.2'],
195
- 'Vista' : 'NT 6.0',
196
- '7' : 'NT 6.1',
197
- '8' : 'NT 6.2',
198
- '8.1' : 'NT 6.3',
199
- '10' : ['NT 6.4', 'NT 10.0'],
200
- 'RT' : 'ARM'
201
- }
202
- }
203
- }
204
- };
205
-
206
-
207
- //////////////
208
- // Regex map
209
- /////////////
210
-
211
-
212
- var regexes = {
213
-
214
- browser : [[
215
-
216
- /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
217
- ], [VERSION, [NAME, 'Chrome']], [
218
- /(?:edgios|edga|edg)\/([\w\.]+)/i // Microsoft Edge
219
- ], [VERSION, [NAME, 'Edge']], [
220
- /edge\/([\w\.]+)/i // Old Edge (Trident)
221
- ], [[VERSION, mapper.str, maps.browser.oldEdge.version], [NAME, 'Edge']], [
222
-
223
- // Presto based
224
- /(opera\smini)\/([\w\.-]+)/i, // Opera Mini
225
- /(opera\s[mobiletab]{3,6})\b.+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
226
- /(opera)(?:.+version\/|[\/\s]+)([\w\.]+)/i, // Opera
227
- ], [NAME, VERSION], [
228
- /opios[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
229
- ], [VERSION, [NAME, 'Opera Mini']], [
230
- /\sopr\/([\w\.]+)/i // Opera Webkit
231
- ], [VERSION, [NAME, 'Opera']], [
232
-
233
- // Mixed
234
- /(kindle)\/([\w\.]+)/i, // Kindle
235
- /(lunascape|maxthon|netfront|jasmine|blazer|instagram)[\/\s]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Instagram
236
- // Trident based
237
- /(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
238
- /(ba?idubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
239
- /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
240
-
241
- // Webkit/KHTML based
242
- /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i,
243
- // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
244
- /(rekonq|puffin|brave|whale|qqbrowserlite|qq)\/([\w\.]+)/i, // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
245
- /(weibo)__([\d\.]+)/i // Weibo
246
- ], [NAME, VERSION], [
247
- /(?:[\s\/]uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
248
- ], [VERSION, [NAME, 'UCBrowser']], [
249
- /(?:windowswechat)?\sqbcore\/([\w\.]+)\b.*(?:windowswechat)?/i // WeChat Desktop for Windows Built-in Browser
250
- ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [
251
- /micromessenger\/([\w\.]+)/i // WeChat
252
- ], [VERSION, [NAME, 'WeChat']], [
253
- /konqueror\/([\w\.]+)/i // Konqueror
254
- ], [VERSION, [NAME, 'Konqueror']], [
255
- /trident.+rv[:\s]([\w\.]{1,9})\b.+like\sgecko/i // IE11
256
- ], [VERSION, [NAME, 'IE']], [
257
- /yabrowser\/([\w\.]+)/i // Yandex
258
- ], [VERSION, [NAME, 'Yandex']], [
259
- /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
260
- ], [[NAME, /(.+)/, '$1 Secure Browser'], VERSION], [
261
- /focus\/([\w\.]+)/i // Firefox Focus
262
- ], [VERSION, [NAME, 'Firefox Focus']], [
263
- /opt\/([\w\.]+)/i // Opera Touch
264
- ], [VERSION, [NAME, 'Opera Touch']], [
265
- /coc_coc_browser\/([\w\.]+)/i // Coc Coc Browser
266
- ], [VERSION, [NAME, 'Coc Coc']], [
267
- /dolfin\/([\w\.]+)/i // Dolphin
268
- ], [VERSION, [NAME, 'Dolphin']], [
269
- /coast\/([\w\.]+)/i // Opera Coast
270
- ], [VERSION, [NAME, 'Opera Coast']],
271
- [/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
272
- ], [VERSION, [NAME, 'MIUI Browser']], [
273
- /fxios\/([\w\.-]+)/i // Firefox for iOS
274
- ], [VERSION, [NAME, 'Firefox']], [
275
- /(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
276
- ], [[NAME, '360 Browser']], [
277
- /(oculus|samsung|sailfish)browser\/([\w\.]+)/i
278
- ], [[NAME, /(.+)/, '$1 Browser'], VERSION], [ // Oculus/Samsung/Sailfish Browser
279
- /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
280
- ], [[NAME, /_/g, ' '], VERSION], [
281
- /m?(qqbrowser|baiduboxapp|2345Explorer)[\/\s]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
282
- ], [NAME, VERSION], [
283
- /(MetaSr)[\/\s]?([\w\.]+)/i, // SouGouBrowser
284
- /(LBBROWSER)/i // LieBao Browser
285
- ], [NAME], [
286
-
287
- // WebView
288
- /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android with version
289
- ], [VERSION, [NAME, 'Facebook']], [
290
- /FBAN\/FBIOS|FB_IAB\/FB4A/i // Facebook App for iOS & Android without version
291
- ], [[NAME, 'Facebook']], [
292
- /\s(electron)\/([\w\.]+)\ssafari/i, // Electron-based App
293
- /safari\s(line)\/([\w\.]+)/i, // Line App for iOS
294
- /\b(line)\/([\w\.]+)\/iab/i // Line App for Android
295
- ], [NAME, VERSION], [
296
- /\bgsa\/([\w\.]+)\s.*safari\//i // Google Search Appliance on iOS
297
- ], [VERSION, [NAME, 'GSA']], [
298
-
299
- /headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
300
- ], [VERSION, [NAME, 'Chrome Headless']], [
301
-
302
- /\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
303
- ], [[NAME, 'Chrome WebView'], VERSION], [
304
-
305
- /droid.+\sversion\/([\w\.]+)\b.+(?:mobile\ssafari|safari)/i // Android Browser
306
- ], [VERSION, [NAME, 'Android Browser']], [
307
-
308
- /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
309
- ], [NAME, VERSION], [
310
-
311
- /version\/([\w\.]+)\s.*mobile\/\w+\s(safari)/i // Mobile Safari
312
- ], [VERSION, [NAME, 'Mobile Safari']], [
313
- /version\/([\w\.]+)\s.*(mobile\s?safari|safari)/i // Safari & Safari Mobile
314
- ], [VERSION, NAME], [
315
- /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
316
- ], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [
317
-
318
- /(webkit|khtml)\/([\w\.]+)/i
319
- ], [NAME, VERSION], [
320
-
321
- // Gecko based
322
- /(navigator|netscape)\/([\w\.-]+)/i // Netscape
323
- ], [[NAME, 'Netscape'], VERSION], [
324
- /ile\svr;\srv:([\w\.]+)\).+firefox/i // Firefox Reality
325
- ], [VERSION, [NAME, 'Firefox Reality']], [
326
- /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
327
- /(swiftfox)/i, // Swiftfox
328
- /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
329
- // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
330
- /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,
331
- // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
332
- /(firefox)\/([\w\.]+)\s[\w\s\-]+\/[\w\.]+$/i, // Other Firefox-based
333
- /(mozilla)\/([\w\.]+)\s.+rv\:.+gecko\/\d+/i, // Mozilla
334
-
335
- // Other
336
- /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,
337
- // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir
338
- /(links)\s\(([\w\.]+)/i, // Links
339
- /(gobrowser)\/?([\w\.]*)/i, // GoBrowser
340
- /(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
341
- /(mosaic)[\/\s]([\w\.]+)/i // Mosaic
342
- ], [NAME, VERSION]
343
- ],
344
-
345
- cpu : [[
346
-
347
- /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64 (x64)
348
- ], [[ARCHITECTURE, 'amd64']], [
349
-
350
- /(ia32(?=;))/i // IA32 (quicktime)
351
- ], [[ARCHITECTURE, util.lowerize]], [
352
-
353
- /((?:i[346]|x)86)[;\)]/i // IA32 (x86)
354
- ], [[ARCHITECTURE, 'ia32']], [
355
-
356
- /\b(aarch64|armv?8e?l?)\b/i // ARM64
357
- ], [[ARCHITECTURE, 'arm64']], [
358
-
359
- /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
360
- ], [[ARCHITECTURE, 'armhf']], [
361
-
362
- // PocketPC mistakenly identified as PowerPC
363
- /windows\s(ce|mobile);\sppc;/i
364
- ], [[ARCHITECTURE, 'arm']], [
365
-
366
- /((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i // PowerPC
367
- ], [[ARCHITECTURE, /ower/, '', util.lowerize]], [
368
-
369
- /(sun4\w)[;\)]/i // SPARC
370
- ], [[ARCHITECTURE, 'sparc']], [
371
-
372
- /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
373
- // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
374
- ], [[ARCHITECTURE, util.lowerize]]
375
- ],
376
-
377
- device : [[
378
-
379
- //////////////////////////
380
- // MOBILES & TABLETS
381
- // Ordered by popularity
382
- /////////////////////////
383
-
384
- // Samsung
385
- /\b(sch-i[89]0\d|shw-m380s|sm-[pt]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus\s10)/i
386
- ], [MODEL, [VENDOR, 'Samsung'], [TYPE, TABLET]], [
387
- /\b((?:s[cgp]h|gt|sm)-\w+|galaxy\snexus)/i,
388
- /\ssamsung[\s-]([\w-]+)/i,
389
- /sec-(sgh\w+)/i
390
- ], [MODEL, [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
391
-
392
- // Apple
393
- /\((ip(?:hone|od)[\s\w]*);/i // iPod/iPhone
394
- ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
395
- /\((ipad);[\w\s\),;-]+apple/i, // iPad
396
- /applecoremedia\/[\w\.]+\s\((ipad)/i,
397
- /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
398
- ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
399
-
400
- // Huawei
401
- /\b((?:agr|ags[23]|bah2?|sht?)-a?[lw]\d{2})/i,
402
- ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
403
- /d\/huawei([\w\s-]+)[;\)]/i,
404
- /\b(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?|ele-l\d\d)/i,
405
- /\b(\w{2,4}-[atu][ln][01259][019])[;\)\s]/i
406
- ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
407
-
408
- // Xiaomi
409
- /\b(poco[\s\w]+)(?:\sbuild|\))/i, // Xiaomi POCO
410
- /\b;\s(\w+)\sbuild\/hm\1/i, // Xiaomi Hongmi 'numeric' models
411
- /\b(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi
412
- /\b(redmi[\s\-_]?(?:note|k)?[\w\s_]+)(?:\sbuild|\))/i, // Xiaomi Redmi
413
- /\b(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i // Xiaomi Mi
414
- ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
415
- /\b(mi[\s\-_]?(?:pad)(?:[\w\s_]+))(?:\sbuild|\))/i // Mi Pad tablets
416
- ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
417
-
418
- // OPPO
419
- /;\s(\w+)\sbuild.+\soppo/i,
420
- /\s(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007)\b/i
421
- ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
422
-
423
- // Vivo
424
- /\svivo\s(\w+)(?:\sbuild|\))/i,
425
- /\s(v[12]\d{3}\w?[at])(?:\sbuild|;)/i
426
- ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
427
-
428
- // Realme
429
- /\s(rmx[12]\d{3})(?:\sbuild|;)/i
430
- ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
431
-
432
- // Motorola
433
- /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)\b[\w\s]+build\//i,
434
- /\smot[\s-](\w*)/i,
435
- /((?:moto[\s\w\(\)]+|xt\d{3,4}|nexus\s6)(?=\sbuild|\)))/i
436
- ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
437
- /\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
438
- ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
439
-
440
- // LG
441
- /((?=lg)?[vl]k\-?\d{3})\sbuild|\s3\.[\s\w;-]{10}lg?-([06cv9]{3,4})/i
442
- ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
443
- /(nexus\s[45])/i,
444
- /lg[e;\s\/-]+((?!browser|netcast)\w+)/i,
445
- /\blg(\-?[\d\w]+)\sbuild/i
446
- ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
447
-
448
- // Lenovo
449
- /(ideatab[\w\-\s]+)/i,
450
- /lenovo\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+)|yt[\d\w-]{6}|tb[\d\w-]{6})/i // Lenovo tablets
451
- ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
452
-
453
- // Nokia
454
- /(?:maemo|nokia).*(n900|lumia\s\d+)/i,
455
- /nokia[\s_-]?([\w\.-]*)/i
456
- ], [MODEL, [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
457
-
458
- // Google
459
- /droid.+;\s(pixel\sc)[\s)]/i // Google Pixel C
460
- ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
461
- /droid.+;\s(pixel[\s\daxl]{0,6})(?:\sbuild|\))/i // Google Pixel
462
- ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
463
-
464
- // Sony
465
- /droid.+\s([c-g]\d{4}|so[-l]\w+|xq-a\w[4-7][12])(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
466
- ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
467
- /sony\stablet\s[ps]\sbuild\//i,
468
- /(?:sony)?sgp\w+(?:\sbuild\/|\))/i
469
- ], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [
470
-
471
- // OnePlus
472
- /\s(kb2005|in20[12]5|be20[12][59])\b/i,
473
- /\ba000(1)\sbuild/i, // OnePlus
474
- /\boneplus\s(a\d{4})[\s)]/i
475
- ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
476
-
477
- // Amazon
478
- /(alexa)webm/i,
479
- /(kf[a-z]{2}wi)(\sbuild\/|\))/i, // Kindle Fire without Silk
480
- /(kf[a-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD
481
- ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
482
- /(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone
483
- ], [[MODEL, 'Fire Phone'], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
484
-
485
- // BlackBerry
486
- /\((playbook);[\w\s\),;-]+(rim)/i // BlackBerry PlayBook
487
- ], [MODEL, VENDOR, [TYPE, TABLET]], [
488
- /\(bb10;\s(\w+)/i // BlackBerry 10
489
- ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
490
-
491
- // Asus
492
- /(?:\b|asus_)(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus\s7|padfone|p00[cj])/i
493
- ], [MODEL, [VENDOR, 'ASUS'], [TYPE, TABLET]], [
494
- /\s(z[es]6[027][01][km][ls]|zenfone\s\d\w?)\b/i
495
- ], [MODEL, [VENDOR, 'ASUS'], [TYPE, MOBILE]], [
496
-
497
- // HTC
498
- /(nexus\s9)/i // HTC Nexus 9
499
- ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
500
- /(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
501
-
502
- // ZTE
503
- /(zte)-(\w*)/i,
504
- /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
505
- ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
506
-
507
- // Acer
508
- /droid[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i
509
- ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
510
-
511
- // Meizu
512
- /droid.+;\s(m[1-5]\snote)\sbuild/i,
513
- /\bmz-([\w-]{2,})/i
514
- ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
515
-
516
- // MIXED
517
- /(blackberry)[\s-]?(\w+)/i, // BlackBerry
518
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
519
- // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
520
- /(hp)\s([\w\s]+\w)/i, // HP iPAQ
521
- /(asus)-?(\w+)/i, // Asus
522
- /(microsoft);\s(lumia[\s\w]+)/i, // Microsoft Lumia
523
- /(lenovo)[_\s-]?([\w-]+)/i, // Lenovo
524
- /linux;.+(jolla);/i, // Jolla
525
- /droid.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
526
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
527
-
528
- /(archos)\s(gamepad2?)/i, // Archos
529
- /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
530
- /(kindle)\/([\w\.]+)/i, // Kindle
531
- /\s(nook)[\w\s]+build\/(\w+)/i, // Nook
532
- /(dell)\s(strea[kpr\s\d]*[\dko])/i, // Dell Streak
533
- /[;\/]\s?(le[\s\-]+pan)[\s\-]+(\w{1,9})\sbuild/i, // Le Pan Tablets
534
- /[;\/]\s?(trinity)[\-\s]*(t\d{3})\sbuild/i, // Trinity Tablets
535
- /\b(gigaset)[\s\-]+(q\w{1,9})\sbuild/i, // Gigaset Tablets
536
- /\b(vodafone)\s([\w\s]+)(?:\)|\sbuild)/i // Vodafone
537
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
538
-
539
- /\s(surface\sduo)\s/i // Surface Duo
540
- ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, TABLET]], [
541
- /droid\s[\d\.]+;\s(fp\du?)\sbuild/i
542
- ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
543
- /\s(u304aa)\sbuild/i // AT&T
544
- ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
545
- /sie-(\w*)/i // Siemens
546
- ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
547
- /[;\/]\s?(rct\w+)\sbuild/i // RCA Tablets
548
- ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
549
- /[;\/\s](venue[\d\s]{2,7})\sbuild/i // Dell Venue Tablets
550
- ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
551
- /[;\/]\s?(q(?:mv|ta)\w+)\sbuild/i // Verizon Tablet
552
- ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
553
- /[;\/]\s(?:barnes[&\s]+noble\s|bn[rt])([\w\s\+]*)\sbuild/i // Barnes & Noble Tablet
554
- ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
555
- /[;\/]\s(tm\d{3}\w+)\sbuild/i
556
- ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
557
- /;\s(k88)\sbuild/i // ZTE K Series Tablet
558
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
559
- /;\s(nx\d{3}j)\sbuild/i // ZTE Nubia
560
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
561
- /[;\/]\s?(gen\d{3})\sbuild.*49h/i // Swiss GEN Mobile
562
- ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
563
- /[;\/]\s?(zur\d{3})\sbuild/i // Swiss ZUR Tablet
564
- ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
565
- /[;\/]\s?((zeki)?tb.*\b)\sbuild/i // Zeki Tablets
566
- ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
567
- /[;\/]\s([yr]\d{2})\sbuild/i,
568
- /[;\/]\s(dragon[\-\s]+touch\s|dt)(\w{5})\sbuild/i // Dragon Touch Tablet
569
- ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
570
- /[;\/]\s?(ns-?\w{0,9})\sbuild/i // Insignia Tablets
571
- ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
572
- /[;\/]\s?((nxa|Next)-?\w{0,9})\sbuild/i // NextBook Tablets
573
- ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
574
- /[;\/]\s?(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05]))\sbuild/i
575
- ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
576
- /[;\/]\s?(lvtel\-)?(v1[12])\sbuild/i // LvTel Phones
577
- ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
578
- /;\s(ph-1)\s/i
579
- ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
580
- /[;\/]\s?(v(100md|700na|7011|917g).*\b)\sbuild/i // Envizen Tablets
581
- ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
582
- /[;\/]\s?(trio[\s\w\-\.]+)\sbuild/i // MachSpeed Tablets
583
- ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
584
- /[;\/]\s?tu_(1491)\sbuild/i // Rotor Tablets
585
- ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
586
- /(shield[\w\s]+)\sbuild/i // Nvidia Shield Tablets
587
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
588
- /(sprint)\s(\w+)/i // Sprint Phones
589
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
590
- /(kin\.[onetw]{3})/i // Microsoft Kin
591
- ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
592
- /droid\s[\d\.]+;\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
593
- ], [MODEL, [VENDOR, 'Zebra'], [TYPE, TABLET]], [
594
- /droid\s[\d\.]+;\s(ec30|ps20|tc[2-8]\d[kx])\)/i
595
- ], [MODEL, [VENDOR, 'Zebra'], [TYPE, MOBILE]], [
596
-
597
- ///////////////////
598
- // CONSOLES
599
- ///////////////////
600
-
601
- /\s(ouya)\s/i, // Ouya
602
- /(nintendo)\s([wids3utch]+)/i // Nintendo
603
- ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
604
- /droid.+;\s(shield)\sbuild/i // Nvidia
605
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
606
- /(playstation\s[345portablevi]+)/i // Playstation
607
- ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
608
- /[\s\(;](xbox(?:\sone)?(?!;\sxbox))[\s\);]/i // Microsoft Xbox
609
- ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
610
-
611
- ///////////////////
612
- // SMARTTVS
613
- ///////////////////
614
-
615
- /smart-tv.+(samsung)/i // Samsung
616
- ], [VENDOR, [TYPE, SMARTTV]], [
617
- /hbbtv.+maple;(\d+)/i
618
- ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
619
- /(?:linux;\snetcast.+smarttv|lg\snetcast\.tv-201\d)/i, // LG SmartTV
620
- ], [[VENDOR, 'LG'], [TYPE, SMARTTV]], [
621
- /(apple)\s?tv/i // Apple TV
622
- ], [VENDOR, [MODEL, 'Apple TV'], [TYPE, SMARTTV]], [
623
- /crkey/i // Google Chromecast
624
- ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
625
- /droid.+aft([\w])(\sbuild\/|\))/i // Fire TV
626
- ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
627
- /\(dtv[\);].+(aquos)/i // Sharp
628
- ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
629
- /hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
630
- ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
631
- /[\s\/\(](android\s|smart[-\s]?|opera\s)tv[;\)\s]/i // SmartTV from Unidentified Vendors
632
- ], [[TYPE, SMARTTV]], [
633
-
634
- ///////////////////
635
- // WEARABLES
636
- ///////////////////
637
-
638
- /((pebble))app\/[\d\.]+\s/i // Pebble
639
- ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
640
- /droid.+;\s(glass)\s\d/i // Google Glass
641
- ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
642
- /droid\s[\d\.]+;\s(wt63?0{2,3})\)/i
643
- ], [MODEL, [VENDOR, 'Zebra'], [TYPE, WEARABLE]], [
644
-
645
- ////////////////////
646
- // MIXED (GENERIC)
647
- ///////////////////
648
-
649
- /droid .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i // Android Phones from Unidentified Vendors
650
- ], [MODEL, [TYPE, MOBILE]], [
651
- /droid .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
652
- ], [MODEL, [TYPE, TABLET]], [
653
- /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
654
- /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
655
- ], [[TYPE, util.lowerize]], [
656
- /(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
657
- ], [MODEL, [VENDOR, 'Generic']], [
658
- /(phone)/i
659
- ], [[TYPE, MOBILE]]
660
- ],
661
-
662
- engine : [[
663
-
664
- /windows.+\sedge\/([\w\.]+)/i // EdgeHTML
665
- ], [VERSION, [NAME, 'EdgeHTML']], [
666
-
667
- /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
668
- ], [VERSION, [NAME, 'Blink']], [
669
-
670
- /(presto)\/([\w\.]+)/i, // Presto
671
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
672
- /ekioh(flow)\/([\w\.]+)/i, // Flow
673
- /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
674
- /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
675
- ], [NAME, VERSION], [
676
-
677
- /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
678
- ], [VERSION, NAME]
679
- ],
680
-
681
- os : [[
682
-
683
- // Windows
684
- /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
685
- ], [NAME, VERSION], [
686
- /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
687
- /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone
688
- /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)(?!.+xbox)/i
689
- ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
690
- /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
691
- ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
692
-
693
- // iOS/macOS
694
- /ip[honead]{2,4}\b(?:.*os\s([\w]+)\slike\smac|;\sopera)/i, // iOS
695
- /cfnetwork\/.+darwin/i
696
- ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
697
- /(mac\sos\sx)\s?([\w\s\.]*)/i,
698
- /(macintosh|mac(?=_powerpc)\s)(?!.+haiku)/i // Mac OS
699
- ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
700
-
701
- // Mobile OSes // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
702
- /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i,
703
- /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
704
- /(tizen|kaios)[\/\s]([\w\.]+)/i, // Tizen/KaiOS
705
- /\((series40);/i // Series 40
706
- ], [NAME, VERSION], [
707
- /\(bb(10);/i // BlackBerry 10
708
- ], [VERSION, [NAME, 'BlackBerry']], [
709
- /(?:symbian\s?os|symbos|s60(?=;)|series60)[\/\s-]?([\w\.]*)/i // Symbian
710
- ], [VERSION, [NAME, 'Symbian']], [
711
- /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
712
- ], [[NAME, 'Firefox OS']], [
713
- /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
714
- ], [VERSION, [NAME, 'webOS']], [
715
-
716
- // Google Chromecast
717
- /crkey\/([\d\.]+)/i // Google Chromecast
718
- ], [VERSION, [NAME, 'Chromecast']], [
719
- /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
720
- ], [[NAME, 'Chromium OS'], VERSION],[
721
-
722
- // Console
723
- /(nintendo|playstation)\s([wids345portablevuch]+)/i, // Nintendo/Playstation
724
- /(xbox);\s+xbox\s([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
725
-
726
- // GNU/Linux based
727
- /(mint)[\/\s\(\)]?(\w*)/i, // Mint
728
- /(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
729
- /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\sgnu\/linux)?(?:\slinux)?[\/\s-]?(?!chrom|package)([\w\.-]*)/i,
730
- // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
731
- // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
732
- /(hurd|linux)\s?([\w\.]*)/i, // Hurd/Linux
733
- /(gnu)\s?([\w\.]*)/i, // GNU
734
-
735
- // BSD based
736
- /\s([frentopc-]{0,4}bsd|dragonfly)\s?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
737
- /(haiku)\s(\w+)/i // Haiku
738
- ], [NAME, VERSION], [
739
-
740
- // Other
741
- /(sunos)\s?([\w\.\d]*)/i // Solaris
742
- ], [[NAME, 'Solaris'], VERSION], [
743
- /((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris
744
- /(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX
745
- /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i, // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
746
- /(unix)\s?([\w\.]*)/i // UNIX
747
- ], [NAME, VERSION]
748
- ]
749
- };
750
-
751
-
752
- /////////////////
753
- // Constructor
754
- ////////////////
755
- var UAParser = function (ua, extensions) {
756
-
757
- if (typeof ua === 'object') {
758
- extensions = ua;
759
- ua = undefined;
760
- }
761
-
762
- if (!(this instanceof UAParser)) {
763
- return new UAParser(ua, extensions).getResult();
764
- }
765
-
766
- var _ua = ua || ((typeof window !== 'undefined' && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
767
- var _rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
768
-
769
- this.getBrowser = function () {
770
- var _browser = { name: undefined, version: undefined };
771
- mapper.rgx.call(_browser, _ua, _rgxmap.browser);
772
- _browser.major = util.major(_browser.version); // deprecated
773
- return _browser;
774
- };
775
- this.getCPU = function () {
776
- var _cpu = { architecture: undefined };
777
- mapper.rgx.call(_cpu, _ua, _rgxmap.cpu);
778
- return _cpu;
779
- };
780
- this.getDevice = function () {
781
- var _device = { vendor: undefined, model: undefined, type: undefined };
782
- mapper.rgx.call(_device, _ua, _rgxmap.device);
783
- return _device;
784
- };
785
- this.getEngine = function () {
786
- var _engine = { name: undefined, version: undefined };
787
- mapper.rgx.call(_engine, _ua, _rgxmap.engine);
788
- return _engine;
789
- };
790
- this.getOS = function () {
791
- var _os = { name: undefined, version: undefined };
792
- mapper.rgx.call(_os, _ua, _rgxmap.os);
793
- return _os;
794
- };
795
- this.getResult = function () {
796
- return {
797
- ua : this.getUA(),
798
- browser : this.getBrowser(),
799
- engine : this.getEngine(),
800
- os : this.getOS(),
801
- device : this.getDevice(),
802
- cpu : this.getCPU()
803
- };
804
- };
805
- this.getUA = function () {
806
- return _ua;
807
- };
808
- this.setUA = function (ua) {
809
- _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? util.trim(ua, UA_MAX_LENGTH) : ua;
810
- return this;
811
- };
812
- this.setUA(_ua);
813
- return this;
814
- };
815
-
816
- UAParser.VERSION = LIBVERSION;
817
- UAParser.BROWSER = {
818
- NAME : NAME,
819
- MAJOR : MAJOR, // deprecated
820
- VERSION : VERSION
821
- };
822
- UAParser.CPU = {
823
- ARCHITECTURE : ARCHITECTURE
824
- };
825
- UAParser.DEVICE = {
826
- MODEL : MODEL,
827
- VENDOR : VENDOR,
828
- TYPE : TYPE,
829
- CONSOLE : CONSOLE,
830
- MOBILE : MOBILE,
831
- SMARTTV : SMARTTV,
832
- TABLET : TABLET,
833
- WEARABLE: WEARABLE,
834
- EMBEDDED: EMBEDDED
835
- };
836
- UAParser.ENGINE = {
837
- NAME : NAME,
838
- VERSION : VERSION
839
- };
840
- UAParser.OS = {
841
- NAME : NAME,
842
- VERSION : VERSION
843
- };
844
-
845
- ///////////
846
- // Export
847
- //////////
848
-
849
-
850
- // check js environment
851
- if (typeof(exports) !== UNDEF_TYPE) {
852
- // nodejs env
853
- if (typeof module !== UNDEF_TYPE && module.exports) {
854
- exports = module.exports = UAParser;
855
- }
856
- exports.UAParser = UAParser;
857
- } else {
858
- // requirejs env (optional)
859
- if (typeof(define) === 'function' && define.amd) {
860
- define(function () {
861
- return UAParser;
862
- });
863
- } else if (typeof window !== 'undefined') {
864
- // browser env
865
- window.UAParser = UAParser;
866
- }
867
- }
868
-
869
- // jQuery/Zepto specific (optional)
870
- // Note:
871
- // In AMD env the global scope should be kept clean, but jQuery is an exception.
872
- // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
873
- // and we should catch that.
874
- var $ = typeof window !== 'undefined' && (window.jQuery || window.Zepto);
875
- if ($ && !$.ua) {
876
- var parser = new UAParser();
877
- $.ua = parser.getResult();
878
- $.ua.get = function () {
879
- return parser.getUA();
880
- };
881
- $.ua.set = function (uastring) {
882
- parser.setUA(uastring);
883
- var result = parser.getResult();
884
- for (var prop in result) {
885
- $.ua[prop] = result[prop];
886
- }
887
- };
888
- }
889
-
890
- })(typeof window === 'object' ? window : this);
1
+ /*!@license
2
+ * UAParser.js v0.7.28
3
+ * Lightweight JavaScript-based User-Agent string parser
4
+ * https://github.com/faisalman/ua-parser-js
5
+ *
6
+ * Copyright © 2012-2021 Faisal Salman <f@faisalman.com>
7
+ * Licensed under MIT License
8
+ */
9
+
10
+ (function (window, undefined) {
11
+
12
+ 'use strict';
13
+
14
+ //////////////
15
+ // Constants
16
+ /////////////
17
+
18
+
19
+ var LIBVERSION = '0.7.28',
20
+ EMPTY = '',
21
+ UNKNOWN = '?',
22
+ FUNC_TYPE = 'function',
23
+ UNDEF_TYPE = 'undefined',
24
+ OBJ_TYPE = 'object',
25
+ STR_TYPE = 'string',
26
+ MAJOR = 'major', // deprecated
27
+ MODEL = 'model',
28
+ NAME = 'name',
29
+ TYPE = 'type',
30
+ VENDOR = 'vendor',
31
+ VERSION = 'version',
32
+ ARCHITECTURE= 'architecture',
33
+ CONSOLE = 'console',
34
+ MOBILE = 'mobile',
35
+ TABLET = 'tablet',
36
+ SMARTTV = 'smarttv',
37
+ WEARABLE = 'wearable',
38
+ EMBEDDED = 'embedded',
39
+ UA_MAX_LENGTH = 255;
40
+
41
+
42
+ ///////////
43
+ // Helper
44
+ //////////
45
+
46
+
47
+ var util = {
48
+ extend : function (regexes, extensions) {
49
+ var mergedRegexes = {};
50
+ for (var i in regexes) {
51
+ if (extensions[i] && extensions[i].length % 2 === 0) {
52
+ mergedRegexes[i] = extensions[i].concat(regexes[i]);
53
+ } else {
54
+ mergedRegexes[i] = regexes[i];
55
+ }
56
+ }
57
+ return mergedRegexes;
58
+ },
59
+ has : function (str1, str2) {
60
+ return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false;
61
+ },
62
+ lowerize : function (str) {
63
+ return str.toLowerCase();
64
+ },
65
+ major : function (version) {
66
+ return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g,'').split(".")[0] : undefined;
67
+ },
68
+ trim : function (str, len) {
69
+ str = str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
70
+ return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
71
+ }
72
+ };
73
+
74
+
75
+ ///////////////
76
+ // Map helper
77
+ //////////////
78
+
79
+
80
+ var mapper = {
81
+
82
+ rgx : function (ua, arrays) {
83
+
84
+ var i = 0, j, k, p, q, matches, match;
85
+
86
+ // loop through all regexes maps
87
+ while (i < arrays.length && !matches) {
88
+
89
+ var regex = arrays[i], // even sequence (0,2,4,..)
90
+ props = arrays[i + 1]; // odd sequence (1,3,5,..)
91
+ j = k = 0;
92
+
93
+ // try matching uastring with regexes
94
+ while (j < regex.length && !matches) {
95
+
96
+ matches = regex[j++].exec(ua);
97
+
98
+ if (!!matches) {
99
+ for (p = 0; p < props.length; p++) {
100
+ match = matches[++k];
101
+ q = props[p];
102
+ // check if given property is actually array
103
+ if (typeof q === OBJ_TYPE && q.length > 0) {
104
+ if (q.length == 2) {
105
+ if (typeof q[1] == FUNC_TYPE) {
106
+ // assign modified match
107
+ this[q[0]] = q[1].call(this, match);
108
+ } else {
109
+ // assign given value, ignore regex match
110
+ this[q[0]] = q[1];
111
+ }
112
+ } else if (q.length == 3) {
113
+ // check whether function or regex
114
+ if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
115
+ // call function (usually string mapper)
116
+ this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
117
+ } else {
118
+ // sanitize match using given regex
119
+ this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
120
+ }
121
+ } else if (q.length == 4) {
122
+ this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
123
+ }
124
+ } else {
125
+ this[q] = match ? match : undefined;
126
+ }
127
+ }
128
+ }
129
+ }
130
+ i += 2;
131
+ }
132
+ },
133
+
134
+ str : function (str, map) {
135
+
136
+ for (var i in map) {
137
+ // check if array
138
+ if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
139
+ for (var j = 0; j < map[i].length; j++) {
140
+ if (util.has(map[i][j], str)) {
141
+ return (i === UNKNOWN) ? undefined : i;
142
+ }
143
+ }
144
+ } else if (util.has(map[i], str)) {
145
+ return (i === UNKNOWN) ? undefined : i;
146
+ }
147
+ }
148
+ return str;
149
+ }
150
+ };
151
+
152
+
153
+ ///////////////
154
+ // String map
155
+ //////////////
156
+
157
+
158
+ var maps = {
159
+
160
+ browser : {
161
+ // Safari < 3.0
162
+ oldSafari : {
163
+ version : {
164
+ '1.0' : '/8',
165
+ '1.2' : '/1',
166
+ '1.3' : '/3',
167
+ '2.0' : '/412',
168
+ '2.0.2' : '/416',
169
+ '2.0.3' : '/417',
170
+ '2.0.4' : '/419',
171
+ '?' : '/'
172
+ }
173
+ },
174
+ oldEdge : {
175
+ version : {
176
+ '0.1' : '12.',
177
+ '21' : '13.',
178
+ '31' : '14.',
179
+ '39' : '15.',
180
+ '41' : '16.',
181
+ '42' : '17.',
182
+ '44' : '18.'
183
+ }
184
+ }
185
+ },
186
+
187
+ os : {
188
+ windows : {
189
+ version : {
190
+ 'ME' : '4.90',
191
+ 'NT 3.11' : 'NT3.51',
192
+ 'NT 4.0' : 'NT4.0',
193
+ '2000' : 'NT 5.0',
194
+ 'XP' : ['NT 5.1', 'NT 5.2'],
195
+ 'Vista' : 'NT 6.0',
196
+ '7' : 'NT 6.1',
197
+ '8' : 'NT 6.2',
198
+ '8.1' : 'NT 6.3',
199
+ '10' : ['NT 6.4', 'NT 10.0'],
200
+ 'RT' : 'ARM'
201
+ }
202
+ }
203
+ }
204
+ };
205
+
206
+
207
+ //////////////
208
+ // Regex map
209
+ /////////////
210
+
211
+
212
+ var regexes = {
213
+
214
+ browser : [[
215
+
216
+ /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
217
+ ], [VERSION, [NAME, 'Chrome']], [
218
+ /edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge
219
+ ], [VERSION, [NAME, 'Edge']], [
220
+ // breaking change (reserved for next major release):
221
+ ///edge\/([\w\.]+)/i // Old Edge (Trident)
222
+ //], [[VERSION, mapper.str, maps.browser.oldEdge.version], [NAME, 'Edge']], [
223
+
224
+ // Presto based
225
+ /(opera\smini)\/([\w\.-]+)/i, // Opera Mini
226
+ /(opera\s[mobiletab]{3,6})\b.+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
227
+ /(opera)(?:.+version\/|[\/\s]+)([\w\.]+)/i, // Opera
228
+ ], [NAME, VERSION], [
229
+ /opios[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
230
+ ], [VERSION, [NAME, 'Opera Mini']], [
231
+ /\sopr\/([\w\.]+)/i // Opera Webkit
232
+ ], [VERSION, [NAME, 'Opera']], [
233
+
234
+ // Mixed
235
+ /(kindle)\/([\w\.]+)/i, // Kindle
236
+ /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer
237
+ // Trident based
238
+ /(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser
239
+ /(ba?idubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser
240
+ /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
241
+
242
+ // Webkit/KHTML based
243
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i,
244
+ // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
245
+ /(rekonq|puffin|brave|whale|qqbrowserlite|qq)\/([\w\.]+)/i, // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ
246
+ /(weibo)__([\d\.]+)/i // Weibo
247
+ ], [NAME, VERSION], [
248
+ /(?:[\s\/]uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser
249
+ ], [VERSION, [NAME, 'UCBrowser']], [
250
+ /(?:windowswechat)?\sqbcore\/([\w\.]+)\b.*(?:windowswechat)?/i // WeChat Desktop for Windows Built-in Browser
251
+ ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [
252
+ /micromessenger\/([\w\.]+)/i // WeChat
253
+ ], [VERSION, [NAME, 'WeChat']], [
254
+ /konqueror\/([\w\.]+)/i // Konqueror
255
+ ], [VERSION, [NAME, 'Konqueror']], [
256
+ /trident.+rv[:\s]([\w\.]{1,9})\b.+like\sgecko/i // IE11
257
+ ], [VERSION, [NAME, 'IE']], [
258
+ /yabrowser\/([\w\.]+)/i // Yandex
259
+ ], [VERSION, [NAME, 'Yandex']], [
260
+ /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
261
+ ], [[NAME, /(.+)/, '$1 Secure Browser'], VERSION], [
262
+ /focus\/([\w\.]+)/i // Firefox Focus
263
+ ], [VERSION, [NAME, 'Firefox Focus']], [
264
+ /opt\/([\w\.]+)/i // Opera Touch
265
+ ], [VERSION, [NAME, 'Opera Touch']], [
266
+ /coc_coc_browser\/([\w\.]+)/i // Coc Coc Browser
267
+ ], [VERSION, [NAME, 'Coc Coc']], [
268
+ /dolfin\/([\w\.]+)/i // Dolphin
269
+ ], [VERSION, [NAME, 'Dolphin']], [
270
+ /coast\/([\w\.]+)/i // Opera Coast
271
+ ], [VERSION, [NAME, 'Opera Coast']],
272
+ [/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
273
+ ], [VERSION, [NAME, 'MIUI Browser']], [
274
+ /fxios\/([\w\.-]+)/i // Firefox for iOS
275
+ ], [VERSION, [NAME, 'Firefox']], [
276
+ /(qihu|qhbrowser|qihoobrowser|360browser)/i // 360
277
+ ], [[NAME, '360 Browser']], [
278
+ /(oculus|samsung|sailfish)browser\/([\w\.]+)/i
279
+ ], [[NAME, /(.+)/, '$1 Browser'], VERSION], [ // Oculus/Samsung/Sailfish Browser
280
+ /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
281
+ ], [[NAME, /_/g, ' '], VERSION], [
282
+ /\s(electron)\/([\w\.]+)\ssafari/i, // Electron-based App
283
+ /(tesla)(?:\sqtcarbrowser|\/(20[12]\d\.[\w\.-]+))/i, // Tesla
284
+ /m?(qqbrowser|baiduboxapp|2345Explorer)[\/\s]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser
285
+ ], [NAME, VERSION], [
286
+ /(MetaSr)[\/\s]?([\w\.]+)/i, // SouGouBrowser
287
+ /(LBBROWSER)/i // LieBao Browser
288
+ ], [NAME], [
289
+
290
+ // WebView
291
+ /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android with version
292
+ ], [VERSION, [NAME, 'Facebook']], [
293
+ /FBAN\/FBIOS|FB_IAB\/FB4A/i // Facebook App for iOS & Android without version
294
+ ], [[NAME, 'Facebook']], [
295
+ /safari\s(line)\/([\w\.]+)/i, // Line App for iOS
296
+ /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
297
+ /(chromium|instagram)[\/\s]([\w\.-]+)/i // Chromium/Instagram
298
+ ], [NAME, VERSION], [
299
+ /\bgsa\/([\w\.]+)\s.*safari\//i // Google Search Appliance on iOS
300
+ ], [VERSION, [NAME, 'GSA']], [
301
+
302
+ /headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless
303
+ ], [VERSION, [NAME, 'Chrome Headless']], [
304
+
305
+ /\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
306
+ ], [[NAME, 'Chrome WebView'], VERSION], [
307
+
308
+ /droid.+\sversion\/([\w\.]+)\b.+(?:mobile\ssafari|safari)/i // Android Browser
309
+ ], [VERSION, [NAME, 'Android Browser']], [
310
+
311
+ /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
312
+ ], [NAME, VERSION], [
313
+
314
+ /version\/([\w\.]+)\s.*mobile\/\w+\s(safari)/i // Mobile Safari
315
+ ], [VERSION, [NAME, 'Mobile Safari']], [
316
+ /version\/([\w\.]+)\s.*(mobile\s?safari|safari)/i // Safari & Safari Mobile
317
+ ], [VERSION, NAME], [
318
+ /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
319
+ ], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [
320
+
321
+ /(webkit|khtml)\/([\w\.]+)/i
322
+ ], [NAME, VERSION], [
323
+
324
+ // Gecko based
325
+ /(navigator|netscape)\/([\w\.-]+)/i // Netscape
326
+ ], [[NAME, 'Netscape'], VERSION], [
327
+ /ile\svr;\srv:([\w\.]+)\).+firefox/i // Firefox Reality
328
+ ], [VERSION, [NAME, 'Firefox Reality']], [
329
+ /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
330
+ /(swiftfox)/i, // Swiftfox
331
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
332
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
333
+ /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,
334
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
335
+ /(firefox)\/([\w\.]+)\s[\w\s\-]+\/[\w\.]+$/i, // Other Firefox-based
336
+ /(mozilla)\/([\w\.]+)\s.+rv\:.+gecko\/\d+/i, // Mozilla
337
+
338
+ // Other
339
+ /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,
340
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir
341
+ /(links)\s\(([\w\.]+)/i, // Links
342
+ /(gobrowser)\/?([\w\.]*)/i, // GoBrowser
343
+ /(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
344
+ /(mosaic)[\/\s]([\w\.]+)/i // Mosaic
345
+ ], [NAME, VERSION]
346
+ ],
347
+
348
+ cpu : [[
349
+
350
+ /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64 (x64)
351
+ ], [[ARCHITECTURE, 'amd64']], [
352
+
353
+ /(ia32(?=;))/i // IA32 (quicktime)
354
+ ], [[ARCHITECTURE, util.lowerize]], [
355
+
356
+ /((?:i[346]|x)86)[;\)]/i // IA32 (x86)
357
+ ], [[ARCHITECTURE, 'ia32']], [
358
+
359
+ /\b(aarch64|armv?8e?l?)\b/i // ARM64
360
+ ], [[ARCHITECTURE, 'arm64']], [
361
+
362
+ /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
363
+ ], [[ARCHITECTURE, 'armhf']], [
364
+
365
+ // PocketPC mistakenly identified as PowerPC
366
+ /windows\s(ce|mobile);\sppc;/i
367
+ ], [[ARCHITECTURE, 'arm']], [
368
+
369
+ /((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i // PowerPC
370
+ ], [[ARCHITECTURE, /ower/, '', util.lowerize]], [
371
+
372
+ /(sun4\w)[;\)]/i // SPARC
373
+ ], [[ARCHITECTURE, 'sparc']], [
374
+
375
+ /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
376
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
377
+ ], [[ARCHITECTURE, util.lowerize]]
378
+ ],
379
+
380
+ device : [[
381
+
382
+ //////////////////////////
383
+ // MOBILES & TABLETS
384
+ // Ordered by popularity
385
+ /////////////////////////
386
+
387
+ // Samsung
388
+ /\b(sch-i[89]0\d|shw-m380s|sm-[pt]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus\s10)/i
389
+ ], [MODEL, [VENDOR, 'Samsung'], [TYPE, TABLET]], [
390
+ /\b((?:s[cgp]h|gt|sm)-\w+|galaxy\snexus)/i,
391
+ /\ssamsung[\s-]([\w-]+)/i,
392
+ /sec-(sgh\w+)/i
393
+ ], [MODEL, [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
394
+
395
+ // Apple
396
+ /\((ip(?:hone|od)[\s\w]*);/i // iPod/iPhone
397
+ ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
398
+ /\((ipad);[\w\s\),;-]+apple/i, // iPad
399
+ /applecoremedia\/[\w\.]+\s\((ipad)/i,
400
+ /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
401
+ ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
402
+
403
+ // Huawei
404
+ /\b((?:agr|ags[23]|bah2?|sht?)-a?[lw]\d{2})/i,
405
+ ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [
406
+ /d\/huawei([\w\s-]+)[;\)]/i,
407
+ /\b(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?|ele-l\d\d)/i,
408
+ /\b(\w{2,4}-[atu][ln][01259][019])[;\)\s]/i
409
+ ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
410
+
411
+ // Xiaomi
412
+ /\b(poco[\s\w]+)(?:\sbuild|\))/i, // Xiaomi POCO
413
+ /\b;\s(\w+)\sbuild\/hm\1/i, // Xiaomi Hongmi 'numeric' models
414
+ /\b(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi
415
+ /\b(redmi[\s\-_]?(?:note|k)?[\w\s_]+)(?:\sbuild|\))/i, // Xiaomi Redmi
416
+ /\b(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i // Xiaomi Mi
417
+ ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
418
+ /\b(mi[\s\-_]?(?:pad)(?:[\w\s_]+))(?:\sbuild|\))/i // Mi Pad tablets
419
+ ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [
420
+
421
+ // OPPO
422
+ /;\s(\w+)\sbuild.+\soppo/i,
423
+ /\s(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007)\b/i
424
+ ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
425
+
426
+ // Vivo
427
+ /\svivo\s(\w+)(?:\sbuild|\))/i,
428
+ /\s(v[12]\d{3}\w?[at])(?:\sbuild|;)/i
429
+ ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
430
+
431
+ // Realme
432
+ /\s(rmx[12]\d{3})(?:\sbuild|;)/i
433
+ ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
434
+
435
+ // Motorola
436
+ /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)\b[\w\s]+build\//i,
437
+ /\smot(?:orola)?[\s-](\w*)/i,
438
+ /((?:moto[\s\w\(\)]+|xt\d{3,4}|nexus\s6)(?=\sbuild|\)))/i
439
+ ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
440
+ /\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
441
+ ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
442
+
443
+ // LG
444
+ /((?=lg)?[vl]k\-?\d{3})\sbuild|\s3\.[\s\w;-]{10}lg?-([06cv9]{3,4})/i
445
+ ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
446
+ /(lm-?f100[nv]?|nexus\s[45])/i,
447
+ /lg[e;\s\/-]+((?!browser|netcast)\w+)/i,
448
+ /\blg(\-?[\d\w]+)\sbuild/i
449
+ ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
450
+
451
+ // Lenovo
452
+ /(ideatab[\w\-\s]+)/i,
453
+ /lenovo\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+)|yt[\d\w-]{6}|tb[\d\w-]{6})/i // Lenovo tablets
454
+ ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
455
+
456
+ // Nokia
457
+ /(?:maemo|nokia).*(n900|lumia\s\d+)/i,
458
+ /nokia[\s_-]?([\w\.-]*)/i
459
+ ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
460
+
461
+ // Google
462
+ /droid.+;\s(pixel\sc)[\s)]/i // Google Pixel C
463
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
464
+ /droid.+;\s(pixel[\s\daxl]{0,6})(?:\sbuild|\))/i // Google Pixel
465
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
466
+
467
+ // Sony
468
+ /droid.+\s([c-g]\d{4}|so[-l]\w+|xq-a\w[4-7][12])(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i
469
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
470
+ /sony\stablet\s[ps]\sbuild\//i,
471
+ /(?:sony)?sgp\w+(?:\sbuild\/|\))/i
472
+ ], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [
473
+
474
+ // OnePlus
475
+ /\s(kb2005|in20[12]5|be20[12][59])\b/i,
476
+ /\ba000(1)\sbuild/i, // OnePlus
477
+ /\boneplus\s(a\d{4})[\s)]/i
478
+ ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
479
+
480
+ // Amazon
481
+ /(alexa)webm/i,
482
+ /(kf[a-z]{2}wi)(\sbuild\/|\))/i, // Kindle Fire without Silk
483
+ /(kf[a-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD
484
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
485
+ /(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone
486
+ ], [[MODEL, 'Fire Phone'], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
487
+
488
+ // BlackBerry
489
+ /\((playbook);[\w\s\),;-]+(rim)/i // BlackBerry PlayBook
490
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
491
+ /((?:bb[a-f]|st[hv])100-\d)/i,
492
+ /\(bb10;\s(\w+)/i // BlackBerry 10
493
+ ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
494
+
495
+ // Asus
496
+ /(?:\b|asus_)(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus\s7|padfone|p00[cj])/i
497
+ ], [MODEL, [VENDOR, 'ASUS'], [TYPE, TABLET]], [
498
+ /\s(z[es]6[027][01][km][ls]|zenfone\s\d\w?)\b/i
499
+ ], [MODEL, [VENDOR, 'ASUS'], [TYPE, MOBILE]], [
500
+
501
+ // HTC
502
+ /(nexus\s9)/i // HTC Nexus 9
503
+ ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
504
+ /(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC
505
+
506
+ // ZTE
507
+ /(zte)-(\w*)/i,
508
+ /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
509
+ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
510
+
511
+ // Acer
512
+ /droid[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i
513
+ ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
514
+
515
+ // Meizu
516
+ /droid.+;\s(m[1-5]\snote)\sbuild/i,
517
+ /\bmz-([\w-]{2,})/i
518
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
519
+
520
+ // MIXED
521
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,
522
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
523
+ /(hp)\s([\w\s]+\w)/i, // HP iPAQ
524
+ /(asus)-?(\w+)/i, // Asus
525
+ /(microsoft);\s(lumia[\s\w]+)/i, // Microsoft Lumia
526
+ /(lenovo)[_\s-]?([\w-]+)/i, // Lenovo
527
+ /linux;.+(jolla);/i, // Jolla
528
+ /droid.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
529
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
530
+
531
+ /(archos)\s(gamepad2?)/i, // Archos
532
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
533
+ /(kindle)\/([\w\.]+)/i, // Kindle
534
+ /\s(nook)[\w\s]+build\/(\w+)/i, // Nook
535
+ /(dell)\s(strea[kpr\s\d]*[\dko])/i, // Dell Streak
536
+ /[;\/]\s?(le[\s\-]+pan)[\s\-]+(\w{1,9})\sbuild/i, // Le Pan Tablets
537
+ /[;\/]\s?(trinity)[\-\s]*(t\d{3})\sbuild/i, // Trinity Tablets
538
+ /\b(gigaset)[\s\-]+(q\w{1,9})\sbuild/i, // Gigaset Tablets
539
+ /\b(vodafone)\s([\w\s]+)(?:\)|\sbuild)/i // Vodafone
540
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
541
+
542
+ /\s(surface\sduo)\s/i // Surface Duo
543
+ ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, TABLET]], [
544
+ /droid\s[\d\.]+;\s(fp\du?)\sbuild/i
545
+ ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
546
+ /\s(u304aa)\sbuild/i // AT&T
547
+ ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
548
+ /sie-(\w*)/i // Siemens
549
+ ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
550
+ /[;\/]\s?(rct\w+)\sbuild/i // RCA Tablets
551
+ ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
552
+ /[;\/\s](venue[\d\s]{2,7})\sbuild/i // Dell Venue Tablets
553
+ ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
554
+ /[;\/]\s?(q(?:mv|ta)\w+)\sbuild/i // Verizon Tablet
555
+ ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
556
+ /[;\/]\s(?:barnes[&\s]+noble\s|bn[rt])([\w\s\+]*)\sbuild/i // Barnes & Noble Tablet
557
+ ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
558
+ /[;\/]\s(tm\d{3}\w+)\sbuild/i
559
+ ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
560
+ /;\s(k88)\sbuild/i // ZTE K Series Tablet
561
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
562
+ /;\s(nx\d{3}j)\sbuild/i // ZTE Nubia
563
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
564
+ /[;\/]\s?(gen\d{3})\sbuild.*49h/i // Swiss GEN Mobile
565
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
566
+ /[;\/]\s?(zur\d{3})\sbuild/i // Swiss ZUR Tablet
567
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
568
+ /[;\/]\s?((zeki)?tb.*\b)\sbuild/i // Zeki Tablets
569
+ ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
570
+ /[;\/]\s([yr]\d{2})\sbuild/i,
571
+ /[;\/]\s(dragon[\-\s]+touch\s|dt)(\w{5})\sbuild/i // Dragon Touch Tablet
572
+ ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
573
+ /[;\/]\s?(ns-?\w{0,9})\sbuild/i // Insignia Tablets
574
+ ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
575
+ /[;\/]\s?((nxa|Next)-?\w{0,9})\sbuild/i // NextBook Tablets
576
+ ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
577
+ /[;\/]\s?(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05]))\sbuild/i
578
+ ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
579
+ /[;\/]\s?(lvtel\-)?(v1[12])\sbuild/i // LvTel Phones
580
+ ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
581
+ /;\s(ph-1)\s/i
582
+ ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1
583
+ /[;\/]\s?(v(100md|700na|7011|917g).*\b)\sbuild/i // Envizen Tablets
584
+ ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
585
+ /[;\/]\s?(trio[\s\w\-\.]+)\sbuild/i // MachSpeed Tablets
586
+ ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
587
+ /[;\/]\s?tu_(1491)\sbuild/i // Rotor Tablets
588
+ ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
589
+ /(shield[\w\s]+)\sbuild/i // Nvidia Shield Tablets
590
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
591
+ /(sprint)\s(\w+)/i // Sprint Phones
592
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
593
+ /(kin\.[onetw]{3})/i // Microsoft Kin
594
+ ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
595
+ /droid\s[\d\.]+;\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
596
+ ], [MODEL, [VENDOR, 'Zebra'], [TYPE, TABLET]], [
597
+ /droid\s[\d\.]+;\s(ec30|ps20|tc[2-8]\d[kx])\)/i
598
+ ], [MODEL, [VENDOR, 'Zebra'], [TYPE, MOBILE]], [
599
+
600
+ ///////////////////
601
+ // CONSOLES
602
+ ///////////////////
603
+
604
+ /\s(ouya)\s/i, // Ouya
605
+ /(nintendo)\s([wids3utch]+)/i // Nintendo
606
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
607
+ /droid.+;\s(shield)\sbuild/i // Nvidia
608
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
609
+ /(playstation\s[345portablevi]+)/i // Playstation
610
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
611
+ /[\s\(;](xbox(?:\sone)?(?!;\sxbox))[\s\);]/i // Microsoft Xbox
612
+ ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
613
+
614
+ ///////////////////
615
+ // SMARTTVS
616
+ ///////////////////
617
+
618
+ /smart-tv.+(samsung)/i // Samsung
619
+ ], [VENDOR, [TYPE, SMARTTV]], [
620
+ /hbbtv.+maple;(\d+)/i
621
+ ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
622
+ /(?:linux;\snetcast.+smarttv|lg\snetcast\.tv-201\d)/i, // LG SmartTV
623
+ ], [[VENDOR, 'LG'], [TYPE, SMARTTV]], [
624
+ /(apple)\s?tv/i // Apple TV
625
+ ], [VENDOR, [MODEL, 'Apple TV'], [TYPE, SMARTTV]], [
626
+ /crkey/i // Google Chromecast
627
+ ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [
628
+ /droid.+aft([\w])(\sbuild\/|\))/i // Fire TV
629
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [
630
+ /\(dtv[\);].+(aquos)/i // Sharp
631
+ ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
632
+ /hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
633
+ ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
634
+ /[\s\/\(](android\s|smart[-\s]?|opera\s)tv[;\)\s]/i // SmartTV from Unidentified Vendors
635
+ ], [[TYPE, SMARTTV]], [
636
+
637
+ ///////////////////
638
+ // WEARABLES
639
+ ///////////////////
640
+
641
+ /((pebble))app\/[\d\.]+\s/i // Pebble
642
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
643
+ /droid.+;\s(glass)\s\d/i // Google Glass
644
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
645
+ /droid\s[\d\.]+;\s(wt63?0{2,3})\)/i
646
+ ], [MODEL, [VENDOR, 'Zebra'], [TYPE, WEARABLE]], [
647
+
648
+ ///////////////////
649
+ // EMBEDDED
650
+ ///////////////////
651
+
652
+ /(tesla)(?:\sqtcarbrowser|\/20[12]\d\.[\w\.-]+)/i // Tesla
653
+ ], [VENDOR, [TYPE, EMBEDDED]], [
654
+
655
+ ////////////////////
656
+ // MIXED (GENERIC)
657
+ ///////////////////
658
+
659
+ /droid .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i // Android Phones from Unidentified Vendors
660
+ ], [MODEL, [TYPE, MOBILE]], [
661
+ /droid .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
662
+ ], [MODEL, [TYPE, TABLET]], [
663
+ /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
664
+ /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
665
+ ], [[TYPE, util.lowerize]], [
666
+ /(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device
667
+ ], [MODEL, [VENDOR, 'Generic']], [
668
+ /(phone)/i
669
+ ], [[TYPE, MOBILE]]
670
+ ],
671
+
672
+ engine : [[
673
+
674
+ /windows.+\sedge\/([\w\.]+)/i // EdgeHTML
675
+ ], [VERSION, [NAME, 'EdgeHTML']], [
676
+
677
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
678
+ ], [VERSION, [NAME, 'Blink']], [
679
+
680
+ /(presto)\/([\w\.]+)/i, // Presto
681
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna
682
+ /ekioh(flow)\/([\w\.]+)/i, // Flow
683
+ /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
684
+ /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
685
+ ], [NAME, VERSION], [
686
+
687
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
688
+ ], [VERSION, NAME]
689
+ ],
690
+
691
+ os : [[
692
+
693
+ // Windows
694
+ /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
695
+ ], [NAME, VERSION], [
696
+ /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
697
+ /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone
698
+ /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)(?!.+xbox)/i
699
+ ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
700
+ /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
701
+ ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
702
+
703
+ // iOS/macOS
704
+ /ip[honead]{2,4}\b(?:.*os\s([\w]+)\slike\smac|;\sopera)/i, // iOS
705
+ /cfnetwork\/.+darwin/i
706
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
707
+ /(mac\sos\sx)\s?([\w\s\.]*)/i,
708
+ /(macintosh|mac(?=_powerpc)\s)(?!.+haiku)/i // Mac OS
709
+ ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
710
+
711
+ // Mobile OSes // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS
712
+ /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i,
713
+ /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
714
+ /(tizen|kaios)[\/\s]([\w\.]+)/i, // Tizen/KaiOS
715
+ /\((series40);/i // Series 40
716
+ ], [NAME, VERSION], [
717
+ /\(bb(10);/i // BlackBerry 10
718
+ ], [VERSION, [NAME, 'BlackBerry']], [
719
+ /(?:symbian\s?os|symbos|s60(?=;)|series60)[\/\s-]?([\w\.]*)/i // Symbian
720
+ ], [VERSION, [NAME, 'Symbian']], [
721
+ /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
722
+ ], [[NAME, 'Firefox OS']], [
723
+ /web0s;.+rt(tv)/i,
724
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
725
+ ], [VERSION, [NAME, 'webOS']], [
726
+
727
+ // Google Chromecast
728
+ /crkey\/([\d\.]+)/i // Google Chromecast
729
+ ], [VERSION, [NAME, 'Chromecast']], [
730
+ /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
731
+ ], [[NAME, 'Chromium OS'], VERSION],[
732
+
733
+ // Console
734
+ /(nintendo|playstation)\s([wids345portablevuch]+)/i, // Nintendo/Playstation
735
+ /(xbox);\s+xbox\s([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
736
+
737
+ // GNU/Linux based
738
+ /(mint)[\/\s\(\)]?(\w*)/i, // Mint
739
+ /(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
740
+ /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\sgnu\/linux)?(?:\slinux)?[\/\s-]?(?!chrom|package)([\w\.-]*)/i,
741
+ // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
742
+ // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
743
+ /(hurd|linux)\s?([\w\.]*)/i, // Hurd/Linux
744
+ /(gnu)\s?([\w\.]*)/i, // GNU
745
+
746
+ // BSD based
747
+ /\s([frentopc-]{0,4}bsd|dragonfly)\s?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
748
+ /(haiku)\s(\w+)/i // Haiku
749
+ ], [NAME, VERSION], [
750
+
751
+ // Other
752
+ /(sunos)\s?([\w\.\d]*)/i // Solaris
753
+ ], [[NAME, 'Solaris'], VERSION], [
754
+ /((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris
755
+ /(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX
756
+ /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i, // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia
757
+ /(unix)\s?([\w\.]*)/i // UNIX
758
+ ], [NAME, VERSION]
759
+ ]
760
+ };
761
+
762
+
763
+ /////////////////
764
+ // Constructor
765
+ ////////////////
766
+ var UAParser = function (ua, extensions) {
767
+
768
+ if (typeof ua === 'object') {
769
+ extensions = ua;
770
+ ua = undefined;
771
+ }
772
+
773
+ if (!(this instanceof UAParser)) {
774
+ return new UAParser(ua, extensions).getResult();
775
+ }
776
+
777
+ var _ua = ua || ((typeof window !== 'undefined' && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
778
+ var _rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
779
+
780
+ this.getBrowser = function () {
781
+ var _browser = { name: undefined, version: undefined };
782
+ mapper.rgx.call(_browser, _ua, _rgxmap.browser);
783
+ _browser.major = util.major(_browser.version); // deprecated
784
+ return _browser;
785
+ };
786
+ this.getCPU = function () {
787
+ var _cpu = { architecture: undefined };
788
+ mapper.rgx.call(_cpu, _ua, _rgxmap.cpu);
789
+ return _cpu;
790
+ };
791
+ this.getDevice = function () {
792
+ var _device = { vendor: undefined, model: undefined, type: undefined };
793
+ mapper.rgx.call(_device, _ua, _rgxmap.device);
794
+ return _device;
795
+ };
796
+ this.getEngine = function () {
797
+ var _engine = { name: undefined, version: undefined };
798
+ mapper.rgx.call(_engine, _ua, _rgxmap.engine);
799
+ return _engine;
800
+ };
801
+ this.getOS = function () {
802
+ var _os = { name: undefined, version: undefined };
803
+ mapper.rgx.call(_os, _ua, _rgxmap.os);
804
+ return _os;
805
+ };
806
+ this.getResult = function () {
807
+ return {
808
+ ua : this.getUA(),
809
+ browser : this.getBrowser(),
810
+ engine : this.getEngine(),
811
+ os : this.getOS(),
812
+ device : this.getDevice(),
813
+ cpu : this.getCPU()
814
+ };
815
+ };
816
+ this.getUA = function () {
817
+ return _ua;
818
+ };
819
+ this.setUA = function (ua) {
820
+ _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? util.trim(ua, UA_MAX_LENGTH) : ua;
821
+ return this;
822
+ };
823
+ this.setUA(_ua);
824
+ return this;
825
+ };
826
+
827
+ UAParser.VERSION = LIBVERSION;
828
+ UAParser.BROWSER = {
829
+ NAME : NAME,
830
+ MAJOR : MAJOR, // deprecated
831
+ VERSION : VERSION
832
+ };
833
+ UAParser.CPU = {
834
+ ARCHITECTURE : ARCHITECTURE
835
+ };
836
+ UAParser.DEVICE = {
837
+ MODEL : MODEL,
838
+ VENDOR : VENDOR,
839
+ TYPE : TYPE,
840
+ CONSOLE : CONSOLE,
841
+ MOBILE : MOBILE,
842
+ SMARTTV : SMARTTV,
843
+ TABLET : TABLET,
844
+ WEARABLE: WEARABLE,
845
+ EMBEDDED: EMBEDDED
846
+ };
847
+ UAParser.ENGINE = {
848
+ NAME : NAME,
849
+ VERSION : VERSION
850
+ };
851
+ UAParser.OS = {
852
+ NAME : NAME,
853
+ VERSION : VERSION
854
+ };
855
+
856
+ ///////////
857
+ // Export
858
+ //////////
859
+
860
+
861
+ // check js environment
862
+ if (typeof(exports) !== UNDEF_TYPE) {
863
+ // nodejs env
864
+ if (typeof module !== UNDEF_TYPE && module.exports) {
865
+ exports = module.exports = UAParser;
866
+ }
867
+ exports.UAParser = UAParser;
868
+ } else {
869
+ // requirejs env (optional)
870
+ if (typeof(define) === 'function' && define.amd) {
871
+ define(function () {
872
+ return UAParser;
873
+ });
874
+ } else if (typeof window !== 'undefined') {
875
+ // browser env
876
+ window.UAParser = UAParser;
877
+ }
878
+ }
879
+
880
+ // jQuery/Zepto specific (optional)
881
+ // Note:
882
+ // In AMD env the global scope should be kept clean, but jQuery is an exception.
883
+ // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
884
+ // and we should catch that.
885
+ var $ = typeof window !== 'undefined' && (window.jQuery || window.Zepto);
886
+ if ($ && !$.ua) {
887
+ var parser = new UAParser();
888
+ $.ua = parser.getResult();
889
+ $.ua.get = function () {
890
+ return parser.getUA();
891
+ };
892
+ $.ua.set = function (uastring) {
893
+ parser.setUA(uastring);
894
+ var result = parser.getResult();
895
+ for (var prop in result) {
896
+ $.ua[prop] = result[prop];
897
+ }
898
+ };
899
+ }
900
+
901
+ })(typeof window === 'object' ? window : this);