device_detector 1.0.0 → 1.1.3

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.
Files changed (89) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +58 -4
  3. data/README.md +57 -21
  4. data/lib/device_detector/bot.rb +2 -2
  5. data/lib/device_detector/browser.rb +691 -0
  6. data/lib/device_detector/client.rb +11 -2
  7. data/lib/device_detector/client_hint.rb +249 -0
  8. data/lib/device_detector/device.rb +1954 -23
  9. data/lib/device_detector/memory_cache.rb +26 -19
  10. data/lib/device_detector/metadata_extractor.rb +7 -8
  11. data/lib/device_detector/model_extractor.rb +3 -3
  12. data/lib/device_detector/name_extractor.rb +2 -2
  13. data/lib/device_detector/os.rb +289 -112
  14. data/lib/device_detector/parser.rb +49 -13
  15. data/lib/device_detector/vendor_fragment.rb +25 -0
  16. data/lib/device_detector/version.rb +3 -1
  17. data/lib/device_detector/version_extractor.rb +29 -2
  18. data/lib/device_detector.rb +192 -44
  19. data/regexes/bots.yml +3399 -91
  20. data/regexes/client/browser_engine.yml +28 -4
  21. data/regexes/client/browsers.yml +2697 -408
  22. data/regexes/client/feed_readers.yml +60 -22
  23. data/regexes/client/hints/apps.yml +150 -0
  24. data/regexes/client/hints/browsers.yml +292 -0
  25. data/regexes/client/libraries.yml +598 -4
  26. data/regexes/client/mediaplayers.yml +110 -5
  27. data/regexes/client/mobile_apps.yml +2451 -14
  28. data/regexes/client/pim.yml +128 -3
  29. data/regexes/device/cameras.yml +6 -6
  30. data/regexes/device/car_browsers.yml +39 -3
  31. data/regexes/device/consoles.yml +40 -6
  32. data/regexes/device/mobiles.yml +38844 -2907
  33. data/regexes/device/notebooks.yml +127 -0
  34. data/regexes/device/portable_media_player.yml +75 -12
  35. data/regexes/device/shell_tv.yml +145 -0
  36. data/regexes/device/televisions.yml +981 -40
  37. data/regexes/oss.yml +1560 -311
  38. data/regexes/vendorfragments.yml +6 -2
  39. metadata +31 -105
  40. data/.gitignore +0 -14
  41. data/.travis.yml +0 -18
  42. data/Gemfile +0 -8
  43. data/Rakefile +0 -79
  44. data/device_detector.gemspec +0 -26
  45. data/spec/device_detector/bot_fixtures_spec.rb +0 -30
  46. data/spec/device_detector/client_fixtures_spec.rb +0 -31
  47. data/spec/device_detector/concrete_user_agent_spec.rb +0 -136
  48. data/spec/device_detector/detector_fixtures_spec.rb +0 -60
  49. data/spec/device_detector/device_fixtures_spec.rb +0 -36
  50. data/spec/device_detector/device_spec.rb +0 -151
  51. data/spec/device_detector/memory_cache_spec.rb +0 -116
  52. data/spec/device_detector/model_extractor_spec.rb +0 -63
  53. data/spec/device_detector/os_fixtures_spec.rb +0 -26
  54. data/spec/device_detector/version_extractor_spec.rb +0 -80
  55. data/spec/device_detector_spec.rb +0 -198
  56. data/spec/fixtures/client/browser.yml +0 -1313
  57. data/spec/fixtures/client/feed_reader.yml +0 -187
  58. data/spec/fixtures/client/library.yml +0 -84
  59. data/spec/fixtures/client/mediaplayer.yml +0 -168
  60. data/spec/fixtures/client/mobile_app.yml +0 -30
  61. data/spec/fixtures/client/pim.yml +0 -96
  62. data/spec/fixtures/detector/bots.yml +0 -2418
  63. data/spec/fixtures/detector/camera.yml +0 -115
  64. data/spec/fixtures/detector/car_browser.yml +0 -20
  65. data/spec/fixtures/detector/console.yml +0 -267
  66. data/spec/fixtures/detector/desktop.yml +0 -4828
  67. data/spec/fixtures/detector/feature_phone.yml +0 -782
  68. data/spec/fixtures/detector/feed_reader.yml +0 -486
  69. data/spec/fixtures/detector/mediaplayer.yml +0 -179
  70. data/spec/fixtures/detector/mobile_apps.yml +0 -149
  71. data/spec/fixtures/detector/phablet.yml +0 -2140
  72. data/spec/fixtures/detector/portable_media_player.yml +0 -153
  73. data/spec/fixtures/detector/smart_display.yml +0 -58
  74. data/spec/fixtures/detector/smartphone-1.yml +0 -9469
  75. data/spec/fixtures/detector/smartphone-2.yml +0 -9414
  76. data/spec/fixtures/detector/smartphone-3.yml +0 -9396
  77. data/spec/fixtures/detector/smartphone-4.yml +0 -5742
  78. data/spec/fixtures/detector/smartphone.yml +0 -9411
  79. data/spec/fixtures/detector/tablet-1.yml +0 -9495
  80. data/spec/fixtures/detector/tablet-2.yml +0 -248
  81. data/spec/fixtures/detector/tablet.yml +0 -9484
  82. data/spec/fixtures/detector/tv.yml +0 -2582
  83. data/spec/fixtures/detector/unknown.yml +0 -3196
  84. data/spec/fixtures/device/camera.yml +0 -18
  85. data/spec/fixtures/device/car_browser.yml +0 -6
  86. data/spec/fixtures/device/console.yml +0 -78
  87. data/spec/fixtures/parser/oss.yml +0 -800
  88. data/spec/fixtures/parser/vendorfragments.yml +0 -162
  89. data/spec/spec_helper.rb +0 -9
data/regexes/oss.yml CHANGED
@@ -1,26 +1,442 @@
1
1
  ###############
2
2
  # Device Detector - The Universal Device Detection library for parsing User Agents
3
3
  #
4
- # @link http://piwik.org
4
+ # @link https://matomo.org
5
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
6
  ###############
7
7
 
8
8
  ##########
9
- # Tizen
9
+ # WoPhone
10
10
  ##########
11
- - regex: 'Tizen[ /]?(\d+[\.\d]+)?'
12
- name: 'Tizen'
11
+ - regex: 'WoPhone(?:/(\d+[\.\d]+))?'
12
+ name: 'WoPhone'
13
13
  version: '$1'
14
14
 
15
+ ##########
16
+ # KIN OS (https://en.wikipedia.org/wiki/Microsoft_Kin)
17
+ ##########
18
+ - regex: 'KIN\.(?:One|Two) (\d+[\.\d]+)'
19
+ name: 'KIN OS'
20
+ version: '$1'
15
21
 
22
+ ##########
23
+ # Star-Blade OS
24
+ ##########
25
+ - regex: 'Star-Blade OS'
26
+ name: 'Star-Blade OS'
27
+ version: ''
16
28
 
17
29
  ##########
18
- ## Sailfish OS
19
- ###########
20
- - regex: 'Sailfish|Jolla'
21
- name: 'Sailfish OS'
30
+ # Qtopia (https://en.wikipedia.org/wiki/Qt_Extended)
31
+ ##########
32
+ - regex: 'Qtopia/(\d+[\.\d]+)'
33
+ name: 'Qtopia'
34
+ version: '$1'
35
+
36
+ ##########
37
+ # OpenVMS (https://vmssoftware.com/)
38
+ ##########
39
+ - regex: 'OpenVMS V(\d+[\.\d]+)'
40
+ name: 'OpenVMS'
41
+ version: '$1'
42
+
43
+ ##########
44
+ # AROS (https://aros.sourceforge.io/)
45
+ ##########
46
+ - regex: 'AROS'
47
+ name: 'AROS'
22
48
  version: ''
23
49
 
