ua-parser-js 0.7.10 → 0.7.14

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,881 +1,1033 @@
1
- /**
2
- * UAParser.js v0.7.10
3
- * Lightweight JavaScript-based User-Agent string parser
4
- * https://github.com/faisalman/ua-parser-js
5
- *
6
- * Copyright © 2012-2015 Faisal Salman <fyzlman@gmail.com>
7
- * Dual licensed under GPLv2 & MIT
8
- */
9
-
10
- (function (window, undefined) {
11
-
12
- 'use strict';
13
-
14
- //////////////
15
- // Constants
16
- /////////////
17
-
18
-
19
- var LIBVERSION = '0.7.10',
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
-
40
-
41
- ///////////
42
- // Helper
43
- //////////
44
-
45
-
46
- var util = {
47
- extend : function (regexes, extensions) {
48
- for (var i in extensions) {
49
- if ("browser cpu device engine os".indexOf(i) !== -1 && extensions[i].length % 2 === 0) {
50
- regexes[i] = extensions[i].concat(regexes[i]);
51
- }
52
- }
53
- return regexes;
54
- },
55
- has : function (str1, str2) {
56
- if (typeof str1 === "string") {
57
- return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;
58
- } else {
59
- return false;
60
- }
61
- },
62
- lowerize : function (str) {
63
- return str.toLowerCase();
64
- },
65
- major : function (version) {
66
- return typeof(version) === STR_TYPE ? version.split(".")[0] : undefined;
67
- }
68
- };
69
-
70
-
71
- ///////////////
72
- // Map helper
73
- //////////////
74
-
75
-
76
- var mapper = {
77
-
78
- rgx : function () {
79
-
80
- var result, i = 0, j, k, p, q, matches, match, args = arguments;
81
-
82
- // loop through all regexes maps
83
- while (i < args.length && !matches) {
84
-
85
- var regex = args[i], // even sequence (0,2,4,..)
86
- props = args[i + 1]; // odd sequence (1,3,5,..)
87
-
88
- // construct object barebones
89
- if (typeof result === UNDEF_TYPE) {
90
- result = {};
91
- for (p in props) {
92
- if (props.hasOwnProperty(p)){
93
- q = props[p];
94
- if (typeof q === OBJ_TYPE) {
95
- result[q[0]] = undefined;
96
- } else {
97
- result[q] = undefined;
98
- }
99
- }
100
- }
101
- }
102
-
103
- // try matching uastring with regexes
104
- j = k = 0;
105
- while (j < regex.length && !matches) {
106
- matches = regex[j++].exec(this.getUA());
107
- if (!!matches) {
108
- for (p = 0; p < props.length; p++) {
109
- match = matches[++k];
110
- q = props[p];
111
- // check if given property is actually array
112
- if (typeof q === OBJ_TYPE && q.length > 0) {
113
- if (q.length == 2) {
114
- if (typeof q[1] == FUNC_TYPE) {
115
- // assign modified match
116
- result[q[0]] = q[1].call(this, match);
117
- } else {
118
- // assign given value, ignore regex match
119
- result[q[0]] = q[1];
120
- }
121
- } else if (q.length == 3) {
122
- // check whether function or regex
123
- if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
124
- // call function (usually string mapper)
125
- result[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
126
- } else {
127
- // sanitize match using given regex
128
- result[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
129
- }
130
- } else if (q.length == 4) {
131
- result[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
132
- }
133
- } else {
134
- result[q] = match ? match : undefined;
135
- }
136
- }
137
- }
138
- }
139
- i += 2;
140
- }
141
- return result;
142
- },
143
-
144
- str : function (str, map) {
145
-
146
- for (var i in map) {
147
- // check if array
148
- if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
149
- for (var j = 0; j < map[i].length; j++) {
150
- if (util.has(map[i][j], str)) {
151
- return (i === UNKNOWN) ? undefined : i;
152
- }
153
- }
154
- } else if (util.has(map[i], str)) {
155
- return (i === UNKNOWN) ? undefined : i;
156
- }
157
- }
158
- return str;
159
- }
160
- };
161
-
162
-
163
- ///////////////
164
- // String map
165
- //////////////
166
-
167
-
168
- var maps = {
169
-
170
- browser : {
171
- oldsafari : {
172
- version : {
173
- '1.0' : '/8',
174
- '1.2' : '/1',
175
- '1.3' : '/3',
176
- '2.0' : '/412',
177
- '2.0.2' : '/416',
178
- '2.0.3' : '/417',
179
- '2.0.4' : '/419',
180
- '?' : '/'
181
- }
182
- }
183
- },
184
-
185
- device : {
186
- amazon : {
187
- model : {
188
- 'Fire Phone' : ['SD', 'KF']
189
- }
190
- },
191
- sprint : {
192
- model : {
193
- 'Evo Shift 4G' : '7373KT'
194
- },
195
- vendor : {
196
- 'HTC' : 'APA',
197
- 'Sprint' : 'Sprint'
198
- }
199
- }
200
- },
201
-
202
- os : {
203
- windows : {
204
- version : {
205
- 'ME' : '4.90',
206
- 'NT 3.11' : 'NT3.51',
207
- 'NT 4.0' : 'NT4.0',
208
- '2000' : 'NT 5.0',
209
- 'XP' : ['NT 5.1', 'NT 5.2'],
210
- 'Vista' : 'NT 6.0',
211
- '7' : 'NT 6.1',
212
- '8' : 'NT 6.2',
213
- '8.1' : 'NT 6.3',
214
- '10' : ['NT 6.4', 'NT 10.0'],
215
- 'RT' : 'ARM'
216
- }
217
- }
218
- }
219
- };
220
-
221
-
222
- //////////////
223
- // Regex map
224
- /////////////
225
-
226
-
227
- var regexes = {
228
-
229
- browser : [[
230
-
231
- // Presto based
232
- /(opera\smini)\/([\w\.-]+)/i, // Opera Mini
233
- /(opera\s[mobiletab]+).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
234
- /(opera).+version\/([\w\.]+)/i, // Opera > 9.80
235
- /(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
236
-
237
- ], [NAME, VERSION], [
238
-
239
- /\s(opr)\/([\w\.]+)/i // Opera Webkit
240
- ], [[NAME, 'Opera'], VERSION], [
241
-
242
- // Mixed
243
- /(kindle)\/([\w\.]+)/i, // Kindle
244
- /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,
245
- // Lunascape/Maxthon/Netfront/Jasmine/Blazer
246
-
247
- // Trident based
248
- /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,
249
- // Avant/IEMobile/SlimBrowser/Baidu
250
- /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
251
-
252
- // Webkit/KHTML based
253
- /(rekonq)\/([\w\.]+)*/i, // Rekonq
254
- /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs)\/([\w\.-]+)/i
255
- // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS
256
- ], [NAME, VERSION], [
257
-
258
- /(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
259
- ], [[NAME, 'IE'], VERSION], [
260
-
261
- /(edge)\/((\d+)?[\w\.]+)/i // Microsoft Edge
262
- ], [NAME, VERSION], [
263
-
264
- /(yabrowser)\/([\w\.]+)/i // Yandex
265
- ], [[NAME, 'Yandex'], VERSION], [
266
-
267
- /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
268
- ], [[NAME, /_/g, ' '], VERSION], [
269
-
270
- /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i,
271
- // Chrome/OmniWeb/Arora/Tizen/Nokia
272
- /(qqbrowser)[\/\s]?([\w\.]+)/i
273
- // QQBrowser
274
- ], [NAME, VERSION], [
275
-
276
- /(uc\s?browser)[\/\s]?([\w\.]+)/i,
277
- /ucweb.+(ucbrowser)[\/\s]?([\w\.]+)/i,
278
- /JUC.+(ucweb)[\/\s]?([\w\.]+)/i
279
- // UCBrowser
280
- ], [[NAME, 'UCBrowser'], VERSION], [
281
-
282
- /(dolfin)\/([\w\.]+)/i // Dolphin
283
- ], [[NAME, 'Dolphin'], VERSION], [
284
-
285
- /((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
286
- ], [[NAME, 'Chrome'], VERSION], [
287
-
288
- /XiaoMi\/MiuiBrowser\/([\w\.]+)/i // MIUI Browser
289
- ], [VERSION, [NAME, 'MIUI Browser']], [
290
-
291
- /android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)/i // Android Browser
292
- ], [VERSION, [NAME, 'Android Browser']], [
293
-
294
- /FBAV\/([\w\.]+);/i // Facebook App for iOS
295
- ], [VERSION, [NAME, 'Facebook']], [
296
-
297
- /fxios\/([\w\.-]+)/i // Firefox for iOS
298
- ], [VERSION, [NAME, 'Firefox']], [
299
-
300
- /version\/([\w\.]+).+?mobile\/\w+\s(safari)/i // Mobile Safari
301
- ], [VERSION, [NAME, 'Mobile Safari']], [
302
-
303
- /version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
304
- ], [VERSION, NAME], [
305
-
306
- /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
307
- ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
308
-
309
- /(konqueror)\/([\w\.]+)/i, // Konqueror
310
- /(webkit|khtml)\/([\w\.]+)/i
311
- ], [NAME, VERSION], [
312
-
313
- // Gecko based
314
- /(navigator|netscape)\/([\w\.-]+)/i // Netscape
315
- ], [[NAME, 'Netscape'], VERSION], [
316
- /(swiftfox)/i, // Swiftfox
317
- /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
318
- // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
319
- /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,
320
- // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
321
- /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
322
-
323
- // Other
324
- /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,
325
- // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir
326
- /(links)\s\(([\w\.]+)/i, // Links
327
- /(gobrowser)\/?([\w\.]+)*/i, // GoBrowser
328
- /(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
329
- /(mosaic)[\/\s]([\w\.]+)/i // Mosaic
330
- ], [NAME, VERSION]
331
-
332
- /* /////////////////////
333
- // Media players BEGIN
334
- ////////////////////////
335
-
336
- , [
337
-
338
- /(apple(?:coremedia|))\/((\d+)[\w\._]+)/i, // Generic Apple CoreMedia
339
- /(coremedia) v((\d+)[\w\._]+)/i
340
- ], [NAME, VERSION], [
341
-
342
- /(aqualung|lyssna|bsplayer)\/((\d+)?[\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
343
- ], [NAME, VERSION], [
344
-
345
- /(ares|ossproxy)\s((\d+)[\w\.-]+)/i // Ares/OSSProxy
346
- ], [NAME, VERSION], [
347
-
348
- /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/((\d+)[\w\.-]+)/i,
349
- // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
350
- // NSPlayer/PSP-InternetRadioPlayer/Videos
351
- /(clementine|music player daemon)\s((\d+)[\w\.-]+)/i, // Clementine/MPD
352
- /(lg player|nexplayer)\s((\d+)[\d\.]+)/i,
353
- /player\/(nexplayer|lg player)\s((\d+)[\w\.-]+)/i // NexPlayer/LG Player
354
- ], [NAME, VERSION], [
355
- /(nexplayer)\s((\d+)[\w\.-]+)/i // Nexplayer
356
- ], [NAME, VERSION], [
357
-
358
- /(flrp)\/((\d+)[\w\.-]+)/i // Flip Player
359
- ], [[NAME, 'Flip Player'], VERSION], [
360
-
361
- /(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
362
- // FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
363
- ], [NAME], [
364
-
365
- /(gstreamer) souphttpsrc (?:\([^\)]+\)){0,1} libsoup\/((\d+)[\w\.-]+)/i
366
- // Gstreamer
367
- ], [NAME, VERSION], [
368
-
369
- /(htc streaming player)\s[\w_]+\s\/\s((\d+)[\d\.]+)/i, // HTC Streaming Player
370
- /(java|python-urllib|python-requests|wget|libcurl)\/((\d+)[\w\.-_]+)/i,
371
- // Java/urllib/requests/wget/cURL
372
- /(lavf)((\d+)[\d\.]+)/i // Lavf (FFMPEG)
373
- ], [NAME, VERSION], [
374
-
375
- /(htc_one_s)\/((\d+)[\d\.]+)/i // HTC One S
376
- ], [[NAME, /_/g, ' '], VERSION], [
377
-
378
- /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+){0,1})/i
379
- // MPlayer SVN
380
- ], [NAME, VERSION], [
381
-
382
- /(mplayer)(?:\s|\/|[unkow-]+)((\d+)[\w\.-]+)/i // MPlayer
383
- ], [NAME, VERSION], [
384
-
385
- /(mplayer)/i, // MPlayer (no other info)
386
- /(yourmuze)/i, // YourMuze
387
- /(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
388
- ], [NAME], [
389
-
390
- /(nero (?:home|scout))\/((\d+)[\w\.-]+)/i // Nero Home/Nero Scout
391
- ], [NAME, VERSION], [
392
-
393
- /(nokia\d+)\/((\d+)[\w\.-]+)/i // Nokia
394
- ], [NAME, VERSION], [
395
-
396
- /\s(songbird)\/((\d+)[\w\.-]+)/i // Songbird/Philips-Songbird
397
- ], [NAME, VERSION], [
398
-
399
- /(winamp)3 version ((\d+)[\w\.-]+)/i, // Winamp
400
- /(winamp)\s((\d+)[\w\.-]+)/i,
401
- /(winamp)mpeg\/((\d+)[\w\.-]+)/i
402
- ], [NAME, VERSION], [
403
-
404
- /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
405
- // inlight radio
406
- ], [NAME], [
407
-
408
- /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/((\d+)[\w\.-]+)/i
409
- // QuickTime/RealMedia/RadioApp/RadioClientApplication/
410
- // SoundTap/Totem/Stagefright/Streamium
411
- ], [NAME, VERSION], [
412
-
413
- /(smp)((\d+)[\d\.]+)/i // SMP
414
- ], [NAME, VERSION], [
415
-
416
- /(vlc) media player - version ((\d+)[\w\.]+)/i, // VLC Videolan
417
- /(vlc)\/((\d+)[\w\.-]+)/i,
418
- /(xbmc|gvfs|xine|xmms|irapp)\/((\d+)[\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
419
- /(foobar2000)\/((\d+)[\d\.]+)/i, // Foobar2000
420
- /(itunes)\/((\d+)[\d\.]+)/i // iTunes
421
- ], [NAME, VERSION], [
422
-
423
- /(wmplayer)\/((\d+)[\w\.-]+)/i, // Windows Media Player
424
- /(windows-media-player)\/((\d+)[\w\.-]+)/i
425
- ], [[NAME, /-/g, ' '], VERSION], [
426
-
427
- /windows\/((\d+)[\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i
428
- // Windows Media Server
429
- ], [VERSION, [NAME, 'Windows']], [
430
-
431
- /(com\.riseupradioalarm)\/((\d+)[\d\.]*)/i // RiseUP Radio Alarm
432
- ], [NAME, VERSION], [
433
-
434
- /(rad.io)\s((\d+)[\d\.]+)/i, // Rad.io
435
- /(radio.(?:de|at|fr))\s((\d+)[\d\.]+)/i
436
- ], [[NAME, 'rad.io'], VERSION]
437
-
438
- //////////////////////
439
- // Media players END
440
- ////////////////////*/
441
-
442
- ],
443
-
444
- cpu : [[
445
-
446
- /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64
447
- ], [[ARCHITECTURE, 'amd64']], [
448
-
449
- /(ia32(?=;))/i // IA32 (quicktime)
450
- ], [[ARCHITECTURE, util.lowerize]], [
451
-
452
- /((?:i[346]|x)86)[;\)]/i // IA32
453
- ], [[ARCHITECTURE, 'ia32']], [
454
-
455
- // PocketPC mistakenly identified as PowerPC
456
- /windows\s(ce|mobile);\sppc;/i
457
- ], [[ARCHITECTURE, 'arm']], [
458
-
459
- /((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i // PowerPC
460
- ], [[ARCHITECTURE, /ower/, '', util.lowerize]], [
461
-
462
- /(sun4\w)[;\)]/i // SPARC
463
- ], [[ARCHITECTURE, 'sparc']], [
464
-
465
- /((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
466
- // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
467
- ], [[ARCHITECTURE, util.lowerize]]
468
- ],
469
-
470
- device : [[
471
-
472
- /\((ipad|playbook);[\w\s\);-]+(rim|apple)/i // iPad/PlayBook
473
- ], [MODEL, VENDOR, [TYPE, TABLET]], [
474
-
475
- /applecoremedia\/[\w\.]+ \((ipad)/ // iPad
476
- ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
477
-
478
- /(apple\s{0,1}tv)/i // Apple TV
479
- ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple']], [
480
-
481
- /(archos)\s(gamepad2?)/i, // Archos
482
- /(hp).+(touchpad)/i, // HP TouchPad
483
- /(kindle)\/([\w\.]+)/i, // Kindle
484
- /\s(nook)[\w\s]+build\/(\w+)/i, // Nook
485
- /(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
486
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
487
-
488
- /(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i // Kindle Fire HD
489
- ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
490
- /(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i // Fire Phone
491
- ], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
492
-
493
- /\((ip[honed|\s\w*]+);.+(apple)/i // iPod/iPhone
494
- ], [MODEL, VENDOR, [TYPE, MOBILE]], [
495
- /\((ip[honed|\s\w*]+);/i // iPod/iPhone
496
- ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
497
-
498
- /(blackberry)[\s-]?(\w+)/i, // BlackBerry
499
- /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|huawei|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,
500
- // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Huawei/Meizu/Motorola/Polytron
501
- /(hp)\s([\w\s]+\w)/i, // HP iPAQ
502
- /(asus)-?(\w+)/i // Asus
503
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
504
- /\(bb10;\s(\w+)/i // BlackBerry 10
505
- ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
506
- // Asus Tablets
507
- /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7)/i
508
- ], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
509
-
510
- /(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
511
- /(sony)?(?:sgp.+)\sbuild\//i
512
- ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
513
- /(?:sony)?(?:(?:(?:c|d)\d{4})|(?:so[-l].+))\sbuild\//i
514
- ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Phone'], [TYPE, MOBILE]], [
515
-
516
- /\s(ouya)\s/i, // Ouya
517
- /(nintendo)\s([wids3u]+)/i // Nintendo
518
- ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
519
-
520
- /android.+;\s(shield)\sbuild/i // Nvidia
521
- ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
522
-
523
- /(playstation\s[34portablevi]+)/i // Playstation
524
- ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
525
-
526
- /(sprint\s(\w+))/i // Sprint Phones
527
- ], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
528
-
529
- /(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i // Lenovo tablets
530
- ], [VENDOR, MODEL, [TYPE, TABLET]], [
531
-
532
- /(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
533
- /(zte)-(\w+)*/i, // ZTE
534
- /(alcatel|geeksphone|huawei|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
535
- // Alcatel/GeeksPhone/Huawei/Lenovo/Nexian/Panasonic/Sony
536
- ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
537
-
538
- /(nexus\s9)/i // HTC Nexus 9
539
- ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
540
-
541
- /[\s\(;](xbox(?:\sone)?)[\s\);]/i // Microsoft Xbox
542
- ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
543
- /(kin\.[onetw]{3})/i // Microsoft Kin
544
- ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
545
-
546
- // Motorola
547
- /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i,
548
- /mot[\s-]?(\w+)*/i,
549
- /(XT\d{3,4}) build\//i,
550
- /(nexus\s[6])/i
551
- ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
552
- /android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
553
- ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
554
-
555
- /android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n8000|sgh-t8[56]9|nexus 10))/i,
556
- /((SM-T\w+))/i
557
- ], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
558
- /((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-n900))/i,
559
- /(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,
560
- /sec-((sgh\w+))/i
561
- ], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
562
- /(samsung);smarttv/i
563
- ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
564
-
565
- /\(dtv[\);].+(aquos)/i // Sharp
566
- ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
567
- /sie-(\w+)*/i // Siemens
568
- ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
569
-
570
- /(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia
571
- /(nokia)[\s_-]?([\w-]+)*/i
572
- ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
573
-
574
- /android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer
575
- ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
576
-
577
- /android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
578
- ], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
579
- /(lg) netcast\.tv/i // LG SmartTV
580
- ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
581
- /(nexus\s[45])/i, // LG
582
- /lg[e;\s\/-]+(\w+)*/i
583
- ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
584
-
585
- /android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
586
- ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
587
-
588
- /linux;.+((jolla));/i // Jolla
589
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
590
-
591
- /((pebble))app\/[\d\.]+\s/i // Pebble
592
- ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
593
-
594
- /android.+;\s(glass)\s\d/i // Google Glass
595
- ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
596
-
597
- /android.+(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
598
- /android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
599
- /android.+(mi[\s\-_]*(?:one|one[\s_]plus)?[\s_]*(?:\d\w)?)\s+build/i // Xiaomi Mi
600
- ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
601
-
602
- /\s(tablet)[;\/\s]/i, // Unidentifiable Tablet
603
- /\s(mobile)[;\/\s]/i // Unidentifiable Mobile
604
- ], [[TYPE, util.lowerize], VENDOR, MODEL]
605
-
606
- /*//////////////////////////
607
- // TODO: move to string map
608
- ////////////////////////////
609
-
610
- /(C6603)/i // Sony Xperia Z C6603
611
- ], [[MODEL, 'Xperia Z C6603'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
612
- /(C6903)/i // Sony Xperia Z 1
613
- ], [[MODEL, 'Xperia Z 1'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
614
-
615
- /(SM-G900[F|H])/i // Samsung Galaxy S5
616
- ], [[MODEL, 'Galaxy S5'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
617
- /(SM-G7102)/i // Samsung Galaxy Grand 2
618
- ], [[MODEL, 'Galaxy Grand 2'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
619
- /(SM-G530H)/i // Samsung Galaxy Grand Prime
620
- ], [[MODEL, 'Galaxy Grand Prime'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
621
- /(SM-G313HZ)/i // Samsung Galaxy V
622
- ], [[MODEL, 'Galaxy V'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
623
- /(SM-T805)/i // Samsung Galaxy Tab S 10.5
624
- ], [[MODEL, 'Galaxy Tab S 10.5'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
625
- /(SM-G800F)/i // Samsung Galaxy S5 Mini
626
- ], [[MODEL, 'Galaxy S5 Mini'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
627
- /(SM-T311)/i // Samsung Galaxy Tab 3 8.0
628
- ], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
629
-
630
- /(R1001)/i // Oppo R1001
631
- ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
632
- /(X9006)/i // Oppo Find 7a
633
- ], [[MODEL, 'Find 7a'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
634
- /(R2001)/i // Oppo YOYO R2001
635
- ], [[MODEL, 'Yoyo R2001'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
636
- /(R815)/i // Oppo Clover R815
637
- ], [[MODEL, 'Clover R815'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
638
- /(U707)/i // Oppo Find Way S
639
- ], [[MODEL, 'Find Way S'], [VENDOR, 'Oppo'], [TYPE, MOBILE]], [
640
-
641
- /(T3C)/i // Advan Vandroid T3C
642
- ], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [
643
- /(ADVAN T1J\+)/i // Advan Vandroid T1J+
644
- ], [[MODEL, 'Vandroid T1J+'], [VENDOR, 'Advan'], [TYPE, TABLET]], [
645
- /(ADVAN S4A)/i // Advan Vandroid S4A
646
- ], [[MODEL, 'Vandroid S4A'], [VENDOR, 'Advan'], [TYPE, MOBILE]], [
647
-
648
- /(V972M)/i // ZTE V972M
649
- ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
650
-
651
- /(i-mobile)\s(IQ\s[\d\.]+)/i // i-mobile IQ
652
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
653
- /(IQ6.3)/i // i-mobile IQ IQ 6.3
654
- ], [[MODEL, 'IQ 6.3'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
655
- /(i-mobile)\s(i-style\s[\d\.]+)/i // i-mobile i-STYLE
656
- ], [VENDOR, MODEL, [TYPE, MOBILE]], [
657
- /(i-STYLE2.1)/i // i-mobile i-STYLE 2.1
658
- ], [[MODEL, 'i-STYLE 2.1'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
659
-
660
- /(mobiistar touch LAI 512)/i // mobiistar touch LAI 512
661
- ], [[MODEL, 'Touch LAI 512'], [VENDOR, 'mobiistar'], [TYPE, MOBILE]], [
662
-
663
- /////////////
664
- // END TODO
665
- ///////////*/
666
-
667
- ],
668
-
669
- engine : [[
670
-
671
- /windows.+\sedge\/([\w\.]+)/i // EdgeHTML
672
- ], [VERSION, [NAME, 'EdgeHTML']], [
673
-
674
- /(presto)\/([\w\.]+)/i, // Presto
675
- /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m
676
- /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
677
- /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
678
- ], [NAME, VERSION], [
679
-
680
- /rv\:([\w\.]+).*(gecko)/i // Gecko
681
- ], [VERSION, NAME]
682
- ],
683
-
684
- os : [[
685
-
686
- // Windows based
687
- /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
688
- ], [NAME, VERSION], [
689
- /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
690
- /(windows\sphone(?:\sos)*|windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
691
- ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
692
- /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
693
- ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
694
-
695
- // Mobile/Embedded OS
696
- /\((bb)(10);/i // BlackBerry 10
697
- ], [[NAME, 'BlackBerry'], VERSION], [
698
- /(blackberry)\w*\/?([\w\.]+)*/i, // Blackberry
699
- /(tizen)[\/\s]([\w\.]+)/i, // Tizen
700
- /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,
701
- // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki
702
- /linux;.+(sailfish);/i // Sailfish OS
703
- ], [NAME, VERSION], [
704
- /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i // Symbian
705
- ], [[NAME, 'Symbian'], VERSION], [
706
- /\((series40);/i // Series 40
707
- ], [NAME], [
708
- /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
709
- ], [[NAME, 'Firefox OS'], VERSION], [
710
-
711
- // Console
712
- /(nintendo|playstation)\s([wids34portablevu]+)/i, // Nintendo/Playstation
713
-
714
- // GNU/Linux based
715
- /(mint)[\/\s\(]?(\w+)*/i, // Mint
716
- /(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
717
- /(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?([\w\.-]+)*/i,
718
- // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
719
- // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
720
- /(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux
721
- /(gnu)\s?([\w\.]+)*/i // GNU
722
- ], [NAME, VERSION], [
723
-
724
- /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
725
- ], [[NAME, 'Chromium OS'], VERSION],[
726
-
727
- // Solaris
728
- /(sunos)\s?([\w\.]+\d)*/i // Solaris
729
- ], [[NAME, 'Solaris'], VERSION], [
730
-
731
- // BSD based
732
- /\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
733
- ], [NAME, VERSION],[
734
-
735
- /(ip[honead]+)(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i // iOS
736
- ], [[NAME, 'iOS'], [VERSION, /_/g, '.']], [
737
-
738
- /(mac\sos\sx)\s?([\w\s\.]+\w)*/i,
739
- /(macintosh|mac(?=_powerpc)\s)/i // Mac OS
740
- ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
741
-
742
- // Other
743
- /((?:open)?solaris)[\/\s-]?([\w\.]+)*/i, // Solaris
744
- /(haiku)\s(\w+)/i, // Haiku
745
- /(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX
746
- /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,
747
- // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS
748
- /(unix)\s?([\w\.]+)*/i // UNIX
749
- ], [NAME, VERSION]
750
- ]
751
- };
752
-
753
-
754
- /////////////////
755
- // Constructor
756
- ////////////////
757
-
758
-
759
- var UAParser = function (uastring, extensions) {
760
-
761
- if (!(this instanceof UAParser)) {
762
- return new UAParser(uastring, extensions).getResult();
763
- }
764
-
765
- var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
766
- var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
767
-
768
- this.getBrowser = function () {
769
- var browser = mapper.rgx.apply(this, rgxmap.browser);
770
- browser.major = util.major(browser.version);
771
- return browser;
772
- };
773
- this.getCPU = function () {
774
- return mapper.rgx.apply(this, rgxmap.cpu);
775
- };
776
- this.getDevice = function () {
777
- return mapper.rgx.apply(this, rgxmap.device);
778
- };
779
- this.getEngine = function () {
780
- return mapper.rgx.apply(this, rgxmap.engine);
781
- };
782
- this.getOS = function () {
783
- return mapper.rgx.apply(this, rgxmap.os);
784
- };
785
- this.getResult = function() {
786
- return {
787
- ua : this.getUA(),
788
- browser : this.getBrowser(),
789
- engine : this.getEngine(),
790
- os : this.getOS(),
791
- device : this.getDevice(),
792
- cpu : this.getCPU()
793
- };
794
- };
795
- this.getUA = function () {
796
- return ua;
797
- };
798
- this.setUA = function (uastring) {
799
- ua = uastring;
800
- return this;
801
- };
802
- this.setUA(ua);
803
- return this;
804
- };
805
-
806
- UAParser.VERSION = LIBVERSION;
807
- UAParser.BROWSER = {
808
- NAME : NAME,
809
- MAJOR : MAJOR, // deprecated
810
- VERSION : VERSION
811
- };
812
- UAParser.CPU = {
813
- ARCHITECTURE : ARCHITECTURE
814
- };
815
- UAParser.DEVICE = {
816
- MODEL : MODEL,
817
- VENDOR : VENDOR,
818
- TYPE : TYPE,
819
- CONSOLE : CONSOLE,
820
- MOBILE : MOBILE,
821
- SMARTTV : SMARTTV,
822
- TABLET : TABLET,
823
- WEARABLE: WEARABLE,
824
- EMBEDDED: EMBEDDED
825
- };
826
- UAParser.ENGINE = {
827
- NAME : NAME,
828
- VERSION : VERSION
829
- };
830
- UAParser.OS = {
831
- NAME : NAME,
832
- VERSION : VERSION
833
- };
834
-
835
-
836
- ///////////
837
- // Export
838
- //////////
839
-
840
-
841
- // check js environment
842
- if (typeof(exports) !== UNDEF_TYPE) {
843
- // nodejs env
844
- if (typeof module !== UNDEF_TYPE && module.exports) {
845
- exports = module.exports = UAParser;
846
- }
847
- exports.UAParser = UAParser;
848
- } else {
849
- // requirejs env (optional)
850
- if (typeof(define) === FUNC_TYPE && define.amd) {
851
- define(function () {
852
- return UAParser;
853
- });
854
- } else {
855
- // browser env
856
- window.UAParser = UAParser;
857
- }
858
- }
859
-
860
- // jQuery/Zepto specific (optional)
861
- // Note:
862
- // In AMD env the global scope should be kept clean, but jQuery is an exception.
863
- // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
864
- // and we should catch that.
865
- var $ = window.jQuery || window.Zepto;
866
- if (typeof $ !== UNDEF_TYPE) {
867
- var parser = new UAParser();
868
- $.ua = parser.getResult();
869
- $.ua.get = function() {
870
- return parser.getUA();
871
- };
872
- $.ua.set = function (uastring) {
873
- parser.setUA(uastring);
874
- var result = parser.getResult();
875
- for (var prop in result) {
876
- $.ua[prop] = result[prop];
877
- }
878
- };
879
- }
880
-
881
- })(typeof window === 'object' ? window : this);
1
+ /**
2
+ * UAParser.js v0.7.14
3
+ * Lightweight JavaScript-based User-Agent string parser
4
+ * https://github.com/faisalman/ua-parser-js
5
+ *
6
+ * Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com>
7
+ * Dual licensed under GPLv2 & MIT
8
+ */
9
+
10
+ (function (window, undefined) {
11
+
12
+ 'use strict';
13
+
14
+ //////////////
15
+ // Constants
16
+ /////////////
17
+
18
+
19
+ var LIBVERSION = '0.7.14',
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
+
40
+
41
+ ///////////
42
+ // Helper
43
+ //////////
44
+
45
+
46
+ var util = {
47
+ extend : function (regexes, extensions) {
48
+ var margedRegexes = {};
49
+ for (var i in regexes) {
50
+ if (extensions[i] && extensions[i].length % 2 === 0) {
51
+ margedRegexes[i] = extensions[i].concat(regexes[i]);
52
+ } else {
53
+ margedRegexes[i] = regexes[i];
54
+ }
55
+ }
56
+ return margedRegexes;
57
+ },
58
+ has : function (str1, str2) {
59
+ if (typeof str1 === "string") {
60
+ return str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1;
61
+ } else {
62
+ return false;
63
+ }
64
+ },
65
+ lowerize : function (str) {
66
+ return str.toLowerCase();
67
+ },
68
+ major : function (version) {
69
+ return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g,'').split(".")[0] : undefined;
70
+ },
71
+ trim : function (str) {
72
+ return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
73
+ }
74
+ };
75
+
76
+
77
+ ///////////////
78
+ // Map helper
79
+ //////////////
80
+
81
+
82
+ var mapper = {
83
+
84
+ rgx : function (ua, arrays) {
85
+
86
+ //var result = {},
87
+ var i = 0, j, k, p, q, matches, match;//, args = arguments;
88
+
89
+ /*// construct object barebones
90
+ for (p = 0; p < args[1].length; p++) {
91
+ q = args[1][p];
92
+ result[typeof q === OBJ_TYPE ? q[0] : q] = undefined;
93
+ }*/
94
+
95
+ // loop through all regexes maps
96
+ while (i < arrays.length && !matches) {
97
+
98
+ var regex = arrays[i], // even sequence (0,2,4,..)
99
+ props = arrays[i + 1]; // odd sequence (1,3,5,..)
100
+ j = k = 0;
101
+
102
+ // try matching uastring with regexes
103
+ while (j < regex.length && !matches) {
104
+
105
+ matches = regex[j++].exec(ua);
106
+
107
+ if (!!matches) {
108
+ for (p = 0; p < props.length; p++) {
109
+ match = matches[++k];
110
+ q = props[p];
111
+ // check if given property is actually array
112
+ if (typeof q === OBJ_TYPE && q.length > 0) {
113
+ if (q.length == 2) {
114
+ if (typeof q[1] == FUNC_TYPE) {
115
+ // assign modified match
116
+ this[q[0]] = q[1].call(this, match);
117
+ } else {
118
+ // assign given value, ignore regex match
119
+ this[q[0]] = q[1];
120
+ }
121
+ } else if (q.length == 3) {
122
+ // check whether function or regex
123
+ if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
124
+ // call function (usually string mapper)
125
+ this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
126
+ } else {
127
+ // sanitize match using given regex
128
+ this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
129
+ }
130
+ } else if (q.length == 4) {
131
+ this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
132
+ }
133
+ } else {
134
+ this[q] = match ? match : undefined;
135
+ }
136
+ }
137
+ }
138
+ }
139
+ i += 2;
140
+ }
141
+ //console.log(this);
142
+ //return this;
143
+ },
144
+
145
+ str : function (str, map) {
146
+
147
+ for (var i in map) {
148
+ // check if array
149
+ if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
150
+ for (var j = 0; j < map[i].length; j++) {
151
+ if (util.has(map[i][j], str)) {
152
+ return (i === UNKNOWN) ? undefined : i;
153
+ }
154
+ }
155
+ } else if (util.has(map[i], str)) {
156
+ return (i === UNKNOWN) ? undefined : i;
157
+ }
158
+ }
159
+ return str;
160
+ }
161
+ };
162
+
163
+
164
+ ///////////////
165
+ // String map
166
+ //////////////
167
+
168
+
169
+ var maps = {
170
+
171
+ browser : {
172
+ oldsafari : {
173
+ version : {
174
+ '1.0' : '/8',
175
+ '1.2' : '/1',
176
+ '1.3' : '/3',
177
+ '2.0' : '/412',
178
+ '2.0.2' : '/416',
179
+ '2.0.3' : '/417',
180
+ '2.0.4' : '/419',
181
+ '?' : '/'
182
+ }
183
+ }
184
+ },
185
+
186
+ device : {
187
+ amazon : {
188
+ model : {
189
+ 'Fire Phone' : ['SD', 'KF']
190
+ }
191
+ },
192
+ sprint : {
193
+ model : {
194
+ 'Evo Shift 4G' : '7373KT'
195
+ },
196
+ vendor : {
197
+ 'HTC' : 'APA',
198
+ 'Sprint' : 'Sprint'
199
+ }
200
+ }
201
+ },
202
+
203
+ os : {
204
+ windows : {
205
+ version : {
206
+ 'ME' : '4.90',
207
+ 'NT 3.11' : 'NT3.51',
208
+ 'NT 4.0' : 'NT4.0',
209
+ '2000' : 'NT 5.0',
210
+ 'XP' : ['NT 5.1', 'NT 5.2'],
211
+ 'Vista' : 'NT 6.0',
212
+ '7' : 'NT 6.1',
213
+ '8' : 'NT 6.2',
214
+ '8.1' : 'NT 6.3',
215
+ '10' : ['NT 6.4', 'NT 10.0'],
216
+ 'RT' : 'ARM'
217
+ }
218
+ }
219
+ }
220
+ };
221
+
222
+
223
+ //////////////
224
+ // Regex map
225
+ /////////////
226
+
227
+
228
+ var regexes = {
229
+
230
+ browser : [[
231
+
232
+ // Presto based
233
+ /(opera\smini)\/([\w\.-]+)/i, // Opera Mini
234
+ /(opera\s[mobiletab]+).+version\/([\w\.-]+)/i, // Opera Mobi/Tablet
235
+ /(opera).+version\/([\w\.]+)/i, // Opera > 9.80
236
+ /(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80
237
+ ], [NAME, VERSION], [
238
+
239
+ /(opios)[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0
240
+ ], [[NAME, 'Opera Mini'], VERSION], [
241
+
242
+ /\s(opr)\/([\w\.]+)/i // Opera Webkit
243
+ ], [[NAME, 'Opera'], VERSION], [
244
+
245
+ // Mixed
246
+ /(kindle)\/([\w\.]+)/i, // Kindle
247
+ /(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]+)*/i,
248
+ // Lunascape/Maxthon/Netfront/Jasmine/Blazer
249
+
250
+ // Trident based
251
+ /(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,
252
+ // Avant/IEMobile/SlimBrowser/Baidu
253
+ /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer
254
+
255
+ // Webkit/KHTML based
256
+ /(rekonq)\/([\w\.]+)*/i, // Rekonq
257
+ /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser)\/([\w\.-]+)/i
258
+ // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser
259
+ ], [NAME, VERSION], [
260
+
261
+ /(trident).+rv[:\s]([\w\.]+).+like\sgecko/i // IE11
262
+ ], [[NAME, 'IE'], VERSION], [
263
+
264
+ /(edge)\/((\d+)?[\w\.]+)/i // Microsoft Edge
265
+ ], [NAME, VERSION], [
266
+
267
+ /(yabrowser)\/([\w\.]+)/i // Yandex
268
+ ], [[NAME, 'Yandex'], VERSION], [
269
+
270
+ /(puffin)\/([\w\.]+)/i // Puffin
271
+ ], [[NAME, 'Puffin'], VERSION], [
272
+
273
+ /((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i
274
+ // UCBrowser
275
+ ], [[NAME, 'UCBrowser'], VERSION], [
276
+
277
+ /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon
278
+ ], [[NAME, /_/g, ' '], VERSION], [
279
+
280
+ /(micromessenger)\/([\w\.]+)/i // WeChat
281
+ ], [[NAME, 'WeChat'], VERSION], [
282
+
283
+ /(QQ)\/([\d\.]+)/i // QQ, aka ShouQ
284
+ ], [NAME, VERSION], [
285
+
286
+ /m?(qqbrowser)[\/\s]?([\w\.]+)/i // QQBrowser
287
+ ], [NAME, VERSION], [
288
+
289
+ /xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser
290
+ ], [VERSION, [NAME, 'MIUI Browser']], [
291
+
292
+ /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android
293
+ ], [VERSION, [NAME, 'Facebook']], [
294
+
295
+ /(headlesschrome) ([\w\.]+)/i // Chrome Headless
296
+ ], [VERSION, [NAME, 'Chrome Headless']], [
297
+
298
+ /\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
299
+ ], [[NAME, /(.+)/, '$1 WebView'], VERSION], [
300
+
301
+ /((?:oculus|samsung)browser)\/([\w\.]+)/i
302
+ ], [[NAME, /(.+(?:g|us))(.+)/, '$1 $2'], VERSION], [ // Oculus / Samsung Browser
303
+
304
+ /android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i // Android Browser
305
+ ], [VERSION, [NAME, 'Android Browser']], [
306
+
307
+ /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i
308
+ // Chrome/OmniWeb/Arora/Tizen/Nokia
309
+ ], [NAME, VERSION], [
310
+
311
+ /(dolfin)\/([\w\.]+)/i // Dolphin
312
+ ], [[NAME, 'Dolphin'], VERSION], [
313
+
314
+ /((?:android.+)crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
315
+ ], [[NAME, 'Chrome'], VERSION], [
316
+
317
+ /(coast)\/([\w\.]+)/i // Opera Coast
318
+ ], [[NAME, 'Opera Coast'], VERSION], [
319
+
320
+ /fxios\/([\w\.-]+)/i // Firefox for iOS
321
+ ], [VERSION, [NAME, 'Firefox']], [
322
+
323
+ /version\/([\w\.]+).+?mobile\/\w+\s(safari)/i // Mobile Safari
324
+ ], [VERSION, [NAME, 'Mobile Safari']], [
325
+
326
+ /version\/([\w\.]+).+?(mobile\s?safari|safari)/i // Safari & Safari Mobile
327
+ ], [VERSION, NAME], [
328
+
329
+ /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
330
+ ], [NAME, [VERSION, mapper.str, maps.browser.oldsafari.version]], [
331
+
332
+ /(konqueror)\/([\w\.]+)/i, // Konqueror
333
+ /(webkit|khtml)\/([\w\.]+)/i
334
+ ], [NAME, VERSION], [
335
+
336
+ // Gecko based
337
+ /(navigator|netscape)\/([\w\.-]+)/i // Netscape
338
+ ], [[NAME, 'Netscape'], VERSION], [
339
+ /(swiftfox)/i, // Swiftfox
340
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,
341
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
342
+ /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix)\/([\w\.-]+)/i,
343
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
344
+ /(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i, // Mozilla
345
+
346
+ // Other
347
+ /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,
348
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir
349
+ /(links)\s\(([\w\.]+)/i, // Links
350
+ /(gobrowser)\/?([\w\.]+)*/i, // GoBrowser
351
+ /(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser
352
+ /(mosaic)[\/\s]([\w\.]+)/i // Mosaic
353
+ ], [NAME, VERSION]
354
+
355
+ /* /////////////////////
356
+ // Media players BEGIN
357
+ ////////////////////////
358
+
359
+ , [
360
+
361
+ /(apple(?:coremedia|))\/((\d+)[\w\._]+)/i, // Generic Apple CoreMedia
362
+ /(coremedia) v((\d+)[\w\._]+)/i
363
+ ], [NAME, VERSION], [
364
+
365
+ /(aqualung|lyssna|bsplayer)\/((\d+)?[\w\.-]+)/i // Aqualung/Lyssna/BSPlayer
366
+ ], [NAME, VERSION], [
367
+
368
+ /(ares|ossproxy)\s((\d+)[\w\.-]+)/i // Ares/OSSProxy
369
+ ], [NAME, VERSION], [
370
+
371
+ /(audacious|audimusicstream|amarok|bass|core|dalvik|gnomemplayer|music on console|nsplayer|psp-internetradioplayer|videos)\/((\d+)[\w\.-]+)/i,
372
+ // Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/Dalvik/GnomeMplayer/MoC
373
+ // NSPlayer/PSP-InternetRadioPlayer/Videos
374
+ /(clementine|music player daemon)\s((\d+)[\w\.-]+)/i, // Clementine/MPD
375
+ /(lg player|nexplayer)\s((\d+)[\d\.]+)/i,
376
+ /player\/(nexplayer|lg player)\s((\d+)[\w\.-]+)/i // NexPlayer/LG Player
377
+ ], [NAME, VERSION], [
378
+ /(nexplayer)\s((\d+)[\w\.-]+)/i // Nexplayer
379
+ ], [NAME, VERSION], [
380
+
381
+ /(flrp)\/((\d+)[\w\.-]+)/i // Flip Player
382
+ ], [[NAME, 'Flip Player'], VERSION], [
383
+
384
+ /(fstream|nativehost|queryseekspider|ia-archiver|facebookexternalhit)/i
385
+ // FStream/NativeHost/QuerySeekSpider/IA Archiver/facebookexternalhit
386
+ ], [NAME], [
387
+
388
+ /(gstreamer) souphttpsrc (?:\([^\)]+\)){0,1} libsoup\/((\d+)[\w\.-]+)/i
389
+ // Gstreamer
390
+ ], [NAME, VERSION], [
391
+
392
+ /(htc streaming player)\s[\w_]+\s\/\s((\d+)[\d\.]+)/i, // HTC Streaming Player
393
+ /(java|python-urllib|python-requests|wget|libcurl)\/((\d+)[\w\.-_]+)/i,
394
+ // Java/urllib/requests/wget/cURL
395
+ /(lavf)((\d+)[\d\.]+)/i // Lavf (FFMPEG)
396
+ ], [NAME, VERSION], [
397
+
398
+ /(htc_one_s)\/((\d+)[\d\.]+)/i // HTC One S
399
+ ], [[NAME, /_/g, ' '], VERSION], [
400
+
401
+ /(mplayer)(?:\s|\/)(?:(?:sherpya-){0,1}svn)(?:-|\s)(r\d+(?:-\d+[\w\.-]+){0,1})/i
402
+ // MPlayer SVN
403
+ ], [NAME, VERSION], [
404
+
405
+ /(mplayer)(?:\s|\/|[unkow-]+)((\d+)[\w\.-]+)/i // MPlayer
406
+ ], [NAME, VERSION], [
407
+
408
+ /(mplayer)/i, // MPlayer (no other info)
409
+ /(yourmuze)/i, // YourMuze
410
+ /(media player classic|nero showtime)/i // Media Player Classic/Nero ShowTime
411
+ ], [NAME], [
412
+
413
+ /(nero (?:home|scout))\/((\d+)[\w\.-]+)/i // Nero Home/Nero Scout
414
+ ], [NAME, VERSION], [
415
+
416
+ /(nokia\d+)\/((\d+)[\w\.-]+)/i // Nokia
417
+ ], [NAME, VERSION], [
418
+
419
+ /\s(songbird)\/((\d+)[\w\.-]+)/i // Songbird/Philips-Songbird
420
+ ], [NAME, VERSION], [
421
+
422
+ /(winamp)3 version ((\d+)[\w\.-]+)/i, // Winamp
423
+ /(winamp)\s((\d+)[\w\.-]+)/i,
424
+ /(winamp)mpeg\/((\d+)[\w\.-]+)/i
425
+ ], [NAME, VERSION], [
426
+
427
+ /(ocms-bot|tapinradio|tunein radio|unknown|winamp|inlight radio)/i // OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
428
+ // inlight radio
429
+ ], [NAME], [
430
+
431
+ /(quicktime|rma|radioapp|radioclientapplication|soundtap|totem|stagefright|streamium)\/((\d+)[\w\.-]+)/i
432
+ // QuickTime/RealMedia/RadioApp/RadioClientApplication/
433
+ // SoundTap/Totem/Stagefright/Streamium
434
+ ], [NAME, VERSION], [
435
+
436
+ /(smp)((\d+)[\d\.]+)/i // SMP
437
+ ], [NAME, VERSION], [
438
+
439
+ /(vlc) media player - version ((\d+)[\w\.]+)/i, // VLC Videolan
440
+ /(vlc)\/((\d+)[\w\.-]+)/i,
441
+ /(xbmc|gvfs|xine|xmms|irapp)\/((\d+)[\w\.-]+)/i, // XBMC/gvfs/Xine/XMMS/irapp
442
+ /(foobar2000)\/((\d+)[\d\.]+)/i, // Foobar2000
443
+ /(itunes)\/((\d+)[\d\.]+)/i // iTunes
444
+ ], [NAME, VERSION], [
445
+
446
+ /(wmplayer)\/((\d+)[\w\.-]+)/i, // Windows Media Player
447
+ /(windows-media-player)\/((\d+)[\w\.-]+)/i
448
+ ], [[NAME, /-/g, ' '], VERSION], [
449
+
450
+ /windows\/((\d+)[\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ (home media server)/i
451
+ // Windows Media Server
452
+ ], [VERSION, [NAME, 'Windows']], [
453
+
454
+ /(com\.riseupradioalarm)\/((\d+)[\d\.]*)/i // RiseUP Radio Alarm
455
+ ], [NAME, VERSION], [
456
+
457
+ /(rad.io)\s((\d+)[\d\.]+)/i, // Rad.io
458
+ /(radio.(?:de|at|fr))\s((\d+)[\d\.]+)/i
459
+ ], [[NAME, 'rad.io'], VERSION]
460
+
461
+ //////////////////////
462
+ // Media players END
463
+ ////////////////////*/
464
+
465
+ ],
466
+
467
+ cpu : [[
468
+
469
+ /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64
470
+ ], [[ARCHITECTURE, 'amd64']], [
471
+
472
+ /(ia32(?=;))/i // IA32 (quicktime)
473
+ ], [[ARCHITECTURE, util.lowerize]], [
474
+
475
+ /((?:i[346]|x)86)[;\)]/i // IA32
476
+ ], [[ARCHITECTURE, 'ia32']], [
477
+
478
+ // PocketPC mistakenly identified as PowerPC
479
+ /windows\s(ce|mobile);\sppc;/i
480
+ ], [[ARCHITECTURE, 'arm']], [
481
+
482
+ /((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i // PowerPC
483
+ ], [[ARCHITECTURE, /ower/, '', util.lowerize]], [
484
+
485
+ /(sun4\w)[;\)]/i // SPARC
486
+ ], [[ARCHITECTURE, 'sparc']], [
487
+
488
+ /((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i
489
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
490
+ ], [[ARCHITECTURE, util.lowerize]]
491
+ ],
492
+
493
+ device : [[
494
+
495
+ /\((ipad|playbook);[\w\s\);-]+(rim|apple)/i // iPad/PlayBook
496
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
497
+
498
+ /applecoremedia\/[\w\.]+ \((ipad)/ // iPad
499
+ ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [
500
+
501
+ /(apple\s{0,1}tv)/i // Apple TV
502
+ ], [[MODEL, 'Apple TV'], [VENDOR, 'Apple']], [
503
+
504
+ /(archos)\s(gamepad2?)/i, // Archos
505
+ /(hp).+(touchpad)/i, // HP TouchPad
506
+ /(hp).+(tablet)/i, // HP Tablet
507
+ /(kindle)\/([\w\.]+)/i, // Kindle
508
+ /\s(nook)[\w\s]+build\/(\w+)/i, // Nook
509
+ /(dell)\s(strea[kpr\s\d]*[\dko])/i // Dell Streak
510
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
511
+
512
+ /(kf[A-z]+)\sbuild\/[\w\.]+.*silk\//i // Kindle Fire HD
513
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
514
+ /(sd|kf)[0349hijorstuw]+\sbuild\/[\w\.]+.*silk\//i // Fire Phone
515
+ ], [[MODEL, mapper.str, maps.device.amazon.model], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [
516
+
517
+ /\((ip[honed|\s\w*]+);.+(apple)/i // iPod/iPhone
518
+ ], [MODEL, VENDOR, [TYPE, MOBILE]], [
519
+ /\((ip[honed|\s\w*]+);/i // iPod/iPhone
520
+ ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [
521
+
522
+ /(blackberry)[\s-]?(\w+)/i, // BlackBerry
523
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]+)*/i,
524
+ // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron
525
+ /(hp)\s([\w\s]+\w)/i, // HP iPAQ
526
+ /(asus)-?(\w+)/i // Asus
527
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
528
+ /\(bb10;\s(\w+)/i // BlackBerry 10
529
+ ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [
530
+ // Asus Tablets
531
+ /android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i
532
+ ], [MODEL, [VENDOR, 'Asus'], [TYPE, TABLET]], [
533
+
534
+ /(sony)\s(tablet\s[ps])\sbuild\//i, // Sony
535
+ /(sony)?(?:sgp.+)\sbuild\//i
536
+ ], [[VENDOR, 'Sony'], [MODEL, 'Xperia Tablet'], [TYPE, TABLET]], [
537
+ /android.+\s([c-g]\d{4}|so[-l]\w+)\sbuild\//i
538
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [
539
+
540
+ /\s(ouya)\s/i, // Ouya
541
+ /(nintendo)\s([wids3u]+)/i // Nintendo
542
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
543
+
544
+ /android.+;\s(shield)\sbuild/i // Nvidia
545
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
546
+
547
+ /(playstation\s[34portablevi]+)/i // Playstation
548
+ ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [
549
+
550
+ /(sprint\s(\w+))/i // Sprint Phones
551
+ ], [[VENDOR, mapper.str, maps.device.sprint.vendor], [MODEL, mapper.str, maps.device.sprint.model], [TYPE, MOBILE]], [
552
+
553
+ /(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i // Lenovo tablets
554
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
555
+
556
+ /(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i, // HTC
557
+ /(zte)-(\w+)*/i, // ZTE
558
+ /(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]+)*/i
559
+ // Alcatel/GeeksPhone/Lenovo/Nexian/Panasonic/Sony
560
+ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
561
+
562
+ /(nexus\s9)/i // HTC Nexus 9
563
+ ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
564
+
565
+ /d\/huawei([\w\s-]+)[;\)]/i,
566
+ /(nexus\s6p)/i // Huawei
567
+ ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [
568
+
569
+ /(microsoft);\s(lumia[\s\w]+)/i // Microsoft Lumia
570
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
571
+
572
+ /[\s\(;](xbox(?:\sone)?)[\s\);]/i // Microsoft Xbox
573
+ ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [
574
+ /(kin\.[onetw]{3})/i // Microsoft Kin
575
+ ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [
576
+
577
+ // Motorola
578
+ /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?(:?\s4g)?)[\w\s]+build\//i,
579
+ /mot[\s-]?(\w+)*/i,
580
+ /(XT\d{3,4}) build\//i,
581
+ /(nexus\s6)/i
582
+ ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [
583
+ /android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i
584
+ ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [
585
+
586
+ /hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices
587
+ ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [
588
+
589
+ /hbbtv.+maple;(\d+)/i
590
+ ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [
591
+
592
+ /\(dtv[\);].+(aquos)/i // Sharp
593
+ ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [
594
+
595
+ /android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,
596
+ /((SM-T\w+))/i
597
+ ], [[VENDOR, 'Samsung'], MODEL, [TYPE, TABLET]], [ // Samsung
598
+ /smart-tv.+(samsung)/i
599
+ ], [VENDOR, [TYPE, SMARTTV], MODEL], [
600
+ /((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,
601
+ /(sam[sung]*)[\s-]*(\w+-?[\w-]*)*/i,
602
+ /sec-((sgh\w+))/i
603
+ ], [[VENDOR, 'Samsung'], MODEL, [TYPE, MOBILE]], [
604
+
605
+ /sie-(\w+)*/i // Siemens
606
+ ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
607
+
608
+ /(maemo|nokia).*(n900|lumia\s\d+)/i, // Nokia
609
+ /(nokia)[\s_-]?([\w-]+)*/i
610
+ ], [[VENDOR, 'Nokia'], MODEL, [TYPE, MOBILE]], [
611
+
612
+ /android\s3\.[\s\w;-]{10}(a\d{3})/i // Acer
613
+ ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
614
+
615
+ /android.+([vl]k\-?\d{3})\s+build/i // LG Tablet
616
+ ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [
617
+ /android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i // LG Tablet
618
+ ], [[VENDOR, 'LG'], MODEL, [TYPE, TABLET]], [
619
+ /(lg) netcast\.tv/i // LG SmartTV
620
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
621
+ /(nexus\s[45])/i, // LG
622
+ /lg[e;\s\/-]+(\w+)*/i,
623
+ /android.+lg(\-?[\d\w]+)\s+build/i
624
+ ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [
625
+
626
+ /android.+(ideatab[a-z0-9\-\s]+)/i // Lenovo
627
+ ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
628
+
629
+ /linux;.+((jolla));/i // Jolla
630
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
631
+
632
+ /((pebble))app\/[\d\.]+\s/i // Pebble
633
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
634
+
635
+ /android.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO
636
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
637
+
638
+ /crkey/i // Google Chromecast
639
+ ], [[MODEL, 'Chromecast'], [VENDOR, 'Google']], [
640
+
641
+ /android.+;\s(glass)\s\d/i // Google Glass
642
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [
643
+
644
+ /android.+;\s(pixel c)\s/i // Google Pixel C
645
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [
646
+
647
+ /android.+;\s(pixel xl|pixel)\s/i // Google Pixel
648
+ ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [
649
+
650
+ /android.+(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
651
+ /android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i, // Xiaomi Hongmi
652
+ /android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d\w)?)\s+build/i // Xiaomi Mi
653
+ ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [
654
+
655
+ /android.+;\s(m[1-5]\snote)\sbuild/i // Meizu Tablet
656
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, TABLET]], [
657
+
658
+ /android.+a000(1)\s+build/i // OnePlus
659
+ ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
660
+
661
+ /android.+[;\/]\s*(RCT[\d\w]+)\s+build/i // RCA Tablets
662
+ ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
663
+
664
+ /android.+[;\/]\s*(Venue[\d\s]*)\s+build/i // Dell Venue Tablets
665
+ ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
666
+
667
+ /android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i // Verizon Tablet
668
+ ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
669
+
670
+ /android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(V?.*)\s+build/i // Barnes & Noble Tablet
671
+ ], [[VENDOR, 'Barnes & Noble'], MODEL, [TYPE, TABLET]], [
672
+
673
+ /android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i // Barnes & Noble Tablet
674
+ ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
675
+
676
+ /android.+[;\/]\s*(zte)?.+(k\d{2})\s+build/i // ZTE K Series Tablet
677
+ ], [[VENDOR, 'ZTE'], MODEL, [TYPE, TABLET]], [
678
+
679
+ /android.+[;\/]\s*(gen\d{3})\s+build.*49h/i // Swiss GEN Mobile
680
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
681
+
682
+ /android.+[;\/]\s*(zur\d{3})\s+build/i // Swiss ZUR Tablet
683
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
684
+
685
+ /android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i // Zeki Tablets
686
+ ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
687
+
688
+ /(android).+[;\/]\s+([YR]\d{2}x?.*)\s+build/i,
689
+ /android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(.+)\s+build/i // Dragon Touch Tablet
690
+ ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
691
+
692
+ /android.+[;\/]\s*(NS-?.+)\s+build/i // Insignia Tablets
693
+ ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
694
+
695
+ /android.+[;\/]\s*((NX|Next)-?.+)\s+build/i // NextBook Tablets
696
+ ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
697
+
698
+ /android.+[;\/]\s*(Xtreme\_?)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i
699
+ ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones
700
+
701
+ /android.+[;\/]\s*(LVTEL\-?)?(V1[12])\s+build/i // LvTel Phones
702
+ ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
703
+
704
+ /android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i // Envizen Tablets
705
+ ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
706
+
707
+ /android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(.*\b)\s+build/i // Le Pan Tablets
708
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
709
+
710
+ /android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i // MachSpeed Tablets
711
+ ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
712
+
713
+ /android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i // Trinity Tablets
714
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
715
+
716
+ /android.+[;\/]\s*TU_(1491)\s+build/i // Rotor Tablets
717
+ ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
718
+
719
+ /android.+(KS(.+))\s+build/i // Amazon Kindle Tablets
720
+ ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [
721
+
722
+ /android.+(Gigaset)[\s\-]+(Q.+)\s+build/i // Gigaset Tablets
723
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
724
+
725
+ /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet
726
+ /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile
727
+ ], [[TYPE, util.lowerize], VENDOR, MODEL], [
728
+
729
+ /(android.+)[;\/].+build/i // Generic Android Device
730
+ ], [MODEL, [VENDOR, 'Generic']]
731
+
732
+
733
+ /*//////////////////////////
734
+ // TODO: move to string map
735
+ ////////////////////////////
736
+
737
+ /(C6603)/i // Sony Xperia Z C6603
738
+ ], [[MODEL, 'Xperia Z C6603'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
739
+ /(C6903)/i // Sony Xperia Z 1
740
+ ], [[MODEL, 'Xperia Z 1'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [
741
+
742
+ /(SM-G900[F|H])/i // Samsung Galaxy S5
743
+ ], [[MODEL, 'Galaxy S5'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
744
+ /(SM-G7102)/i // Samsung Galaxy Grand 2
745
+ ], [[MODEL, 'Galaxy Grand 2'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
746
+ /(SM-G530H)/i // Samsung Galaxy Grand Prime
747
+ ], [[MODEL, 'Galaxy Grand Prime'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
748
+ /(SM-G313HZ)/i // Samsung Galaxy V
749
+ ], [[MODEL, 'Galaxy V'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
750
+ /(SM-T805)/i // Samsung Galaxy Tab S 10.5
751
+ ], [[MODEL, 'Galaxy Tab S 10.5'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
752
+ /(SM-G800F)/i // Samsung Galaxy S5 Mini
753
+ ], [[MODEL, 'Galaxy S5 Mini'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [
754
+ /(SM-T311)/i // Samsung Galaxy Tab 3 8.0
755
+ ], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [
756
+
757
+ /(T3C)/i // Advan Vandroid T3C
758
+ ], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [
759
+ /(ADVAN T1J\+)/i // Advan Vandroid T1J+
760
+ ], [[MODEL, 'Vandroid T1J+'], [VENDOR, 'Advan'], [TYPE, TABLET]], [
761
+ /(ADVAN S4A)/i // Advan Vandroid S4A
762
+ ], [[MODEL, 'Vandroid S4A'], [VENDOR, 'Advan'], [TYPE, MOBILE]], [
763
+
764
+ /(V972M)/i // ZTE V972M
765
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
766
+
767
+ /(i-mobile)\s(IQ\s[\d\.]+)/i // i-mobile IQ
768
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
769
+ /(IQ6.3)/i // i-mobile IQ IQ 6.3
770
+ ], [[MODEL, 'IQ 6.3'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
771
+ /(i-mobile)\s(i-style\s[\d\.]+)/i // i-mobile i-STYLE
772
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
773
+ /(i-STYLE2.1)/i // i-mobile i-STYLE 2.1
774
+ ], [[MODEL, 'i-STYLE 2.1'], [VENDOR, 'i-mobile'], [TYPE, MOBILE]], [
775
+
776
+ /(mobiistar touch LAI 512)/i // mobiistar touch LAI 512
777
+ ], [[MODEL, 'Touch LAI 512'], [VENDOR, 'mobiistar'], [TYPE, MOBILE]], [
778
+
779
+ /////////////
780
+ // END TODO
781
+ ///////////*/
782
+
783
+ ],
784
+
785
+ engine : [[
786
+
787
+ /windows.+\sedge\/([\w\.]+)/i // EdgeHTML
788
+ ], [VERSION, [NAME, 'EdgeHTML']], [
789
+
790
+ /(presto)\/([\w\.]+)/i, // Presto
791
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m
792
+ /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links
793
+ /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab
794
+ ], [NAME, VERSION], [
795
+
796
+ /rv\:([\w\.]+).*(gecko)/i // Gecko
797
+ ], [VERSION, NAME]
798
+ ],
799
+
800
+ os : [[
801
+
802
+ // Windows based
803
+ /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes)
804
+ ], [NAME, VERSION], [
805
+ /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT
806
+ /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s]+\w)*/i, // Windows Phone
807
+ /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i
808
+ ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [
809
+ /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i
810
+ ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [
811
+
812
+ // Mobile/Embedded OS
813
+ /\((bb)(10);/i // BlackBerry 10
814
+ ], [[NAME, 'BlackBerry'], VERSION], [
815
+ /(blackberry)\w*\/?([\w\.]+)*/i, // Blackberry
816
+ /(tizen)[\/\s]([\w\.]+)/i, // Tizen
817
+ /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]+)*/i,
818
+ // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki
819
+ /linux;.+(sailfish);/i // Sailfish OS
820
+ ], [NAME, VERSION], [
821
+ /(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]+)*/i // Symbian
822
+ ], [[NAME, 'Symbian'], VERSION], [
823
+ /\((series40);/i // Series 40
824
+ ], [NAME], [
825
+ /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS
826
+ ], [[NAME, 'Firefox OS'], VERSION], [
827
+
828
+ // Console
829
+ /(nintendo|playstation)\s([wids34portablevu]+)/i, // Nintendo/Playstation
830
+
831
+ // GNU/Linux based
832
+ /(mint)[\/\s\(]?(\w+)*/i, // Mint
833
+ /(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux
834
+ /(joli|[kxln]?ubuntu|debian|[open]*suse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]+)*/i,
835
+ // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware
836
+ // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus
837
+ /(hurd|linux)\s?([\w\.]+)*/i, // Hurd/Linux
838
+ /(gnu)\s?([\w\.]+)*/i // GNU
839
+ ], [NAME, VERSION], [
840
+
841
+ /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS
842
+ ], [[NAME, 'Chromium OS'], VERSION],[
843
+
844
+ // Solaris
845
+ /(sunos)\s?([\w\.]+\d)*/i // Solaris
846
+ ], [[NAME, 'Solaris'], VERSION], [
847
+
848
+ // BSD based
849
+ /\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]+)*/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly
850
+ ], [NAME, VERSION],[
851
+
852
+ /(haiku)\s(\w+)/i // Haiku
853
+ ], [NAME, VERSION],[
854
+
855
+ /cfnetwork\/.+darwin/i,
856
+ /ip[honead]+(?:.*os\s([\w]+)*\slike\smac|;\sopera)/i // iOS
857
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
858
+
859
+ /(mac\sos\sx)\s?([\w\s\.]+\w)*/i,
860
+ /(macintosh|mac(?=_powerpc)\s)/i // Mac OS
861
+ ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [
862
+
863
+ // Other
864
+ /((?:open)?solaris)[\/\s-]?([\w\.]+)*/i, // Solaris
865
+ /(aix)\s((\d)(?=\.|\)|\s)[\w\.]*)*/i, // AIX
866
+ /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,
867
+ // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS
868
+ /(unix)\s?([\w\.]+)*/i // UNIX
869
+ ], [NAME, VERSION]
870
+ ]
871
+ };
872
+
873
+
874
+ /////////////////
875
+ // Constructor
876
+ ////////////////
877
+
878
+ var Browser = function (name, version) {
879
+ this[NAME] = name;
880
+ this[VERSION] = version;
881
+ };
882
+ var CPU = function (arch) {
883
+ this[ARCHITECTURE] = arch;
884
+ };
885
+ var Device = function (vendor, model, type) {
886
+ this[VENDOR] = vendor;
887
+ this[MODEL] = model;
888
+ this[TYPE] = type;
889
+ };
890
+ var Engine = Browser;
891
+ var OS = Browser;
892
+
893
+ var UAParser = function (uastring, extensions) {
894
+
895
+ if (typeof uastring === 'object') {
896
+ extensions = uastring;
897
+ uastring = undefined;
898
+ }
899
+
900
+ if (!(this instanceof UAParser)) {
901
+ return new UAParser(uastring, extensions).getResult();
902
+ }
903
+
904
+ var ua = uastring || ((window && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);
905
+ var rgxmap = extensions ? util.extend(regexes, extensions) : regexes;
906
+ var browser = new Browser();
907
+ var cpu = new CPU();
908
+ var device = new Device();
909
+ var engine = new Engine();
910
+ var os = new OS();
911
+
912
+ this.getBrowser = function () {
913
+ mapper.rgx.call(browser, ua, rgxmap.browser);
914
+ browser.major = util.major(browser.version); // deprecated
915
+ return browser;
916
+ };
917
+ this.getCPU = function () {
918
+ mapper.rgx.call(cpu, ua, rgxmap.cpu);
919
+ return cpu;
920
+ };
921
+ this.getDevice = function () {
922
+ mapper.rgx.call(device, ua, rgxmap.device);
923
+ return device;
924
+ };
925
+ this.getEngine = function () {
926
+ mapper.rgx.call(engine, ua, rgxmap.engine);
927
+ return engine;
928
+ };
929
+ this.getOS = function () {
930
+ mapper.rgx.call(os, ua, rgxmap.os);
931
+ return os;
932
+ };
933
+ this.getResult = function () {
934
+ return {
935
+ ua : this.getUA(),
936
+ browser : this.getBrowser(),
937
+ engine : this.getEngine(),
938
+ os : this.getOS(),
939
+ device : this.getDevice(),
940
+ cpu : this.getCPU()
941
+ };
942
+ };
943
+ this.getUA = function () {
944
+ return ua;
945
+ };
946
+ this.setUA = function (uastring) {
947
+ ua = uastring;
948
+ browser = new Browser();
949
+ cpu = new CPU();
950
+ device = new Device();
951
+ engine = new Engine();
952
+ os = new OS();
953
+ return this;
954
+ };
955
+ return this;
956
+ };
957
+
958
+ UAParser.VERSION = LIBVERSION;
959
+ UAParser.BROWSER = {
960
+ NAME : NAME,
961
+ MAJOR : MAJOR, // deprecated
962
+ VERSION : VERSION
963
+ };
964
+ UAParser.CPU = {
965
+ ARCHITECTURE : ARCHITECTURE
966
+ };
967
+ UAParser.DEVICE = {
968
+ MODEL : MODEL,
969
+ VENDOR : VENDOR,
970
+ TYPE : TYPE,
971
+ CONSOLE : CONSOLE,
972
+ MOBILE : MOBILE,
973
+ SMARTTV : SMARTTV,
974
+ TABLET : TABLET,
975
+ WEARABLE: WEARABLE,
976
+ EMBEDDED: EMBEDDED
977
+ };
978
+ UAParser.ENGINE = {
979
+ NAME : NAME,
980
+ VERSION : VERSION
981
+ };
982
+ UAParser.OS = {
983
+ NAME : NAME,
984
+ VERSION : VERSION
985
+ };
986
+ //UAParser.Utils = util;
987
+
988
+ ///////////
989
+ // Export
990
+ //////////
991
+
992
+
993
+ // check js environment
994
+ if (typeof(exports) !== UNDEF_TYPE) {
995
+ // nodejs env
996
+ if (typeof module !== UNDEF_TYPE && module.exports) {
997
+ exports = module.exports = UAParser;
998
+ }
999
+ exports.UAParser = UAParser;
1000
+ } else {
1001
+ // requirejs env (optional)
1002
+ if (typeof(define) === FUNC_TYPE && define.amd) {
1003
+ define(function () {
1004
+ return UAParser;
1005
+ });
1006
+ } else if (window) {
1007
+ // browser env
1008
+ window.UAParser = UAParser;
1009
+ }
1010
+ }
1011
+
1012
+ // jQuery/Zepto specific (optional)
1013
+ // Note:
1014
+ // In AMD env the global scope should be kept clean, but jQuery is an exception.
1015
+ // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
1016
+ // and we should catch that.
1017
+ var $ = window && (window.jQuery || window.Zepto);
1018
+ if (typeof $ !== UNDEF_TYPE) {
1019
+ var parser = new UAParser();
1020
+ $.ua = parser.getResult();
1021
+ $.ua.get = function () {
1022
+ return parser.getUA();
1023
+ };
1024
+ $.ua.set = function (uastring) {
1025
+ parser.setUA(uastring);
1026
+ var result = parser.getResult();
1027
+ for (var prop in result) {
1028
+ $.ua[prop] = result[prop];
1029
+ }
1030
+ };
1031
+ }
1032
+
1033
+ })(typeof window === 'object' ? window : this);