ua-parser-js 0.7.26 → 0.7.31

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