50
+ ##########
51
+ # NeXTSTEP
52
+ ##########
53
+ - regex: '\(NEXT\)'
54
+ name: 'NeXTSTEP'
55
+ version: ''
56
+
57
+ ##########
58
+ # NEWS-OS (https://en.wikipedia.org/wiki/Sony_NEWS)
59
+ ##########
60
+ - regex: 'NEWS-OS (\d+[\.\d]+)'
61
+ name: 'NEWS-OS'
62
+ version: '$1'
63
+
64
+ ##########
65
+ # ULTRIX (https://en.wikipedia.org/wiki/Ultrix)
66
+ ##########
67
+ - regex: 'ULTRIX (\d+[\.\d]+)'
68
+ name: 'ULTRIX'
69
+ version: '$1'
70
+
71
+ ##########
72
+ # Turbolinux (http://www.turbolinux.com/)
73
+ ##########
74
+ - regex: 'Turbolinux/(\d+[\.\d]+)'
75
+ name: 'Turbolinux'
76
+ version: '$1'
77
+
78
+ ##########
79
+ # Joli OS (https://www.jolicloud.com/products/)
80
+ ##########
81
+ - regex: 'Joli OS/(\d+[\.\d]+)'
82
+ name: 'Joli OS'
83
+ version: '$1'
84
+
85
+ ##########
86
+ # GENIX
87
+ ##########
88
+ - regex: 'GENIX (\d+[\.\d]+)'
89
+ name: 'GENIX'
90
+ version: '$1'
91
+
92
+ ##########
93
+ # gNewSense (http://www.gnewsense.org)
94
+ ##########
95
+ - regex: 'gNewSense/.*\((\d+[\.\d]+)'
96
+ name: 'gNewSense'
97
+ version: '$1'
98
+
99
+ ##########
100
+ # GEOS
101
+ ##########
102
+ - regex: 'Geos (\d+[\.\d]+)'
103
+ name: 'GEOS'
104
+ version: '$1'
105
+
106
+ ##########
107
+ # Motorola EZX
108
+ ##########
109
+ - regex: 'MOT-.*LinuxOS/'
110
+ name: 'Motorola EZX'
111
+ version: ''
112
+
113
+ ##########
114
+ # Baidu Yi (https://en.wikipedia.org/wiki/Baidu_Yi)
115
+ ##########
116
+ - regex: 'Baidu Yi'
117
+ name: 'Baidu Yi'
118
+ version: ''
119
+
120
+ ##########
121
+ # Red Star (https://en.wikipedia.org/wiki/Red_Star_OS)
122
+ ##########
123
+ - regex: '붉은별|Fedora/(?:\d+\.[\d.-]+)\.rs(\d+(?:[_.]\d+)*)'
124
+ name: 'Red Star'
125
+ version: '$1'
126
+
127
+ ##########
128
+ # Proxmox VE (https://pve.proxmox.com/wiki/Main_Page)
129
+ ##########
130
+ - regex: 'Linux/(?:\d+\.[\d.-]+)-(?:pve|v(\d)\+)'
131
+ name: 'Proxmox VE'
132
+ version: '$1'
133
+
134
+ ##########
135
+ # OpenVZ (https://openvz.org/)
136
+ ##########
137
+ - regex: 'Linux/(?:\d+\.[\d.-]+)-(?:\d+[\.\d]+)stab(?:\d+[\.\d]+)'
138
+ name: 'OpenVZ'
139
+ version: ''
140
+
141
+ # Rocky Linux (https://rockylinux.org/)
142
+ ##########
143
+ - regex: 'rocky/(\d+[\.\d]+)'
144
+ name: 'Rocky Linux'
145
+ version: '$1'
146
+
147
+ ##########
148
+ # Clear Linux OS (https://www.clearlinux.org/)
149
+ ##########
150
+ - regex: 'clear-linux-os/(\d+[\.\d]+)'
151
+ name: 'Clear Linux OS'
152
+ version: '$1'
153
+
154
+ ##########
155
+ # Alpine Linux (https://www.alpinelinux.org/)
156
+ ##########
157
+ - regex: 'alpine/(\d+[\.\d]+)'
158
+ name: 'Alpine Linux'
159
+ version: '$1'
160
+
161
+ ##########
162
+ # Scientific Linux (https://scientificlinux.org/)
163
+ ##########
164
+ - regex: 'scientific/(\d+[\.\d]+)'
165
+ name: 'Scientific Linux'
166
+ version: '$1'
167
+
168
+ ##########
169
+ # EulerOS (https://developer.huaweicloud.com/intl/en-us/euleros/index.html)
170
+ ##########
171
+ - regex: 'eulerosv(\d)r(\d+)'
172
+ name: 'EulerOS'
173
+ version: '$1.$2'
174
+
175
+ ##########
176
+ # Loongnix (https://www.loongson.cn/EN/system/loongnix)
177
+ ##########
178
+ - regex: 'loongnix-server/(\d+[\.\d]+)'
179
+ name: 'Loongnix'
180
+ version: '$1'
181
+
182
+ - regex: 'Linux/(?:\d+\.[\d.-]+)\.lns(\d+(?:[_.]\d+)*)\.loongarch64'
183
+ name: 'Loongnix'
184
+ version: '$1'
185
+
186
+ ##########
187
+ # AOSC OS (https://aosc.io/)
188
+ ##########
189
+ - regex: 'AOSC OS'
190
+ name: 'AOSC OS'
191
+ version: ''
192
+
193
+ ##########
194
+ # SerenityOS (https://github.com/SerenityOS/serenity)
195
+ ##########
196
+ - regex: 'SerenityOS|Ladybird/'
197
+ name: 'SerenityOS'
198
+ version: ''
199
+
200
+ ##########
201
+ # HELIX OS (https://www.pegasusintelligence.com/communication-security/)
202
+ ##########
203
+ - regex: 'Helix Phone'
204
+ name: 'HELIX OS'
205
+ version: ''
206
+
207
+ ##########
208
+ # Armadillo OS (https://github.com/pacificresearchalliance/kernel_google_crosshatch)
209
+ ##########
210
+ - regex: 'Armadillo'
211
+ name: 'Armadillo OS'
212
+ version: ''
213
+
214
+ # Webian (https://www.webian.org/)
215
+ ##########
216
+ - regex: 'Webian'
217
+ name: 'Webian'
218
+ version: ''
219
+
220
+ ##########
221
+ # Liri OS (https://liri.io/ | https://github.com/lirios)
222
+ ##########
223
+ - regex: 'Linux.*Liri/'
224
+ name: 'Liri OS'
225
+ version: ''
226
+
227
+ ##########
228
+ # FRITZ!OS (https://en.avm.de/products/fritzos/)
229
+ ##########
230
+ - regex: 'FRITZ!OS(?:/0(\d+[\.\d]+))?'
231
+ name: 'FRITZ!OS'
232
+ version: '$1'
233
+
234
+ ##########
235
+ # UOS (https://www.chinauos.com/)
236
+ ##########
237
+ - regex: 'UOS$'
238
+ name: 'UOS'
239
+ version: ''
240
+
241
+ ##########
242
+ # Raspbian (https://www.raspbian.org/)
243
+ ##########
244
+ - regex: 'Raspbian/(\d+[\.\d]+)'
245
+ name: 'Raspbian'
246
+ version: '$1'
247
+
248
+ ##########
249
+ # Raspberry Pi OS (https://www.raspberrypi.com/software/)
250
+ ##########
251
+ - regex: 'Raspbian'
252
+ name: 'Raspberry Pi OS'
253
+ version: ''
254
+
255
+ ##########
256
+ # BrightSignOS (https://www.brightsign.biz/ecosystem/brightsign-os/)
257
+ ##########
258
+ - regex: 'BrightSign/(?:[A-Z0-9]+)/(\d+[\.\d]+)'
259
+ name: 'BrightSignOS'
260
+ version: '$1'
261
+ - regex: 'BrightSign/(\d+[\.\d]+)'
262
+ name: 'BrightSignOS'
263
+ version: '$1'
264
+
265
+ ##########
266
+ # LuneOS (https://www.webos-ports.org/)
267
+ ##########
268
+ - regex: 'LuneOS'
269
+ name: 'LuneOS'
270
+ version: ''
271
+
272
+ ##########
273
+ # Oracle Linux (https://www.oracle.com/linux/)
274
+ ##########
275
+ - regex: 'Linux/(?:\d+\.[\d.-]+)\.el(\d+(?:[_.]\d+)*)uek'
276
+ name: 'Oracle Linux'
277
+ version: '$1'
278
+
279
+ ##########
280
+ # Kali (https://www.kali.org/)
281
+ ##########
282
+ - regex: '.+kali(\d)'
283
+ name: 'Kali'
284
+ version: '$1'
285
+
286
+ # TiVo OS (https://business.tivo.com/products-solutions/tivo-os)
287
+ ##########
288
+ - regex: 'TiVoOS/(\d+[\.\d]+)'
289
+ name: 'TiVo OS'
290
+ version: '$1'
291
+
292
+ ##########
293
+ # VIDAA (https://www.vidaa.com/vidaa-os/)
294
+ ##########
295
+ - regex: 'VIDAA/(\d+[\.\d]+)'
296
+ name: 'VIDAA'
297
+ version: '$1'
298
+
299
+ ##########
300
+ # PICO OS (https://www.picoxr.com/global/software/pico-os)
301
+ ##########
302
+ - regex: 'PICO.+OS(\d+[\.\d]*)'
303
+ name: 'PICO OS'
304
+ version: '$1'
305
+
306
+ ##########
307
+ # RedOS (https://redos.red-soft.ru/)
308
+ ##########
309
+ - regex: 'RED OS; Linux'
310
+ name: 'RedOS'
311
+ version: ''
312
+
313
+ ##########
314
+ # RouterOS (https://help.mikrotik.com/docs/display/ROS/RouterOS)
315
+ ##########
316
+ - regex: 'Mikrotik/(\d)\.x'
317
+ name: 'RouterOS'
318
+ version: '$1'
319
+
320
+ ##########
321
+ # Sirin OS (https://sirinlabs.com/sirin-os/)
322
+ ##########
323
+ - regex: 'FINNEY U1'
324
+ name: 'Sirin OS'
325
+ version: ''
326
+
327
+ ##########
328
+ # Nova (https://www.nova.cu/)
329
+ ##########
330
+ - regex: 'Nova; Linux'
331
+ name: 'Nova'
332
+ version: ''
333
+
334
+ ##########
335
+ # Bliss OS (https://blissos.org/)
336
+ ##########
337
+ - regex: 'Android 10.+bliss_maple'
338
+ name: 'Bliss OS'
339
+ version: '12'
340
+
341
+ ##########
342
+ # TencentOS (https://github.com/Tencent/TencentOS-kernel)
343
+ ##########
344
+ - regex: '.+tlinux(\d)'
345
+ name: 'TencentOS'
346
+ version: '$1'
347
+
348
+ ##########
349
+ # Amazon Linux (https://docs.aws.amazon.com/AL2/latest/relnotes/relnotes-al2.html)
350
+ ##########
351
+ - regex: '.+.amzn(\d)(?:int)?.x86_64'
352
+ name: 'Amazon Linux'
353
+ version: '$1'
354
+
355
+ ##########
356
+ # COS (China Operating System - https://web.archive.org/web/20170825001023/http://www.china-cos.com/)
357
+ ##########
358
+ - regex: ' COS like Android'
359
+ name: 'China OS'
360
+ version: ''
361
+
362
+ ##########
363
+ # ClearOS Mobile (https://www.clearos.com/products/clearos-editions/clearos-mobile)
364
+ ##########
365
+ - regex: 'Android (\d+[\.\d]*); ClearPHONE'
366
+ name: 'ClearOS Mobile'
367
+ version: '$1'
368
+
369
+ ##########
370
+ # Plasma Mobile (https://plasma-mobile.org/)
371
+ ##########
372
+ - regex: 'Plasma Mobile'
373
+ name: 'Plasma Mobile'
374
+ version: ''
375
+
376
+ ##########
377
+ # KreaTV
378
+ ##########
379
+ - regex: 'KreaTV/0\.0\.0\.0'
380
+ name: 'KreaTV'
381
+ version: ''
382
+
383
+ - regex: 'KreaTV/(\d+[\.\d]+)'
384
+ name: 'KreaTV'
385
+ version: '$1'
386
+
387
+ ##########
388
+ # Opera TV (https://blogs.opera.com/news/2016/01/ces-2016-meet-opera-tv/)
389
+ ##########
390
+ - regex: 'Linux (?:[^;]+); Opera TV(?: Store)?/|^Opera/\d+\.\d+ \(Linux mips'
391
+ name: 'Opera TV'
392
+ version: ''
393
+ - regex: 'OPR/.+TV Store/(\d+[\.\d]+)'
394
+ name: 'Opera TV'
395
+ version: '$1'
396
+
397
+ ##########
398
+ # GridOS (https://web.archive.org/web/20111123141630/http://fusiongarage.com/grid-os/about)
399
+ ##########
400
+ - regex: 'Grid OS (\d+[\.\d]+)'
401
+ name: 'GridOS'
402
+ version: '$1'
403
+
404
+ ##########
405
+ # Caixa Mágica (https://caixamagica.pt/)
406
+ ##########
407
+ - regex: 'CaixaMagica'
408
+ name: 'Caixa Mágica'
409
+ version: ''
410
+
411
+ ##########
412
+ # Mageia (https://www.mageia.org/en/)
413
+ ##########
414
+ - regex: 'Mageia; Linux'
415
+ name: 'Mageia'
416
+ version: ''
417
+
418
+ ##########
419
+ # Whale OS (https://www.zeasn.com/)
420
+ ##########
421
+ - regex: '(?:WH|WhaleTV/)(\d+[\.\d]+)'
422
+ name: 'Whale OS'
423
+ version: '$1'
424
+
425
+ - regex: 'Zeasn/.*TBrowser/2\.0' # https://partner.zeasn.com/partnerportal/WhaleVersion1/index.jhtml
426
+ name: 'Whale OS'
427
+ version: '1'
428
+
429
+ - regex: 'Zeasn/'
430
+ name: 'Whale OS'
431
+ version: ''
432
+
433
+ ##########
434
+ # Tizen
435
+ ##########
436
+ - regex: 'Tizen[ /]?(\d+[\.\d]+)?'
437
+ name: 'Tizen'
438
+ version: '$1'
439
+
24
440
  ##########
25
441
  # YunOS (Android based)
26
442
  ##########
@@ -31,11 +447,14 @@
31
447
  ##########
32
448
  # Windows Mobile
33
449
  ##########
34
- - regex: 'Windows Phone (?:OS)?[ ]?(\d+[\.\d]+)'
450
+ - regex: 'Windows Phone;FBSV/(\d+[\.\d]+)'
35
451
  name: 'Windows Phone'
36
452
  version: '$1'
37
-
38
-
453
+
454
+ - regex: '(?:Windows Phone (?:OS)?|wds)[ /]?(\d+[\.\d]+)'
455
+ name: 'Windows Phone'
456
+ version: '$1'
457
+
39
458
  - regex: 'XBLWP7|Windows Phone'
40
459
  name: 'Windows Phone'
41
460
  version: ''
@@ -43,25 +462,43 @@
43
462
  - regex: 'Windows CE(?: (\d+[\.\d]+))?'
44
463
  name: 'Windows CE'
45
464
  version: '$1'
46
-
47
-
48
- - regex: '(?:IEMobile|Windows Mobile)(?: (\d+[\.\d]+))?'
465
+
466
+ - regex: '(?:IEMobile|Windows ?Mobile)(?: (\d+[\.\d]+))?'
49
467
  name: 'Windows Mobile'
50
468
  version: '$1'
51
-
52
-
53
- - regex: 'Windows NT 6.2; ARM;'
469
+
470
+ - regex: 'Windows NT 6\.2; ARM;'
54
471
  name: 'Windows RT'
55
472
  version: ''
56
-
57
- - regex: 'Windows NT 6.3; ARM;'
473
+
474
+ - regex: 'Windows NT 6\.3; ARM;'
58
475
  name: 'Windows RT'
59
476
  version: '8.1'
60
477
 
478
+ ##########
479
+ # Windows IoT
480
+ ##########
481
+ - regex: 'Windows IoT 10\.0'
482
+ name: 'Windows IoT'
483
+ version: '10'
484
+
485
+ ##########
486
+ # KaiOS
487
+ ##########
488
+ - regex: 'KAIOS(?:/(\d+[\.\d]+))?'
489
+ name: 'KaiOS'
490
+ version: '$1'
61
491
 
62
492
  ##########
63
493
  # Custom Android Roms
64
494
  ##########
495
+ - regex: 'HarmonyOS(?:[/ ](\d+[\.\d]+))?'
496
+ name: 'HarmonyOS'
497
+ version: '$1'
498
+ - regex: 'Hmos/1'
499
+ name: 'HarmonyOS'
500
+ version: '1.0.0'
501
+
65
502
  - regex: 'RazoDroiD(?: v(\d+[\.\d]*))?'
66
503
  name: 'RazoDroiD'
67
504
  version: '$1'
@@ -78,78 +515,546 @@
78
515
  name: 'MocorDroid'
79
516
  version: '$1'
80
517
 
518
+ - regex: 'FydeOS'
519
+ name: 'FydeOS'
520
+ version: ''
521
+
522
+ ##########
523
+ # Fire OS (https://developer.amazon.com/docs/fire-tv/fire-os-overview.html)
524
+ ##########
525
+ - regex: 'Fire OS(?:/(\d+[\.\d]*))?'
526
+ name: 'Fire OS'
527
+ version: '$1'
528
+
529
+ - regex: '(?:Andr[o0]id (\d([\d.])*);? |Amazon;|smarttv_)AFT|AEO[ACBHKT]|KF[ADFGJKMORSTQ]|.*FIRETVSTICK2018'
530
+ name: 'Fire OS'
531
+ versions:
532
+ - regex: 'Andr[o0]id 1[01].+ (?:AFT|KF[ADFGJKMORSTQ])'
533
+ version: '8'
534
+ - regex: 'Andr[o0]id 9.+ (?:AEO[AHT]|AFT|KF[ADFGJKMORSTQ])|AFTSO001'
535
+ version: '7'
536
+ - regex: 'Andr[o0]id 7|.+FIRETVSTICK2018'
537
+ version: '6'
538
+ - regex: 'Andr[o0]id 5\.1'
539
+ version: '5'
540
+ - regex: 'Andr[o0]id 4\.4\.3'
541
+ version: '4.5.1'
542
+ - regex: 'Andr[o0]id 4\.4\.2'
543
+ version: '4'
544
+ - regex: 'Andr[o0]id 4\.2\.2'
545
+ version: '3'
546
+ - regex: 'Andr[o0]id 4\.0\.[34]'
547
+ version: '3'
548
+ - regex: 'Andr[o0]id 4\.0'
549
+ version: '2'
550
+ - regex: 'Andr[o0]id 2\.3\.3'
551
+ version: '1'
552
+
553
+ - regex: 'cordova-amazon-fireos'
554
+ name: 'Fire OS'
555
+ version: ''
556
+
557
+ ##########
558
+ # Revenge OS
559
+ ##########
560
+ - regex: 'revengeos_x2'
561
+ name: 'Revenge OS'
562
+ version: '2'
563
+
564
+ ##########
565
+ # Lineage OS
566
+ ##########
567
+ - regex: 'Lineage_(\d+[\.\d]*)'
568
+ name: 'Lineage OS'
569
+ version: '$1'
570
+
571
+ - regex: '(?:Android (\d([\d.])*);? )?lineage_\w+'
572
+ name: 'Lineage OS'
573
+ versions:
574
+ - regex: 'Android 14'
575
+ version: '21'
576
+ - regex: 'Android 13'
577
+ version: '20.0'
578
+ - regex: 'Android 12\.1'
579
+ version: '19.1'
580
+ - regex: 'Android 12'
581
+ version: '19.0'
582
+ - regex: 'Android 11'
583
+ version: '18.0'
584
+ - regex: 'Android 10'
585
+ version: '17.0'
586
+ - regex: 'Android 9'
587
+ version: '16.0'
588
+ - regex: 'Android 8\.1'
589
+ version: '15.1'
590
+ - regex: 'Android 8'
591
+ version: '15.0'
592
+ - regex: 'Android 7\.1'
593
+ version: '14.1'
594
+ - regex: 'Android 7'
595
+ version: '14.0'
596
+ - regex: 'Android 6'
597
+ version: '13.0'
598
+ - regex: 'Android 5\.1'
599
+ version: '12.1'
600
+ - regex: 'Android 5'
601
+ version: '12.0'
602
+ - regex: 'Android 4\.4'
603
+ version: '11.0'
604
+ - regex: 'Android 4\.3'
605
+ version: '10.2'
606
+ - regex: 'Android 4\.2'
607
+ version: '10.1'
608
+ - regex: 'Android 4'
609
+ version: '9.1.0'
610
+
611
+ #########
612
+ # Resurrection Remix OS (https://resurrectionremix.com/)
613
+ ##########
614
+ - regex: 'Android 8(?:[\d.]*);(?: [\w-]+;)? rr_fortuna3g'
615
+ name: 'Resurrection Remix OS'
616
+ version: '6'
617
+
618
+ ##########
619
+ # Remix OS
620
+ ##########
621
+ - regex: 'RemixOS|Remix (?:Pro|Mini)'
622
+ name: 'Remix OS'
623
+ versions:
624
+ - regex: 'RemixOS 5'
625
+ version: '1'
626
+ - regex: 'RemixOS 6|Remix Mini'
627
+ version: '2'
628
+ - regex: 'Remix Pro'
629
+ version: '3'
630
+
631
+ ##########
632
+ # FreeBSD
633
+ ##########
634
+ - regex: 'FreeBSD.+Android'
635
+ name: 'FreeBSD'
636
+ version: ''
637
+
638
+ ##########
639
+ # Wear OS (https://wearos.google.com/)
640
+ ##########
641
+ - regex: 'Chrome/(\d+\.[.\d]+) Odd/|SM-R(?:8[6-9]|9)|LEM14'
642
+ name: 'Wear OS'
643
+ version: ''
644
+
645
+ ##########
646
+ # SeewoOS
647
+ ##########
648
+ - regex: 'SeewoOS x86_64 (\d+[\.\d]+)'
649
+ name: 'SeewoOS'
650
+ version: '$1'
651
+
652
+ ##########
653
+ # ChromeOS
654
+ ##########
655
+ - regex: 'CrOS [a-z0-9_]+ (\d+[\.\d]+)|Chromebook'
656
+ name: 'Chrome OS'
657
+ version: '$1'
658
+
659
+ ##########
660
+ # Android TV (https://android.com/tv/)
661
+ ##########
662
+ - regex: 'Linux; Andr0id[; ](\d+[\.\d]*)'
663
+ name: 'Android TV'
664
+ version: '$1'
665
+
666
+ - regex: 'Android[; ](\d+[\.\d]*).+(?:(?:Android(?: UHD)?|AT&T|Google|Smart)[ _]?TV|AOSP on r33a0|BRAVIA|wv-atv)'
667
+ name: 'Android TV'
668
+ version: '$1'
669
+
670
+ - regex: 'Windows.+Andr0id TV|.+(?:K_?Android_?TV_|AndroidTV|GoogleTV_)'
671
+ name: 'Android TV'
672
+ version: ''
673
+
674
+ ##########
675
+ # Android SDK Level Api
676
+ ##########
677
+ - regex: '(?:Android API \d+|\d+/tclwebkit(?:\d+[\.\d]*)|(?:(?<!\d )Android/\d{2}|(?<!; |\d{4}/)Android (?!1[0-5])\d{2})(?![^ ]))'
678
+ name: 'Android'
679
+ versions:
680
+ - regex: '(?:Android API 35|35/tclwebkit|Android[ /]35)'
681
+ version: '15'
682
+ - regex: '(?:Android API 34|34/tclwebkit|Android[ /]34)'
683
+ version: '14'
684
+ - regex: '(?:Android API 33|33/tclwebkit|Android[ /]33)'
685
+ version: '13'
686
+ - regex: '(?:Android API 32|32/tclwebkit|Android[ /]32)'
687
+ version: '12.1'
688
+ - regex: '(?:Android API 31|31/tclwebkit|Android[ /]31)'
689
+ version: '12'
690
+ - regex: '(?:Android API 30|30/tclwebkit|Android[ /]30)'
691
+ version: '11'
692
+ - regex: '(?:Android API 29|29/tclwebkit|Android[ /]29)'
693
+ version: '10'
694
+ - regex: '(?:Android API 28|28/tclwebkit|Android[ /]28)'
695
+ version: '9'
696
+ - regex: '(?:Android API 27|27/tclwebkit|Android[ /]27)'
697
+ version: '8.1'
698
+ - regex: '(?:Android API 26|26/tclwebkit|Android[ /]26)'
699
+ version: '8'
700
+ - regex: '(?:Android API 25|25/tclwebkit|Android[ /]25)'
701
+ version: '7.1'
702
+ - regex: '(?:Android API 24|24/tclwebkit|Android[ /]24)'
703
+ version: '7'
704
+ - regex: '(?:Android API 23|23/tclwebkit|Android[ /]23)'
705
+ version: '6'
706
+ - regex: '(?:Android API 22|22/tclwebkit|Android[ /]22)'
707
+ version: '5.1'
708
+ - regex: '(?:21/tclwebkit|Android[ /]21)'
709
+ version: '5'
710
+ - regex: '(?:20|19)/tclwebkit'
711
+ version: '4.4'
712
+ - regex: 'Android[ /](?:20|19)'
713
+ version: '4.4'
714
+ - regex: '(?:18/tclwebkit|Android[ /]18)'
715
+ version: '4.3'
716
+ - regex: '(?:17/tclwebkit|Android[ /]17)'
717
+ version: '4.2'
718
+ - regex: '(?:16/tclwebkit|Android[ /]16)'
719
+ version: '4.2'
720
+ - regex: '15/tclwebkit'
721
+ version: '4.0.3'
722
+ - regex: '15/tclwebkit'
723
+ version: '4.0.1'
724
+ - regex: 'Android[ /]15'
725
+ version: '4'
726
+
81
727
  ##########
82
728
  # Android
83
729
  ##########
84
- - regex: '(?:(?:Orca-)?Android|Adr)[ /](?:[a-z]+ )?(\d+[\.\d]+)'
730
+ - regex: 'Android Marshmallow'
731
+ name: 'Android'
732
+ version: '6'
733
+
734
+ - regex: '(?:Podbean|Podimo)(?:.*)/Android|Rutube(?:TV)?BlackAndroid'
735
+ name: 'Android'
736
+ version: ''
737
+
738
+ - regex: '(?:Android OS|OMDroid|sdk_gphone64_arm64-userdebug)[ /](\d+[\.\d]*)'
739
+ name: 'Android'
740
+ version: '$1'
741
+
742
+ - regex: 'Pinterest for Android(?: Tablet)?/.*; (\d(?:[\d\.]*))\)$'
743
+ name: 'Android'
744
+ version: '$1'
745
+
746
+ - regex: 'Android; (\d+[\.\d]*); Mobile;'
747
+ name: 'Android'
748
+ version: '$1'
749
+
750
+ - regex: '[ ]([\d\.]+)\) AppleWebKit.*ROBLOX Android App'
751
+ name: 'Android'
752
+ version: '$1'
753
+
754
+ - regex: '(?:(?:Orca-)?(?<!like |/|RadioPublic |Anghami |Callpod Keeper for )Android|Adr|AOSP)[ /]?(?:[a-z]+ )?(\d+[\.\d]*)'
755
+ name: 'Android'
756
+ version: '$1'
757
+
758
+ - regex: '(?:Allview_TX1_Quasar|Cosmote_My_mini_Tab) (\d+[\.\d]*)'
759
+ name: 'Android'
760
+ version: '$1'
761
+
762
+ - regex: 'Android ?(?:jelly bean|Kit Kat|S\.O\. Ginger Bread|The FireCyano|:) (\d+[\.\d]*)'
763
+ name: 'Android'
764
+ version: '$1'
765
+
766
+ - regex: '(?:Orca-Android|FB4A).*FBSV/(\d+[\.\d]*);'
767
+ name: 'Android'
768
+ version: '$1'
769
+
770
+ - regex: '(?:TwitterAndroid).*[ /](?:[a-z]+ )?(\d+[\.\d]*)'
771
+ name: 'Android'
772
+ version: '$1'
773
+
774
+ - regex: '\(Android:.*\); API (\d+[\.\d]*)'
775
+ name: 'Android'
776
+ version: '$1'
777
+
778
+ - regex: ' Adr |.*(?<!like |/ )Android|Silk-Accelerated=[a-z]{4,5}'
779
+ name: 'Android'
780
+ version: ''
781
+
782
+ - regex: 'BeyondPod|AntennaPod|Podkicker|DoggCatcher|okhttp|Podcatcher Deluxe|Sonos/.+\(ACR_|Linux x86_64; Quest|.*WhatsApp/.*A$'
783
+ name: 'Android'
784
+ version: ''
785
+
786
+ # Inverted Android
787
+ - regex: 'Linux; diordnA[; ](\d+[\.\d]*)'
85
788
  name: 'Android'
86
789
  version: '$1'
87
-
88
-
89
- - regex: 'Android|Silk-Accelerated=[a-z]{4,5}'
90
- name: 'Android'
91
- version: ''
92
-
93
-
94
- ##########
95
- # AmigaOS
96
- ##########
97
- - regex: 'AmigaOS[ ]?(\d+[\.\d]+)'
98
- name: 'AmigaOS'
790
+
791
+ - regex: '^A/(\d+[\.\d]*)/'
792
+ name: 'Android'
793
+ version: '$1'
794
+
795
+ ##########
796
+ ## Sailfish OS
797
+ ###########
798
+ - regex: 'Sailfish|Jolla'
799
+ name: 'Sailfish OS'
800
+ version: ''
801
+
802
+ ##########
803
+ # AmigaOS
804
+ ##########
805
+ - regex: 'AmigaOS[ ]?(\d+[\.\d]+)'
806
+ name: 'AmigaOS'
807
+ version: '$1'
808
+
809
+ - regex: 'AmigaOS|AmigaVoyager|Amiga-AWeb'
810
+ name: 'AmigaOS'
811
+ version: ''
812
+
813
+ ##########
814
+ # ThreadX
815
+ ##########
816
+ - regex: 'ThreadX(?:_OS)?(?:/(\d+[\.\d]*))?'
817
+ name: 'ThreadX'
818
+ version: '$1'
819
+
820
+ ##########
821
+ # MTK / Nucleus
822
+ ##########
823
+ - regex: 'Nucleus(?:(?: |/v?)(\d+[\.\d]*))?'
824
+ name: 'MTK / Nucleus'
825
+ version: '$1'
826
+ - regex: 'MTK(?:(?: |/v?)(\d+[\.\d]*))?'
827
+ name: 'MTK / Nucleus'
828
+ version: '$1'
829
+
830
+ ##########
831
+ # MRE / MAUI Runtime Environment
832
+ ##########
833
+ - regex: 'MRE/(\d+)\.(\d+).*;MAUI'
834
+ name: 'MRE'
835
+ version: '$1.$2'
836
+
837
+ ##########
838
+ # Linux
839
+ ##########
840
+ # Linspire (https://www.linspirelinux.com/)
841
+ - regex: 'Linspire'
842
+ name: 'Linspire'
843
+ version: ''
844
+
845
+ # LindowsOS (https://web.archive.org/web/20040304161245/http://www.lindows.com/)
846
+ - regex: 'LindowsOS'
847
+ name: 'LindowsOS'
848
+ version: ''
849
+
850
+ # Zenwalk (http://www.zenwalk.org/)
851
+ - regex: 'Zenwalk GNU Linux'
852
+ name: 'Zenwalk'
853
+ version: ''
854
+
855
+ # Kanotix (http://www.kanotix.com/)
856
+ - regex: 'Linux.+kanotix'
857
+ name: 'Kanotix'
858
+ version: ''
859
+
860
+ # moonOS (https://www.moonos.org/)
861
+ - regex: 'moonOS/(\d+.[\d.]+)'
862
+ name: 'moonOS'
863
+ version: '$1'
864
+
865
+ # Foresight Linux (https://www.foresightlinux.org/)
866
+ - regex: 'Foresight Linux'
867
+ name: 'Foresight Linux'
868
+ version: ''
869
+
870
+ # Pardus (https://www.pardus.org.tr/)
871
+ - regex: 'Pardus/(\d+.[\d.]+)'
872
+ name: 'Pardus'
873
+ version: '$1'
874
+
875
+ # Pure OS (https://pureos.net/)
876
+ - regex: 'Librem 5'
877
+ name: 'PureOS'
878
+ version: ''
879
+
880
+ # OpenWrt (https://openwrt.org/)
881
+ - regex: 'uclient-fetch'
882
+ name: 'OpenWrt'
883
+ version: ''
884
+
885
+ # Roku OS (https://www.roku.com/how-it-works/roku-os)
886
+ - regex: 'RokuOS/.+RokuOS (\d+.[\d.]+)'
887
+ name: 'Roku OS'
888
+ version: '$1'
889
+
890
+ - regex: 'Roku(?:OS|4640X)?/(?:DVP|Pluto)?-?(\d+[\.\d]+)?'
891
+ name: 'Roku OS'
892
+ version: '$1'
893
+
894
+ - regex: 'Roku; (?:AP|UI); (\d+[\.\d]+)'
895
+ name: 'Roku OS'
896
+ version: '$1'
897
+
898
+ - regex: 'RokuBrowser/.+\(TV-([a-z0-9]+)-(\d+.[\d.]+)\)'
899
+ name: 'Roku OS'
900
+ version: '$2'
901
+
902
+ # DVKBuntu (https://www.dvkbuntu.org/)
903
+ - regex: 'dvkbuntu'
904
+ name: 'DVKBuntu'
905
+ version: ''
906
+
907
+ # Lumin OS (https://developer.magicleap.com/en-us/learn/guides/lumin-os-release-notes-summary)
908
+ - regex: 'Helio/(\d+[\.\d]+)'
909
+ name: 'Lumin OS'
910
+ version: '$1'
911
+
912
+ # HasCodingOS (https://forum.hascoding.com/HasCodingOS)
913
+ - regex: 'HasCodingOs (\d+[\.\d]+)'
914
+ name: 'HasCodingOS'
915
+ version: '$1'
916
+
917
+ # PCLinuxOS (https://www.pclinuxos.com/)
918
+ - regex: 'PCLinuxOS/(\d+[\.\d]+)'
919
+ name: 'PCLinuxOS'
920
+ version: '$1'
921
+
922
+ - regex: '(Ordissimo|webissimo3)'
923
+ name: 'Ordissimo'
924
+ version: ''
925
+
926
+ # Fenix (https://fenixlinux.com/)
927
+ - regex: '(?:Win|Sistema )Fenix'
928
+ name: 'Fenix'
929
+ version: ''
930
+
931
+ - regex: 'TOS; Linux'
932
+ name: 'TmaxOS'
933
+ version: ''
934
+
935
+ - regex: 'Maemo'
936
+ name: 'Maemo'
937
+ version: ''
938
+
939
+ - regex: 'Arch ?Linux(?:[ /\-](\d+[\.\d]+))?'
940
+ name: 'Arch Linux'
941
+ version: '$1'
942
+
943
+ - regex: 'VectorLinux(?: package)?(?:[ /\-](\d+[\.\d]+))?'
944
+ name: 'VectorLinux'
945
+ version: '$1'
946
+
947
+ - regex: 'sles/(\d+[\.\d]+)'
948
+ name: 'SUSE'
949
+ version: '$1'
950
+
951
+ - regex: '(?:rhel|Red Hat Enterprise Linux Server)/(\d+[\.\d]+)'
952
+ name: 'Red Hat'
99
953
  version: '$1'
100
954
 
101
- - regex: 'AmigaOS|AmigaVoyager|Amiga-AWeb'
102
- name: 'AmigaOS'
955
+ - regex: '.+redhat-linux-gnu|rhel|Red Hat Enterprise Linux Server'
956
+ name: 'Red Hat'
103
957
  version: ''
104
958
 
105
- ##########
106
- # ThreadX
107
- ##########
108
- - regex: 'ThreadX(?:/(\d+[\.\d]*))?'
109
- name: 'ThreadX'
959
+ - regex: 'CentOS Stream (\d)'
960
+ name: 'CentOS Stream'
110
961
  version: '$1'
111
962
 
112
- ##########
113
- # MTK / Nucleus
114
- ##########
115
- - regex: 'Nucleus(?:(?: |/v?)(\d+[\.\d]*))?'
116
- name: 'MTK / Nucleus'
963
+ - regex: 'centos(?: Linux)?/(\d+[\.\d]+) '
964
+ name: 'CentOS'
117
965
  version: '$1'
118
- - regex: 'MTK(?:(?: |/v?)(\d+[\.\d]*))?'
119
- name: 'MTK / Nucleus'
966
+
967
+ - regex: '.+.el(\d+(?:[_\.]\d+)*).(?:centos|x86_64)'
968
+ name: 'CentOS'
120
969
  version: '$1'
121
970
 
122
- ##########
123
- # Linux
124
- ##########
125
- - regex: 'Maemo'
126
- name: 'Maemo'
971
+ - regex: 'CentOS Linux (\d)'
972
+ name: 'CentOS'
127
973
  version: '$1'
128
974
 
129
- - regex: 'Arch ?Linux(?:[ /\-](\d+[\.\d]+))?'
130
- name: 'Arch Linux'
975
+ - regex: 'Fedora/.+.fc(\d+)'
976
+ name: 'Fedora'
131
977
  version: '$1'
132
978
 
133
- - regex: 'VectorLinux(?: package)?(?:[ /\-](\d+[\.\d]+))?'
134
- name: 'VectorLinux'
979
+ - regex: 'Mandriva(?: Linux)?/.+mdv(\d+[\.\d]+)'
980
+ name: 'Mandriva'
981
+ version: '$1'
982
+
983
+ - regex: 'Linux Mint/(\d)'
984
+ name: 'Mint'
985
+ version: '$1'
986
+
987
+ - regex: 'Zorin OS (\d+)'
988
+ name: 'ZorinOS'
989
+ version: '$1'
990
+
991
+ - regex: 'Ubuntu[-/]hardy'
992
+ name: 'Ubuntu'
993
+ version: '8.04'
994
+
995
+ - regex: 'debian/stretch'
996
+ name: 'Debian'
997
+ version: '9.13'
998
+
999
+ - regex: 'Ubuntu[-/]feisty'
1000
+ name: 'Ubuntu'
1001
+ version: '7.04'
1002
+
1003
+ - regex: 'Ubuntu[-/]edgy'
1004
+ name: 'Ubuntu'
1005
+ version: '6.10'
1006
+
1007
+ - regex: 'Ubuntu[-/]dapper'
1008
+ name: 'Ubuntu'
1009
+ version: '6.06'
1010
+
1011
+ - regex: 'Ubuntu[-/]breezy'
1012
+ name: 'Ubuntu'
1013
+ version: '5.10'
1014
+
1015
+ - regex: 'Ubuntu[ /](\d+[\.\d]+)'
1016
+ name: 'Ubuntu'
135
1017
  version: '$1'
136
1018
 
137
1019
  - regex: 'Linux; .*((?:Debian|Knoppix|Mint|Ubuntu|Kubuntu|Xubuntu|Lubuntu|Fedora|Red Hat|Mandriva|Gentoo|Sabayon|Slackware|SUSE|CentOS|BackTrack))[ /](\d+[\.\d]+)'
138
1020
  name: '$1'
139
1021
  version: '$2'
140
1022
 
141
- - regex: '(Debian|Knoppix|Mint|Ubuntu|Kubuntu|Xubuntu|Lubuntu|Fedora|Red Hat|Mandriva|Gentoo|Sabayon|Slackware|SUSE|CentOS|BackTrack)(?:(?: Enterprise)? Linux)?(?:[ /\-](\d+[\.\d]+))?'
1023
+ - regex: 'Deepin[ /](\d+[\.\d]+)'
1024
+ name: 'Deepin'
1025
+ version: '$1'
1026
+
1027
+ - regex: '(Debian|Knoppix|Mint(?! Browser)|Ubuntu|Kubuntu|Xubuntu|Lubuntu|Fedora|Red Hat|Mandriva|Gentoo|Sabayon|Slackware|SUSE|CentOS|BackTrack|Freebox|ASPLinux)(?:(?: Enterprise)? Linux)?(?:[ /\-](\d+[\.\d]+))?'
142
1028
  name: '$1'
143
1029
  version: '$2'
144
1030
 
145
- # generic linux match -> end of file
1031
+ - regex: 'OS ROSA; Linux'
1032
+ name: 'Rosa'
1033
+ version: ''
146
1034
 
147
1035
  ##########
148
1036
  # webOS
149
1037
  ##########
150
- - regex: '(?:webOS|Palm webOS)(?:/(\d+[\.\d]+))?'
1038
+ - regex: '(?:Web0S; .*WEBOS|webOS|web0S|Palm webOS|hpwOS)(?:[/]?(\d+[\.\d]+))?'
151
1039
  name: 'webOS'
152
1040
  version: '$1'
1041
+ versions:
1042
+ - regex: 'WEBOS(\d+[\.\d]+)'
1043
+ version: '$1'
1044
+ - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/79'
1045
+ version: '6'
1046
+ - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/68'
1047
+ version: '5'
1048
+ - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/53'
1049
+ version: '4'
1050
+ - regex: 'Web0S; Linux/SmartTV.+Chr[o0]me/38'
1051
+ version: '3'
1052
+ - regex: 'WEBOS1'
1053
+ version: '1'
1054
+ - regex: 'Web0S; Linux/SmartTV.+Safari/538'
1055
+ version: '2'
1056
+ - regex: 'Web0S; Linux/SmartTV.+Safari/537'
1057
+ version: '1'
153
1058
 
154
1059
  - regex: '(?:PalmOS|Palm OS)(?:[/ ](\d+[\.\d]+))?|Palm'
155
1060
  name: 'palmOS'
@@ -159,301 +1064,684 @@
159
1064
  name: 'palmOS'
160
1065
  version: '$1'
161
1066
 
162
-
163
1067
  - regex: 'MorphOS(?:[ /](\d+[\.\d]+))?'
164
1068
  name: 'MorphOS'
165
1069
  version: '$1'
166
1070
 
167
-
168
1071
  ##########
169
1072
  # Windows
170
1073
  ##########
171
- - regex: 'CYGWIN_NT-10.0|Windows NT 10.0|Windows 10'
1074
+ - regex: 'FBW.+FBSV/(\d+[\.\d]*);'
1075
+ name: 'Windows'
1076
+ version: '$1'
1077
+
1078
+ - regex: 'Windows.+OS: (\d+[\.\d]*)'
1079
+ name: 'Windows'
1080
+ version: '$1'
1081
+
1082
+ - regex: 'Windows; ?(\d+[\.\d]*);'
1083
+ name: 'Windows'
1084
+ version: '$1'
1085
+
1086
+ - regex: 'mingw32|winhttp|WhatsApp/.*W$'
1087
+ name: 'Windows'
1088
+ version: ''
1089
+
1090
+ - regex: '(?:Windows(?:-Update-Agent)?|Microsoft-(?:CryptoAPI|Delivery-Optimization|WebDAV-MiniRedir|WNS)|WINDOWS_64)/(\d+\.\d+)'
1091
+ name: 'Windows'
1092
+ version: '$1'
1093
+
1094
+ - regex: 'CYGWIN_NT-10\.0|Windows NT 10\.0|Windows[ /]10'
172
1095
  name: 'Windows'
173
1096
  version: '10'
174
1097
 
175
- - regex: 'CYGWIN_NT-6.4|Windows NT 6.4|Windows 10'
1098
+ - regex: 'CYGWIN_NT-6\.4|Windows NT 6\.4|Windows 10|win10'
176
1099
  name: 'Windows'
177
1100
  version: '10'
178
-
179
- - regex: 'CYGWIN_NT-6.3|Windows NT 6.3|Windows 8.1'
1101
+
1102
+ - regex: 'Windows/2012ServerR2'
1103
+ name: 'Windows'
1104
+ version: 'Server 2012 R2'
1105
+
1106
+ - regex: 'CYGWIN_NT-6\.3|Windows NT 6\.3|Windows[ /]8\.1'
180
1107
  name: 'Windows'
181
1108
  version: '8.1'
182
1109
 
1110
+ - regex: 'Windows/2012Server'
1111
+ name: 'Windows'
1112
+ version: 'Server 2012'
183
1113
 
184
- - regex: 'CYGWIN_NT-6.2|Windows NT 6.2|Windows 8'
1114
+ - regex: 'CYGWIN_NT-6\.2|Windows NT 6\.2|Windows 8|post2008Server'
185
1115
  name: 'Windows'
186
1116
  version: '8'
187
-
188
-
189
- - regex: 'CYGWIN_NT-6.1|Windows NT 6.1|Windows 7'
1117
+
1118
+ - regex: 'Windows/2008ServerR2'
1119
+ name: 'Windows'
1120
+ version: 'Server 2008 R2'
1121
+
1122
+ - regex: 'CYGWIN_NT-6\.1|Windows NT 6\.1|Windows[ /]7|win7|Windows \(6\.1'
190
1123
  name: 'Windows'
191
1124
  version: '7'
192
-
193
-
194
- - regex: 'CYGWIN_NT-6.0|Windows NT 6.0|Windows Vista'
1125
+
1126
+ - regex: 'CYGWIN_NT-6\.0|Windows NT 6\.0|Windows Vista'
195
1127
  name: 'Windows'
196
1128
  version: 'Vista'
197
-
198
-
199
- - regex: 'CYGWIN_NT-5.2|Windows NT 5.2|Windows Server 2003 / XP x64'
1129
+
1130
+ - regex: 'CYGWIN_NT-5\.2|Windows NT 5\.2|Windows Server 2003 / XP x64|Windows/2003Server'
200
1131
  name: 'Windows'
201
1132
  version: 'Server 2003'
202
-
203
-
204
- - regex: 'CYGWIN_NT-5.1|Windows NT 5.1|Windows XP'
1133
+
1134
+ - regex: 'CYGWIN_NT-5\.1|Windows NT 5\.1|Windows XP'
205
1135
  name: 'Windows'
206
1136
  version: 'XP'
207
-
208
-
209
- - regex: 'CYGWIN_NT-5.0|Windows NT 5.0|Windows 2000'
1137
+
1138
+ - regex: 'CYGWIN_NT-5\.0|Windows NT 5\.0|Windows 2000'
210
1139
  name: 'Windows'
211
1140
  version: '2000'
212
-
213
-
214
- - regex: 'CYGWIN_NT-4.0|Windows NT 4.0|WinNT|Windows NT'
1141
+
1142
+ - regex: 'CYGWIN_NT-4\.0|Windows NT 4\.0|WinNT|Windows NT'
215
1143
  name: 'Windows'
216
1144
  version: 'NT'
217
-
218
-
219
- - regex: 'CYGWIN_ME-4.90|Win 9x 4.90|Windows ME'
1145
+
1146
+ - regex: 'CYGWIN_ME-4\.90|Win 9x 4\.90|Windows ME'
220
1147
  name: 'Windows'
221
1148
  version: 'ME'
222
-
223
-
224
- - regex: 'CYGWIN_98-4.10|Win98|Windows 98'
1149
+
1150
+ - regex: 'CYGWIN_98-4\.10|Win98|Windows 98'
225
1151
  name: 'Windows'
226
1152
  version: '98'
227
-
228
-
229
- - regex: 'CYGWIN_95-4.0|Win32|Win95|Windows 95|Windows_95'
1153
+
1154
+ - regex: 'CYGWIN_95-4\.0|Win32|Win95|Windows 95|Windows_95'
230
1155
  name: 'Windows'
231
1156
  version: '95'
232
-
233
-
234
- - regex: 'Windows 3.1'
1157
+
1158
+ - regex: 'Windows 3\.1'
235
1159
  name: 'Windows'
236
1160
  version: '3.1'
237
-
238
-
239
- - regex: 'Windows'
1161
+
1162
+ - regex: 'Windows|.+win32|Win64|MSDW|HandBrake Win Upd|Microsoft BITS|ms-office; MSOffice'
240
1163
  name: 'Windows'
241
1164
  version: ''
242
-
243
-
244
-
1165
+
1166
+ - regex: 'OS/Microsoft_Windows_NT_(\d+\.\d+)'
1167
+ name: 'Windows'
1168
+ version: '$1'
1169
+
245
1170
  ##########
246
- # iOS
1171
+ # Haiku OS
247
1172
  ##########
248
- - regex: 'CFNetwork/758\.4\.3'
249
- name: 'iOS'
250
- version: '9.3.2'
1173
+ - regex: 'Haiku'
1174
+ name: 'Haiku OS'
1175
+ version: ''
251
1176
 
252
- - regex: 'CFNetwork/758\.3\.15'
253
- name: 'iOS'
254
- version: '9.3'
1177
+ ##########
1178
+ # tvOS (https://developer.apple.com/tvos/)
1179
+ ##########
1180
+ - regex: 'Apple ?TV.*CPU (?:iPhone )?OS ((?:9|1[0-8])[_\.]\d+(?:[_.]\d+)*)'
1181
+ name: 'tvOS'
1182
+ version: '$1'
255
1183
 
256
- - regex: 'CFNetwork/758\.2\.[78]'
257
- name: 'iOS'
258
- version: '9.2'
1184
+ - regex: 'Apple TV; iOS ((?:9|1[0-8])[_\.]\d+(?:[_.]\d+)*)'
1185
+ name: 'tvOS'
1186
+ version: '$1'
259
1187
 
260
- - regex: 'CFNetwork/758\.1\.6'
1188
+ - regex: 'iOS(?:; |/)((?:9|1[0-8])\.\d+(?:[_\.]\d+)*) (?:model/)?AppleTV'
1189
+ name: 'tvOS'
1190
+ version: '$1'
1191
+
1192
+ - regex: 'tvOS[ /]?((?:9|1[0-8])\.\d+(?:[_\.]\d+)*);?'
1193
+ name: 'tvOS'
1194
+ version: '$1'
1195
+
1196
+ - regex: 'AppleTV(?:/?(\d+[\.\d]+))?'
1197
+ name: 'tvOS'
1198
+ version: '$1'
1199
+
1200
+ ##########
1201
+ # watchOS (https://developer.apple.com/watchos/)
1202
+ ##########
1203
+ - regex: '(?:Watch1,[12]/|Watch OS,|watchOS[ /])(\d+[\.\d]*)'
1204
+ name: 'watchOS'
1205
+ version: '$1'
1206
+ - regex: 'Apple Watch(?!;)'
1207
+ name: 'watchOS'
1208
+ version: ''
1209
+
1210
+ ##########
1211
+ # iPadOS (https://www.apple.com/ipados/)
1212
+ ##########
1213
+ - regex: 'FBMD/iPad;.*FBSV/ ?(1[3-8]).(\d+[\.\d]*);'
1214
+ name: 'iPadOS'
1215
+ version: '$1.$2'
1216
+
1217
+ - regex: 'iPad(?:OS)?[ /](1[3-8])\.(\d+[\.\d]*)'
1218
+ name: 'iPadOS'
1219
+ version: '$1.$2'
1220
+
1221
+ - regex: '^iPad(?:\d+[\,\d]*)/(1[3-8])\.(\d+[\.\d]*)'
1222
+ name: 'iPadOS'
1223
+ version: '$1.$2'
1224
+
1225
+ - regex: 'iPad(?:; (?:iOS|iPadOS|iPhone OS)|.+CPU (?:iPad |iPhone )?OS) ((1[3-8])+(?:[_\.]\d+)*)'
1226
+ name: 'iPadOS'
1227
+ version: '$1'
1228
+
1229
+ - regex: 'iOS/(1[3-8])\.(\d+[\.\d]*).+Apple/iPad'
1230
+ name: 'iPadOS'
1231
+ version: '$1.$2'
1232
+
1233
+ - regex: 'iPhone OS,(1[3-8])\.(\d+[\.\d]*).+iPad'
1234
+ name: 'iPadOS'
1235
+ version: '$1.$2'
1236
+
1237
+ - regex: 'Pinterest for iOS/.*iPad.*; (\d(?:[\d\.]*))[)]$'
1238
+ name: 'iPadOS'
1239
+ version: '$1'
1240
+
1241
+ ##########
1242
+ # iOS
1243
+ ##########
1244
+ - regex: 'iPad/([89]|1[012])\.(\d+[\.\d]*)'
261
1245
  name: 'iOS'
262
- version: '9.1'
1246
+ version: '$1.$2'
263
1247
 
264
- - regex: 'CFNetwork/758\.0\.2'
1248
+ - regex: '^(?:iPad|iPhone)(?:\d+[\,\d]*)[/_](\d+[\.\d]+)'
265
1249
  name: 'iOS'
266
- version: '9.0'
1250
+ version: '$1'
267
1251
 
268
- - regex: 'CFNetwork/711\.5\.6'
1252
+ - regex: 'Pinterest for iOS/.*iPhone.*; (\d(?:[\d\.]*))[)]$'
269
1253
  name: 'iOS'
270
- version: '8.4.1'
1254
+ version: '$1'
271
1255
 
272
- - regex: 'CFNetwork/711\.4\.6'
1256
+ - regex: 'iOS (\d+[\.\d]+)\)'
273
1257
  name: 'iOS'
274
- version: '8.4'
1258
+ version: '$1'
275
1259
 
276
- - regex: 'CFNetwork/711\.3\.18'
1260
+ - regex: 'iPhone OS ([0-9]{1})([0-9]{1})([0-9]{1})'
277
1261
  name: 'iOS'
278
- version: '8.3'
1262
+ version: '$1.$2.$3'
279
1263
 
280
- - regex: 'CFNetwork/711\.2\.23'
1264
+ - regex: '(?:CPU OS|iPh(?:one)?[ _]OS|iPhone.+ OS|PodMN.+iPhone|iOS)[ _/](\d+(?:[_\.]\d+)*)'
281
1265
  name: 'iOS'
282
- version: '8.2'
1266
+ version: '$1'
283
1267
 
284
- - regex: 'CFNetwork/711\.1\.1[26]'
1268
+ - regex: '(?:iPhone ?OS|iOS(?: Version)?)(?:/|; |,)(\d+[\.\d]+)'
285
1269
  name: 'iOS'
286
- version: '8.1'
1270
+ version: '$1'
287
1271
 
288
- - regex: 'CFNetwork/711\.0\.6'
1272
+ - regex: '^(?!com\.apple\.Safari\.SearchHelper|Safari).*(?:CFNetwork|Mana)/.+ Darwin/(\d+[\.\d]+)(?!.*(?:x86_64|i386|PowerMac|Power%20Macintosh))'
289
1273
  name: 'iOS'
290
- version: '8.0'
1274
+ versions:
1275
+ - regex: 'Darwin/24\.0\.0'
1276
+ version: '18.0'
1277
+ - regex: 'Darwin/23\.5\.0'
1278
+ version: '17.5'
1279
+ - regex: 'Darwin/23\.4\.0'
1280
+ version: '17.4'
1281
+ - regex: 'Darwin/23\.3\.0'
1282
+ version: '17.3'
1283
+ - regex: 'Darwin/23\.2\.0'
1284
+ version: '17.2'
1285
+ - regex: 'Darwin/23\.1\.0'
1286
+ version: '17.1'
1287
+ - regex: 'Darwin/23\.0\.0'
1288
+ version: '17.0'
1289
+ - regex: 'Darwin/22\.6\.0'
1290
+ version: '16.6'
1291
+ - regex: 'Darwin/22\.5\.0'
1292
+ version: '16.5'
1293
+ - regex: 'Darwin/22\.4\.0'
1294
+ version: '16.4'
1295
+ - regex: 'Darwin/22\.3\.0'
1296
+ version: '16.3'
1297
+ - regex: 'Darwin/22\.2\.0'
1298
+ version: '16.2'
1299
+ - regex: 'Darwin/22\.1\.0'
1300
+ version: '16.1'
1301
+ - regex: 'Darwin/22\.0\.0'
1302
+ version: '16.0'
1303
+ - regex: 'Darwin/21\.6\.0'
1304
+ version: '15.6'
1305
+ - regex: 'Darwin/21\.5\.0'
1306
+ version: '15.5'
1307
+ - regex: 'Darwin/21\.4\.0'
1308
+ version: '15.4'
1309
+ - regex: 'Darwin/21\.3\.0'
1310
+ version: '15.3'
1311
+ - regex: 'Darwin/21\.2\.0'
1312
+ version: '15.2'
1313
+ - regex: 'Darwin/21\.1\.0'
1314
+ version: '15.1'
1315
+ - regex: 'Darwin/21\.0\.0'
1316
+ version: '15.0'
1317
+ - regex: 'Darwin/20\.6\.0'
1318
+ version: '14.7'
1319
+ - regex: 'Darwin/20\.5\.0'
1320
+ version: '14.6'
1321
+ - regex: 'Darwin/20\.4\.0'
1322
+ version: '14.5'
1323
+ - regex: 'Darwin/20\.3\.0'
1324
+ version: '14.4'
1325
+ - regex: 'Darwin/20\.2\.0'
1326
+ version: '14.3'
1327
+ - regex: 'Darwin/20\.1\.0'
1328
+ version: '14.2'
1329
+ - regex: 'Darwin/20\.0\.0'
1330
+ version: '14.0'
1331
+ - regex: 'Darwin/19\.6\.0'
1332
+ version: '13.6'
1333
+ - regex: 'Darwin/19\.5\.0'
1334
+ version: '13.5'
1335
+ - regex: 'Darwin/19\.4\.0'
1336
+ version: '13.4'
1337
+ - regex: 'Darwin/19\.3\.0'
1338
+ version: '13.3.1'
1339
+ - regex: 'Darwin/19\.2\.0'
1340
+ version: '13.3'
1341
+ - regex: 'Darwin/19\.0\.0'
1342
+ version: '13.0'
1343
+ - regex: 'Darwin/18\.7\.0'
1344
+ version: '12.4'
1345
+ - regex: 'Darwin/18\.6\.0'
1346
+ version: '12.3'
1347
+ - regex: 'Darwin/18\.5\.0'
1348
+ version: '12.2'
1349
+ - regex: 'Darwin/18\.2\.0'
1350
+ version: '12.1'
1351
+ - regex: 'Darwin/18\.0\.0'
1352
+ version: '12.0'
1353
+ - regex: 'Darwin/17\.7\.0'
1354
+ version: '11.4.1'
1355
+ - regex: 'Darwin/17\.6\.0'
1356
+ version: '11.4'
1357
+ - regex: 'Darwin/17\.5\.0'
1358
+ version: '11.3'
1359
+ - regex: 'Darwin/17\.4\.0'
1360
+ version: '11.2.6'
1361
+ - regex: 'Darwin/17\.3\.0'
1362
+ version: '11.2'
1363
+ - regex: 'CFNetwork/889'
1364
+ version: '11.1'
1365
+ - regex: 'CFNetwork/887'
1366
+ version: '11.0'
1367
+ - regex: 'CFNetwork/811'
1368
+ version: '10.3'
1369
+ - regex: 'CFNetwork/808\.3'
1370
+ version: '10.3'
1371
+ - regex: 'CFNetwork/808\.2'
1372
+ version: '10.2'
1373
+ - regex: 'CFNetwork/808\.1'
1374
+ version: '10.1'
1375
+ - regex: 'CFNetwork/808\.0'
1376
+ version: '10.0'
1377
+ - regex: 'CFNetwork/808'
1378
+ version: '10'
1379
+ - regex: 'CFNetwork/758\.5\.3'
1380
+ version: '9.3.5'
1381
+ - regex: 'CFNetwork/758\.4\.3'
1382
+ version: '9.3.2'
1383
+ - regex: 'CFNetwork/758\.3\.15'
1384
+ version: '9.3'
1385
+ - regex: 'CFNetwork/758\.2\.[78]'
1386
+ version: '9.2'
1387
+ - regex: 'CFNetwork/758\.1\.6'
1388
+ version: '9.1'
1389
+ - regex: 'CFNetwork/758\.0\.2'
1390
+ version: '9.0'
1391
+ - regex: 'CFNetwork/711\.5\.6'
1392
+ version: '8.4.1'
1393
+ - regex: 'CFNetwork/711\.4\.6'
1394
+ version: '8.4'
1395
+ - regex: 'CFNetwork/711\.3\.18'
1396
+ version: '8.3'
1397
+ - regex: 'CFNetwork/711\.2\.23'
1398
+ version: '8.2'
1399
+ - regex: 'CFNetwork/711\.1\.1[26]'
1400
+ version: '8.1'
1401
+ - regex: 'CFNetwork/711\.0\.6'
1402
+ version: '8.0'
1403
+ - regex: 'CFNetwork/672\.1'
1404
+ version: '7.1'
1405
+ - regex: 'CFNetwork/672\.0'
1406
+ version: '7.0'
1407
+ - regex: 'CFNetwork/609\.1'
1408
+ version: '6.1'
1409
+ - regex: 'CFNetwork/60[29]'
1410
+ version: '6.0'
1411
+ - regex: 'CFNetwork/548\.1'
1412
+ version: '5.1'
1413
+ - regex: 'CFNetwork/548\.0'
1414
+ version: '5.0'
1415
+ - regex: 'CFNetwork/485\.13'
1416
+ version: '4.3'
1417
+ - regex: 'CFNetwork/485\.12'
1418
+ version: '4.2'
1419
+ - regex: 'CFNetwork/485\.10'
1420
+ version: '4.1'
1421
+ - regex: 'CFNetwork/485\.2'
1422
+ version: '4.0'
1423
+ - regex: 'CFNetwork/467\.12'
1424
+ version: '3.2'
1425
+ - regex: 'CFNetwork/459'
1426
+ version: '3.1'
1427
+
1428
+ - regex: '(?:iPhone|iPod_touch)/(\d+[\.\d]*) hw/'
1429
+ name: 'iOS'
1430
+ version: '$1'
291
1431
 
292
- - regex: 'CFNetwork/672\.1'
1432
+ - regex: 'iOS(\d+\.\d+\.\d+)'
293
1433
  name: 'iOS'
294
- version: '7.1'
1434
+ version: '$1'
295
1435
 
296
- - regex: 'CFNetwork/672\.0'
1436
+ - regex: 'iOS(\d+)\.(\d+)0'
297
1437
  name: 'iOS'
298
- version: '7.0'
1438
+ version: '$1.$2'
299
1439
 
300
- - regex: 'CFNetwork/609\.1'
1440
+ - regex: 'FBMD/iPhone;.*FBSV/ ?(\d+[\.\d]+);'
301
1441
  name: 'iOS'
302
- version: '6.1'
1442
+ version: '$1'
303
1443
 
304
- - regex: 'CFNetwork/60[29]'
1444
+ - regex: '(?:FBIOS|Messenger(?:Lite)?ForiOS).*FBSV/ ?(\d+[\.\d]*);'
305
1445
  name: 'iOS'
306
- version: '6.0'
1446
+ version: '$1'
307
1447
 
308
- - regex: 'CFNetwork/548\.1'
1448
+ - regex: 'iPhone OS,([\d\.]+).+(?:iPhone|iPod)'
309
1449
  name: 'iOS'
310
- version: '5.1'
1450
+ version: '$1'
311
1451
 
312
- - regex: 'CFNetwork/548\.0'
1452
+ - regex: 'iPad.+; (\d+[\.\d]+);'
313
1453
  name: 'iOS'
314
- version: '5.0'
1454
+ version: '$1'
315
1455
 
316
- - regex: 'CFNetwork/485\.13'
1456
+ - regex: 'iPhone.+; Version (\d+[\.\d]+)'
317
1457
  name: 'iOS'
318
- version: '4.3'
1458
+ version: '$1'
319
1459
 
320
- - regex: 'CFNetwork/485\.12'
1460
+ - regex: 'OS=iOS;OSVer=(\d+[\.\d]+);'
321
1461
  name: 'iOS'
322
- version: '4.2'
1462
+ version: '$1'
323
1463
 
324
- - regex: 'CFNetwork/485\.10'
1464
+ - regex: 'os=Apple-iOS.+osversion=(\d+[\.\d]+)/'
325
1465
  name: 'iOS'
326
- version: '4.1'
1466
+ version: '$1'
327
1467
 
328
- - regex: 'CFNetwork/485\.2'
1468
+ - regex: '(?:Apple-)?(?<!like )(?:iPhone|iPad|iPod)(?:.*Mac OS X.*Version/(\d+\.\d+)|; Opera)?'
329
1469
  name: 'iOS'
330
- version: '4.0'
1470
+ version: '$1'
331
1471
 
332
- - regex: 'CFNetwork/467\.12'
1472
+ - regex: 'dv\(iPh.+ov\((\d+(?:[_\.]\d+)*)\);'
333
1473
  name: 'iOS'
334
- version: '3.2'
1474
+ version: '$1'
335
1475
 
336
- - regex: 'CFNetwork/459'
1476
+ - regex: '(?:Podcasts/(?:[\d\.]+)|Instacast(?:HD)?/(?:\d\.[\d\.abc]+)|Pocket Casts, iOS|\(iOS\)|iOS; Opera|Overcast|Castro|Podcat|iCatcher|RSSRadio/|MobileSafari/|WhatsApp/.*i$)(?!.*x86_64)'
337
1477
  name: 'iOS'
338
- version: '3.1'
1478
+ version: ''
339
1479
 
340
- - regex: '(?:CPU OS|iPh(?:one)?[ _]OS|iOS)[ _/](\d+(?:[_\.]\d+)*)'
1480
+ - regex: 'iTunes-(AppleTV|iPod|iPad|iPhone)/(?:[\d\.]+)'
341
1481
  name: 'iOS'
342
- version: '$1'
1482
+ version: ''
343
1483
 
344
- - regex: '(?:Apple-)?(?:iPhone|iPad|iPod)(?:.*Mac OS X.*Version/(\d+\.\d+)|; Opera)?'
1484
+ - regex: 'iOS[ /]Version ([\d\.]+)'
345
1485
  name: 'iOS'
346
1486
  version: '$1'
347
1487
 
1488
+ - regex: 'Sonos/.+\(ICRU_'
1489
+ name: 'iOS'
1490
+ version: ''
348
1491
 
1492
+ - regex: 'CaptiveNetworkSupport|AirPlay|.*[ \.\-/]iOS'
1493
+ name: 'iOS'
1494
+ version: ''
349
1495
 
350
1496
  ##########
351
1497
  # Mac
352
1498
  ##########
353
-
354
- - regex: 'CFNetwork/760'
355
- name: 'Mac'
356
- version: '10.11'
357
-
358
- - regex: 'CFNetwork/720'
359
- name: 'Mac'
360
- version: '10.10'
361
-
362
- - regex: 'CFNetwork/673'
363
- name: 'Mac'
364
- version: '10.9'
365
-
366
- - regex: 'CFNetwork/596'
367
- name: 'Mac'
368
- version: '10.8'
369
-
370
- - regex: 'CFNetwork/520'
371
- name: 'Mac'
372
- version: '10.7'
373
-
374
- - regex: 'CFNetwork/454'
1499
+ - regex: '(?:CFNetwork|Mana|StudioDisplay)/.+Darwin(?:/|; )(?:[\d\.]+).+(?:x86_64|i386|Power%20Macintosh)|(?:x86_64-apple-)?darwin(?:[\d\.]+)|C?Python.*Darwin|PowerMac|com\.apple\.Safari\.SearchHelper|^Safari'
375
1500
  name: 'Mac'
376
- version: '10.6'
377
-
378
- - regex: 'CFNetwork/(?:438|422|339|330|221|220|217)'
1501
+ versions:
1502
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?24\.0\.0'
1503
+ version: '15.0'
1504
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?23\.5\.0'
1505
+ version: '14.5'
1506
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?23\.4\.0'
1507
+ version: '14.4'
1508
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?23\.3\.0'
1509
+ version: '14.3'
1510
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?23\.2\.0'
1511
+ version: '14.2'
1512
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?23\.1\.0'
1513
+ version: '14.1'
1514
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?23\.0\.0'
1515
+ version: '14.0'
1516
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?22\.6\.0'
1517
+ version: '13.5'
1518
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?22\.5\.0'
1519
+ version: '13.4'
1520
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?22\.4\.0'
1521
+ version: '13.3'
1522
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?22\.3\.0'
1523
+ version: '13.2'
1524
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?22\.2\.0'
1525
+ version: '13.1'
1526
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?22\.1\.0'
1527
+ version: '13.0.1'
1528
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?22\.0\.0'
1529
+ version: '13.0'
1530
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?21\.6\.0'
1531
+ version: '12.5'
1532
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?21\.5\.0'
1533
+ version: '12.4'
1534
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?21\.4\.0'
1535
+ version: '12.3'
1536
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?21\.3\.0'
1537
+ version: '12.2'
1538
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?21\.2\.0'
1539
+ version: '12.1'
1540
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?21\.1\.0'
1541
+ version: '12.0.1'
1542
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?21\.0\.0'
1543
+ version: '12.0'
1544
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?20\.6\.0'
1545
+ version: '11.5'
1546
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?20\.5\.0'
1547
+ version: '11.4'
1548
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?20\.4\.0'
1549
+ version: '11.3'
1550
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?20\.3\.0'
1551
+ version: '11.2'
1552
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?20\.2\.0.*'
1553
+ version: '11.1'
1554
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?20\.[01]\.0'
1555
+ version: '11.0'
1556
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?19\.6\.0'
1557
+ version: '10.15.6'
1558
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?19\.5\.0'
1559
+ version: '10.15.5'
1560
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?19\.4\.0'
1561
+ version: '10.15.4'
1562
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?19\.3\.0'
1563
+ version: '10.15.3'
1564
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?19\.2\.0'
1565
+ version: '10.15.2'
1566
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?19\.0\.0'
1567
+ version: '10.15'
1568
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?18\.7\.0'
1569
+ version: '10.14'
1570
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?18\.6\.0'
1571
+ version: '10.14.5'
1572
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?18\.5\.0'
1573
+ version: '10.14.4'
1574
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?18\.2\.0'
1575
+ version: '10.14.1'
1576
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?18\.0\.0'
1577
+ version: '10.14'
1578
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?17\.7\.0'
1579
+ version: '10.13.6'
1580
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?17\.6\.0'
1581
+ version: '10.13.5'
1582
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?17\.5\.0'
1583
+ version: '10.13.4'
1584
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?17\.4\.0'
1585
+ version: '10.13.3'
1586
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?17\.3\.0'
1587
+ version: '10.13.2'
1588
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?17\.2\.0'
1589
+ version: '10.13.1'
1590
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?17\.0\.0'
1591
+ version: '10.13'
1592
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?16\.7\.0'
1593
+ version: '10.12.6'
1594
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?16\.6\.0'
1595
+ version: '10.12.5'
1596
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?16\.5\.0'
1597
+ version: '10.12.4'
1598
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?16\.4\.0'
1599
+ version: '10.12.3'
1600
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?16\.3\.0'
1601
+ version: '10.12.2'
1602
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?16\.2\.0'
1603
+ version: '10.12.2'
1604
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?16\.1\.0'
1605
+ version: '10.12.1'
1606
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?16\.0\.0'
1607
+ version: '10.12'
1608
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?15\.6\.0'
1609
+ version: '10.11.6'
1610
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?15\.5\.0'
1611
+ version: '10.11.5'
1612
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?15\.4\.0'
1613
+ version: '10.11.4'
1614
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?15\.3\.0'
1615
+ version: '10.11.3'
1616
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?15\.2\.0'
1617
+ version: '10.11.2'
1618
+ - regex: 'CFNetwork/760'
1619
+ version: '10.11'
1620
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?14\.5\.0'
1621
+ version: '10.10.5'
1622
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?14\.4\.0'
1623
+ version: '10.10.4'
1624
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?14\.3\.0'
1625
+ version: '10.10.3'
1626
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?14\.1\.0'
1627
+ version: '10.10.2'
1628
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?14\.0\.0'
1629
+ version: '10.10'
1630
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?13\.4\.0'
1631
+ version: '10.9.5'
1632
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?13\.3\.0'
1633
+ version: '10.9.4'
1634
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?13\.2\.0'
1635
+ version: '10.9.3'
1636
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?13\.1\.0'
1637
+ version: '10.9.2'
1638
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?13\.0\.0'
1639
+ version: '10.9.0'
1640
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?12\.6\.0'
1641
+ version: '10.8.5'
1642
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?12\.5\.0'
1643
+ version: '10.8.5'
1644
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?12\.4\.0'
1645
+ version: '10.8.4'
1646
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?12\.3\.0'
1647
+ version: '10.8.3'
1648
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?12\.2\.0'
1649
+ version: '10.8.2'
1650
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?12\.1\.0'
1651
+ version: '10.8.1'
1652
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?11\.5\.0'
1653
+ version: '10.7.5'
1654
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?11\.4\.2'
1655
+ version: '10.7.5'
1656
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?11\.4\.0'
1657
+ version: '10.7.4'
1658
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?11\.3\.0'
1659
+ version: '10.7.3'
1660
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?11\.2\.0'
1661
+ version: '10.7.2'
1662
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?11\.1\.0'
1663
+ version: '10.7.1'
1664
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?10\.8\.0'
1665
+ version: '10.6.8'
1666
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?10\.7\.[34]'
1667
+ version: '10.6.7'
1668
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?10\.3\.0'
1669
+ version: '10.6.3'
1670
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?10\.0\.0'
1671
+ version: '10.6'
1672
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?9\.8\.0'
1673
+ version: '10.5.8'
1674
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?9\.7\.1'
1675
+ version: '10.5.7'
1676
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?9\.6\.2'
1677
+ version: '10.5.6'
1678
+ - regex: '(?:x86_64-apple-)?Darwin(?:/|; )?9\.5\.[05]'
1679
+ version: '10.5.5'
1680
+
1681
+ - regex: 'Macintosh;Mac OS X \((\d+[\.\d]+)\);'
379
1682
  name: 'Mac'
380
- version: '10.5'
1683
+ version: '$1'
381
1684
 
382
- - regex: 'CFNetwork/12[89]'
1685
+ - regex: 'Mac[ +]OS[ +]?X(?:[ /,](?:Version )?(\d+(?:[_\.]\d+)+))?'
383
1686
  name: 'Mac'
384
- version: '10.4'
1687
+ version: '$1'
385
1688
 
386
- - regex: 'CFNetwork/1\.2'
1689
+ - regex: 'Mac (?:OS/)?(\d+(?:[_\.]\d+)+)'
387
1690
  name: 'Mac'
388
- version: '10.3'
1691
+ version: '$1'
389
1692
 
390
- - regex: 'CFNetwork/1\.1'
1693
+ - regex: '(?:macOS(?:\(Catalyst\))?[ /,]|Mac-)(\d+[\.\d]+)'
391
1694
  name: 'Mac'
392
- version: '10.2'
1695
+ version: '$1'
393
1696
 
394
- - regex: 'Mac OS X(?: (?:Version )?(\d+(?:[_\.]\d+)+))?'
1697
+ - regex: 'Macintosh; OS X (\d+[\.\d]+)'
395
1698
  name: 'Mac'
396
1699
  version: '$1'
397
-
398
- - regex: 'Mac (\d+(?:[_\.]\d+)+)'
1700
+
1701
+ - regex: 'OSX/(\d+[\.\d]+)'
399
1702
  name: 'Mac'
400
1703
  version: '$1'
401
1704
 
402
- - regex: 'Darwin|Macintosh|Mac_PowerPC|PPC|Mac PowerPC'
1705
+ - regex: 'Darwin|Macintosh|Mac[ _]PowerPC|PPC|iMac|MacBook|.*macOS|AppleExchangeWebServices|com\.apple\.trustd|Sonos/.+\(MDCR_|WhatsApp/.*N$'
403
1706
  name: 'Mac'
404
1707
  version: ''
405
-
406
-
407
-
1708
+
408
1709
  ##########
409
- # ChromeOS
1710
+ # Fuchsia
410
1711
  ##########
411
- - regex: 'CrOS [a-z0-9_]+ (\d+[\.\d]+)'
412
- name: 'Chrome OS'
413
- version: '$1'
414
-
415
-
416
-
1712
+ - regex: 'Fuchsia'
1713
+ name: 'Fuchsia'
1714
+ version: ''
1715
+
417
1716
  ##########
418
1717
  # BlackBerry
419
1718
  ##########
420
1719
  - regex: '(?:BB10;.+Version|Black[Bb]erry[0-9a-z]+|Black[Bb]erry.+Version)/(\d+[\.\d]+)'
421
1720
  name: 'BlackBerry OS'
422
1721
  version: '$1'
423
-
424
-
1722
+
425
1723
  - regex: 'RIM Tablet OS (\d+[\.\d]+)'
426
1724
  name: 'BlackBerry Tablet OS'
427
1725
  version: '$1'
428
-
429
-
1726
+
430
1727
  - regex: 'RIM Tablet OS|QNX|Play[Bb]ook'
431
1728
  name: 'BlackBerry Tablet OS'
432
1729
  version: ''
433
-
434
-
1730
+
435
1731
  - regex: 'BlackBerry'
436
1732
  name: 'BlackBerry OS'
437
1733
  version: ''
438
1734
 
439
-
440
- ##########
441
- # Haiku OS
442
- ##########
443
- - regex: 'Haiku'
444
- name: 'Haiku OS'
1735
+ - regex: 'bPod'
1736
+ name: 'BlackBerry OS'
445
1737
  version: ''
446
1738
 
447
-
448
1739
  ##########
449
1740
  # BeOS
450
1741
  ##########
451
- - regex: 'BeOS'
1742
+ - regex: 'BeOS[ +]?(\d[.\d]*)?'
452
1743
  name: 'BeOS'
453
- version: ''
454
-
455
-
456
-
1744
+ version: '$1'
457
1745
 
458
1746
  ##########
459
1747
  # Symbian
@@ -462,48 +1750,38 @@
462
1750
  name: 'Symbian^3'
463
1751
  version: 'Anna'
464
1752
 
465
-
466
1753
  - regex: 'Symbian/3.+NokiaBrowser/7\.4'
467
1754
  name: 'Symbian^3'
468
1755
  version: 'Belle'
469
1756
 
470
-
471
1757
  - regex: 'Symbian/3'
472
1758
  name: 'Symbian^3'
473
1759
  version: ''
474
1760
 
475
-
476
1761
  - regex: '(?:Series ?60|SymbOS|S60)(?:[ /]?(\d+[\.\d]+|V\d+))?'
477
1762
  name: 'Symbian OS Series 60'
478
1763
  version: '$1'
479
1764
 
480
-
481
1765
  - regex: 'Series40'
482
1766
  name: 'Symbian OS Series 40'
483
1767
  version: ''
484
1768
 
485
-
486
1769
  - regex: 'SymbianOS/(\d+[\.\d]+)'
487
1770
  name: 'Symbian OS'
488
1771
  version: '$1'
489
-
490
-
1772
+
491
1773
  - regex: 'MeeGo|WeTab'
492
1774
  name: 'MeeGo'
493
1775
  version: ''
494
-
495
-
1776
+
496
1777
  - regex: 'Symbian(?: OS)?|SymbOS'
497
1778
  name: 'Symbian OS'
498
1779
  version: ''
499
-
500
-
1780
+
501
1781
  - regex: 'Nokia'
502
1782
  name: 'Symbian'
503
1783
  version: ''
504
1784
 
505
-
506
-
507
1785
  ##########
508
1786
  # Firefox OS
509
1787
  ##########
@@ -511,7 +1789,6 @@
511
1789
  name: 'Firefox OS'
512
1790
  version: ''
513
1791
 
514
-
515
1792
  ##########
516
1793
  # RISC OS
517
1794
  ##########
@@ -519,7 +1796,6 @@
519
1796
  name: 'RISC OS'
520
1797
  version: '$1'
521
1798
 
522
-
523
1799
  ##########
524
1800
  # Inferno
525
1801
  ##########
@@ -527,66 +1803,37 @@
527
1803
  name: 'Inferno'
528
1804
  version: '$1'
529
1805
 
530
-
531
1806
  ##########
532
1807
  # Bada
533
1808
  ##########
534
- - regex: 'bada(?:[ /](\d+[\.\d]+))'
1809
+ - regex: 'bada(?:[ /](\d+[\.\d]+))?'
535
1810
  name: 'Bada'
536
1811
  version: '$1'
537
-
538
-
539
- - regex: 'bada'
540
- name: 'Bada'
541
- version: ''
542
1812
 
1813
+ ##########
1814
+ # REX
1815
+ ##########
1816
+ - regex: 'REX; U;'
1817
+ name: 'REX'
1818
+ version: ''
543
1819
 
544
1820
  ##########
545
1821
  # Brew
546
1822
  ##########
547
- - regex: '(?:Brew MP|BREW|BMP)(?:[ /](\d+[\.\d]+))'
1823
+ - regex: '(?:Brew(?!-Applet)(?: MP)?|BMP)(?:[ /](\d+[\.\d]+))?'
548
1824
  name: 'Brew'
549
1825
  version: '$1'
550
1826
 
551
-
552
- - regex: 'Brew MP|BREW|BMP'
553
- name: 'Brew'
554
- version: ''
555
-
556
-
557
1827
  ##########
558
1828
  # Web TV
559
1829
  ##########
560
1830
  - regex: 'GoogleTV(?:[ /](\d+[\.\d]+))?'
561
1831
  name: 'Google TV'
562
1832
  version: '$1'
563
-
564
-
565
- - regex: 'AppleTV(?:/?(\d+[\.\d]+))?'
566
- name: 'Apple TV'
567
- version: '$1'
568
-
569
-
1833
+
570
1834
  - regex: 'WebTV/(\d+[\.\d]+)'
571
1835
  name: 'WebTV'
572
1836
  version: '$1'
573
-
574
-
575
- ##########
576
- # Remix OS
577
- ##########
578
- - regex: 'RemixOS 5.1.1'
579
- name: 'Remix OS'
580
- version: '1'
581
-
582
- - regex: 'RemixOS 6.0'
583
- name: 'Remix OS'
584
- version: '2'
585
-
586
- - regex: 'RemixOS'
587
- name: 'Remix OS'
588
- version: ''
589
-
590
1837
 
591
1838
  ##########
592
1839
  # Unix
@@ -594,101 +1841,103 @@
594
1841
  - regex: '(?:SunOS|Solaris)(?:[/ ](\d+[\.\d]+))?'
595
1842
  name: 'Solaris'
596
1843
  version: '$1'
597
-
598
-
1844
+
599
1845
  - regex: 'AIX(?:[/ ]?(\d+[\.\d]+))?'
600
1846
  name: 'AIX'
601
1847
  version: '$1'
602
-
603
-
1848
+
604
1849
  - regex: 'HP-UX(?:[/ ]?(\d+[\.\d]+))?'
605
1850
  name: 'HP-UX'
606
1851
  version: '$1'
607
-
608
-
1852
+
1853
+ # ElectroBSD (https://www.fabiankeil.de/gehacktes/electrobsd/)
1854
+ - regex: 'ElectroBSD(?:[/ ]?(\d+[\.\d]+))?'
1855
+ name: 'ElectroBSD'
1856
+ version: '$1'
1857
+
609
1858
  - regex: 'FreeBSD(?:[/ ]?(\d+[\.\d]+))?'
610
1859
  name: 'FreeBSD'
611
1860
  version: '$1'
612
-
613
-
1861
+
614
1862
  - regex: 'NetBSD(?:[/ ]?(\d+[\.\d]+))?'
615
1863
  name: 'NetBSD'
616
1864
  version: '$1'
617
-
618
-
1865
+
619
1866
  - regex: 'OpenBSD(?:[/ ]?(\d+[\.\d]+))?'
620
1867
  name: 'OpenBSD'
621
1868
  version: '$1'
622
-
623
-
1869
+
624
1870
  - regex: 'DragonFly(?:[/ ]?(\d+[\.\d]+))?'
625
1871
  name: 'DragonFly'
626
1872
  version: '$1'
627
-
628
-
1873
+
629
1874
  - regex: 'Syllable(?:[/ ]?(\d+[\.\d]+))?'
630
1875
  name: 'Syllable'
631
1876
  version: '$1'
632
-
633
-
1877
+
634
1878
  - regex: 'IRIX(?:;64)?(?:[/ ]?(\d+[\.\d]+))'
635
1879
  name: 'IRIX'
636
1880
  version: '$1'
637
-
638
-
1881
+
639
1882
  - regex: 'OSF1(?:[/ ]?v?(\d+[\.\d]+))?'
640
1883
  name: 'OSF1'
641
1884
  version: '$1'
642
-
643
-
644
-
1885
+
645
1886
  ##########
646
1887
  # Gaming Console
647
1888
  ##########
648
- - regex: 'Nintendo Wii'
1889
+ - regex: 'Nintendo (Wii|Switch)'
649
1890
  name: 'Nintendo'
650
- version: 'Wii'
651
-
652
-
653
- - regex: 'PlayStation ?([3|4])'
1891
+ version: '$1'
1892
+
1893
+ - regex: 'PlayStation.+; Linux (\d+[\.\d]+)'
654
1894
  name: 'PlayStation'
655
1895
  version: '$1'
656
-
657
-
1896
+
1897
+ - regex: 'PlayStation ?(\d)(?:[/ ](?:Pro )?(\d+[\.\d]+))?'
1898
+ name: 'PlayStation'
1899
+ version: '$1.$2'
1900
+
658
1901
  - regex: 'Xbox|KIN\.(?:One|Two)'
659
1902
  name: 'Xbox'
660
1903
  version: '360'
661
-
662
-
663
-
1904
+
664
1905
  ##########
665
1906
  # Mobile Gaming Console
666
1907
  ##########
667
1908
  - regex: 'Nitro|Nintendo ([3]?DS[i]?)'
668
1909
  name: 'Nintendo Mobile'
669
1910
  version: '$1'
670
-
671
-
1911
+
672
1912
  - regex: 'PlayStation ((?:Portable|Vita))'
673
1913
  name: 'PlayStation Portable'
674
1914
  version: '$1'
675
-
676
-
677
-
1915
+
678
1916
  ##########
679
1917
  # IBM
680
1918
  ##########
1919
+ - regex: 'OS/2; Warp (\d+[\.\d]+)'
1920
+ name: 'OS/2'
1921
+ version: '$1'
1922
+
681
1923
  - regex: 'OS/2'
682
1924
  name: 'OS/2'
683
1925
  version: ''
684
-
685
-
686
1926
 
687
1927
  ###########
688
1928
  # Linux (Generic)
689
1929
  ###########
690
- - regex: 'Linux(?:OS)?[^a-z]'
1930
+ - regex: 'Linux/(\d+[\.\d]+)'
691
1931
  name: 'GNU/Linux'
692
- version: ''
1932
+ version: '$1'
693
1933
 
1934
+ - regex: 'Linux[^a-z]|Cinnamon/(?:\d+[\.\d]+)|.+(?:pc|unknown)-linux-gnu|X11'
1935
+ name: 'GNU/Linux'
1936
+ version: ''
694
1937
 
1938
+ ##########
1939
+ # Java ME (Java Platform, Micro Edition)
1940
+ ##########
1941
+ - regex: 'Java ME|(J2ME|Profile)/MIDP|MIDP-(?:\d+[\.\d]+)/CLDC|Configuration/CLDC|Java; U; MIDP|MMP/\d\.\d'
1942
+ name: 'Java ME'
1943
+ version: ''