user_agent_parser 2.5.3 → 2.9.0

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 (3) hide show
  1. checksums.yaml +4 -4
  2. data/vendor/uap-core/regexes.yaml +903 -644
  3. metadata +7 -7
@@ -1,6 +1,50 @@
1
1
  user_agent_parsers:
2
2
  #### SPECIAL CASES TOP ####
3
3
 
4
+ # ESRI Server products
5
+ - regex: '(GeoEvent Server) (\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
6
+
7
+ # ESRI ArcGIS Desktop Products
8
+ - regex: '(ArcGIS Pro)(?: (\d+)\.(\d+)\.([^ ]+)|)'
9
+
10
+ - regex: 'ArcGIS Client Using WinInet'
11
+ family_replacement: 'ArcMap'
12
+
13
+ - regex: '(OperationsDashboard)-(?:Windows)-(\d+)\.(\d+)\.(\d+)'
14
+ family_replacement: 'Operations Dashboard for ArcGIS'
15
+
16
+ - regex: '(arcgisearth)/(\d+)\.(\d+)(?:\.(\d+)|)'
17
+ family_replacement: 'ArcGIS Earth'
18
+
19
+ - regex: 'com.esri.(earth).phone/(\d+)\.(\d+)(?:\.(\d+)|)'
20
+ family_replacement: 'ArcGIS Earth'
21
+
22
+ # ESRI ArcGIS Mobile Products
23
+ - regex: '(arcgis-explorer)/(\d+)\.(\d+)\.(\d+)'
24
+ family_replacement: 'Explorer for ArcGIS'
25
+
26
+ - regex: 'arcgis-(collector|aurora)/(\d+)\.(\d+)\.(\d+)'
27
+ family_replacement: 'Collector for ArcGIS'
28
+
29
+ - regex: '(arcgis-workforce)/(\d+)\.(\d+)\.(\d+)'
30
+ family_replacement: 'Workforce for ArcGIS'
31
+
32
+ - regex: '(Collector|Explorer|Workforce)-(?:Android|iOS)-(\d+)\.(\d+)(?:\.(\d+)|)'
33
+ family_replacement: '$1 for ArcGIS'
34
+
35
+ - regex: '(Explorer|Collector)/(\d+) CFNetwork'
36
+ family_replacement: '$1 for ArcGIS'
37
+
38
+ # ESRI ArcGIS Runtimes
39
+ - regex: 'ArcGISRuntime-(Android|iOS|NET|Qt)/(\d+)\.(\d+)(?:\.(\d+)|)'
40
+ family_replacement: 'ArcGIS Runtime SDK for $1'
41
+
42
+ - regex: 'ArcGIS\.?(iOS|Android|NET|Qt)(?:-|\.)(\d+)\.(\d+)(?:\.(\d+)|)'
43
+ family_replacement: 'ArcGIS Runtime SDK for $1'
44
+
45
+ - regex: 'ArcGIS\.Runtime\.(Qt)\.(\d+)\.(\d+)(?:\.(\d+)|)'
46
+ family_replacement: 'ArcGIS Runtime SDK for $1'
47
+
4
48
  # CFNetwork Podcast catcher Applications
5
49
  - regex: '^(Luminary)[Stage]+/(\d+) CFNetwork'
6
50
  - regex: '(ESPN)[%20| ]+Radio/(\d+)\.(\d+)\.(\d+) CFNetwork'
@@ -8,9 +52,9 @@ user_agent_parsers:
8
52
  family_replacement: 'AntennaPod'
9
53
  - regex: '(TopPodcasts)Pro/(\d+) CFNetwork'
10
54
  - regex: '(MusicDownloader)Lite/(\d+)\.(\d+)\.(\d+) CFNetwork'
11
- - regex: '^(.*)-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
12
- - regex: '^(.*)-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
13
- - regex: '^(.*)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
55
+ - regex: '^(.{0,200})-iPad\/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
56
+ - regex: '^(.{0,200})-iPhone/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
57
+ - regex: '^(.{0,200})/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)(?:\.(\d+)|) CFNetwork'
14
58
 
15
59
  # Podcast catchers
16
60
  - regex: '^(Luminary)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
@@ -51,7 +95,7 @@ user_agent_parsers:
51
95
  family_replacement: 'Tableau'
52
96
 
53
97
  # Adobe CreativeCloud
54
- - regex: 'AppleWebKit/\d+\.\d+.* Safari.* (CreativeCloud)/(\d+)\.(\d+).(\d+)'
98
+ - regex: 'AppleWebKit/\d{1,10}\.\d{1,10}.{0,200} Safari.{0,200} (CreativeCloud)/(\d+)\.(\d+).(\d+)'
55
99
  family_replacement: 'Adobe CreativeCloud'
56
100
 
57
101
  # Salesforce
@@ -66,7 +110,7 @@ user_agent_parsers:
66
110
  family_replacement: 'FacebookBot'
67
111
 
68
112
  # Google Plus
69
- - regex: 'Google.*/\+/web/snippet'
113
+ - regex: 'Google.{0,50}/\+/web/snippet'
70
114
  family_replacement: 'GooglePlusBot'
71
115
 
72
116
  # Gmail
@@ -84,47 +128,60 @@ user_agent_parsers:
84
128
  # Bots Pattern 'name/0.0.0'
85
129
  - regex: '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
86
130
  # Bots Pattern 'name/0.0.0'
87
- - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
131
+ - regex: '\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|Pandora|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
88
132
 
89
133
  # MSIECrawler
90
- - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.* MSIECrawler'
134
+ - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d|[a-z]|);.{0,200} MSIECrawler'
91
135
  family_replacement: 'MSIECrawler'
92
136
 
93
137
  # DAVdroid
94
138
  - regex: '(DAVdroid)/(\d+)\.(\d+)(?:\.(\d+)|)'
95
139
 
96
140
  # Downloader ...
97
- - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
141
+ - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|PostmanRuntime|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
98
142
 
99
143
  # Pinterestbot
100
144
  - regex: '(Pinterest(?:bot|))/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)[;\s(]+\+https://www.pinterest.com/bot.html'
101
145
  family_replacement: 'Pinterestbot'
102
146
 
103
147
  # Bots
104
- - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
148
+ - regex: '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\/\$BotVersion|123metaspider-Bot|1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\b\w{0,30}favicon\w{0,30}\b|\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\(S\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PHPCrawl|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg|ArcGIS Hub Indexer)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
105
149
 
106
150
  # AWS S3 Clients
107
151
  # must come before "Bots General matcher" to catch "boto"/"boto3" before "bot"
108
152
  - regex: '\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\d{1,2}|core)))|s3fs)/(\d+)\.(\d+)(?:\.(\d+)|)'
109
153
 
154
+ # SAFE FME
155
+ - regex: '(FME)\/(\d+\.\d+)\.(\d+)\.(\d+)'
156
+
157
+ # QGIS
158
+ - regex: '(QGIS)\/(\d)\.?0?(\d{1,2})\.?0?(\d{1,2})'
159
+
160
+ # JOSM
161
+ - regex: '(JOSM)/(\d+)\.(\d+)'
162
+
163
+ # Tygron Platform
164
+ - regex: '(Tygron Platform) \((\d+)\.(\d+)\.(\d+(?:\.\d+| RC \d+\.\d+))'
165
+
110
166
  # Facebook
111
167
  # Must come before "Bots General matcher" to catch OrangeBotswana
112
168
  # Facebook Messenger must go before Facebook
113
- - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
169
+ - regex: '\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\d+)(?:\.(\d+)(?:\.(\d+)(?:\.(\d+)|)|)|)'
170
+
114
171
  family_replacement: 'Facebook Messenger'
115
172
  # Facebook
116
- - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
173
+ - regex: '\[FB.{0,300};(FBAV)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
117
174
  family_replacement: 'Facebook'
118
175
  # Sometimes Facebook does not specify a version (FBAV)
119
- - regex: '\[FB.*;'
176
+ - regex: '\[FB.{0,300};'
120
177
  family_replacement: 'Facebook'
121
178
 
122
179
  # Bots General matcher 'name/0.0'
123
- - regex: '(?:\/[A-Za-z0-9\.]+|) {0,5}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
180
+ - regex: '^.{0,200}?(?:\/[A-Za-z0-9\.]{0,50}|) {0,2}([A-Za-z0-9 \-_\!\[\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
124
181
  # Bots containing bot(but not CUBOT)
125
- - regex: '((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
182
+ - regex: '^.{0,200}?((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\b(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
126
183
  # Bots containing spider|scrape|Crawl
127
- - regex: '((?:[A-z0-9]{1,50}|[A-z\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
184
+ - regex: '^.{0,200}?((?:[A-z0-9]{1,50}|[A-z\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
128
185
 
129
186
  # HbbTV standard defines what features the browser should understand.
130
187
  # but it's like targeting "HTML5 browsers", effective browser support depends on the model
@@ -140,22 +197,29 @@ user_agent_parsers:
140
197
 
141
198
  # Social Networks (non-Facebook)
142
199
  # Pinterest
143
- - regex: '\[(Pinterest)/[^\]]+\]'
200
+ - regex: '\[(Pinterest)/[^\]]{1,50}\]'
144
201
  - regex: '(Pinterest)(?: for Android(?: Tablet|)|)/(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
145
202
  # Instagram app
146
- - regex: 'Mozilla.*Mobile.*(Instagram).(\d+)\.(\d+)\.(\d+)'
203
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Instagram).(\d+)\.(\d+)\.(\d+)'
147
204
  # Flipboard app
148
- - regex: 'Mozilla.*Mobile.*(Flipboard).(\d+)\.(\d+)\.(\d+)'
205
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard).(\d+)\.(\d+)\.(\d+)'
149
206
  # Flipboard-briefing app
150
- - regex: 'Mozilla.*Mobile.*(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
207
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Flipboard-Briefing).(\d+)\.(\d+)\.(\d+)'
151
208
  # Onefootball app
152
- - regex: 'Mozilla.*Mobile.*(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
209
+ - regex: 'Mozilla.{1,200}Mobile.{1,100}(Onefootball)\/Android.(\d+)\.(\d+)\.(\d+)'
153
210
  # Snapchat
154
211
  - regex: '(Snapchat)\/(\d+)\.(\d+)\.(\d+)\.(\d+)'
155
212
  # Twitter
156
213
  - regex: '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\/(\d+)\.(\d+)|)'
157
214
  family_replacement: 'Twitter'
158
215
 
216
+ # aspiegel.com spider (owned by Huawei)
217
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
218
+ family_replacement: 'Spider'
219
+
220
+ - regex: 'AspiegelBot'
221
+ family_replacement: 'Spider'
222
+
159
223
  # Basilisk
160
224
  - regex: '(Firefox)/(\d+)\.(\d+) Basilisk/(\d+)'
161
225
  family_replacement: 'Basilisk'
@@ -171,7 +235,7 @@ user_agent_parsers:
171
235
  family_replacement: 'Firefox Mobile'
172
236
  - regex: '(Fennec)/(\d+)\.(\d+)'
173
237
  family_replacement: 'Firefox Mobile'
174
- - regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
238
+ - regex: '(?:Mobile|Tablet);.{0,200}(Firefox)/(\d+)\.(\d+)'
175
239
  family_replacement: 'Firefox Mobile'
176
240
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
177
241
  family_replacement: 'Firefox ($1)'
@@ -185,7 +249,7 @@ user_agent_parsers:
185
249
  family_replacement: 'Firefox Beta'
186
250
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
187
251
  family_replacement: 'Firefox ($1)'
188
- - regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
252
+ - regex: '(Firefox).{0,200}Tablet browser (\d+)\.(\d+)\.(\d+)'
189
253
  family_replacement: 'MicroB'
190
254
  - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*|)'
191
255
  - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+)|)(\.(\d+)|)'
@@ -217,24 +281,24 @@ user_agent_parsers:
217
281
 
218
282
  # Opera will stop at 9.80 and hide the real version in the Version string.
219
283
  # see: http://dev.opera.com/articles/view/opera-ua-string-changes/
220
- - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
284
+ - regex: '(Opera Tablet).{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
221
285
  - regex: '(Opera Mini)(?:/att|)/?(\d+|)(?:\.(\d+)|)(?:\.(\d+)|)'
222
- - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
286
+ - regex: '(Opera)/.{1,100}Opera Mobi.{1,100}Version/(\d+)\.(\d+)'
223
287
  family_replacement: 'Opera Mobile'
224
- - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
288
+ - regex: '(Opera)/(\d+)\.(\d+).{1,100}Opera Mobi'
225
289
  family_replacement: 'Opera Mobile'
226
- - regex: 'Opera Mobi.+(Opera)(?:/|\s+)(\d+)\.(\d+)'
290
+ - regex: 'Opera Mobi.{1,100}(Opera)(?:/|\s+)(\d+)\.(\d+)'
227
291
  family_replacement: 'Opera Mobile'
228
292
  - regex: 'Opera Mobi'
229
293
  family_replacement: 'Opera Mobile'
230
- - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+)|)'
294
+ - regex: '(Opera)/9.80.{0,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
231
295
 
232
296
  # Opera 14 for Android uses a WebKit render engine.
233
- - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
297
+ - regex: '(?:Mobile Safari).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
234
298
  family_replacement: 'Opera Mobile'
235
299
 
236
300
  # Opera >=15 for Desktop is similar to Chrome but includes an "OPR" Version string.
237
- - regex: '(?:Chrome).*(OPR)/(\d+)\.(\d+)\.(\d+)'
301
+ - regex: '(?:Chrome).{1,300}(OPR)/(\d+)\.(\d+)\.(\d+)'
238
302
  family_replacement: 'Opera'
239
303
 
240
304
  # Opera Coast
@@ -246,7 +310,7 @@ user_agent_parsers:
246
310
  family_replacement: 'Opera Mini'
247
311
 
248
312
  # Opera Neon
249
- - regex: 'Chrome/.+( MMS)/(\d+).(\d+).(\d+)'
313
+ - regex: 'Chrome/.{1,200}( MMS)/(\d+).(\d+).(\d+)'
250
314
  family_replacement: 'Opera Neon'
251
315
 
252
316
  # Palm WebOS looks a lot like Safari.
@@ -293,7 +357,7 @@ user_agent_parsers:
293
357
 
294
358
  - regex: '(Symphony) (\d+).(\d+)'
295
359
 
296
- - regex: 'PLAYSTATION 3.+WebKit'
360
+ - regex: 'PLAYSTATION 3.{1,200}WebKit'
297
361
  family_replacement: 'NetFront NX'
298
362
  - regex: 'PLAYSTATION 3'
299
363
  family_replacement: 'NetFront'
@@ -302,7 +366,7 @@ user_agent_parsers:
302
366
  - regex: '(PlayStation Vita)'
303
367
  family_replacement: 'NetFront NX'
304
368
 
305
- - regex: 'AppleWebKit.+ (NX)/(\d+)\.(\d+)\.(\d+)'
369
+ - regex: 'AppleWebKit.{1,200} (NX)/(\d+)\.(\d+)\.(\d+)'
306
370
  family_replacement: 'NetFront NX'
307
371
  - regex: '(Nintendo 3DS)'
308
372
  family_replacement: 'NetFront NX'
@@ -315,11 +379,9 @@ user_agent_parsers:
315
379
  - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+)|)'
316
380
 
317
381
  # Edge Mobile
318
- - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
382
+ - regex: 'Windows Phone .{0,200}(Edge)/(\d+)\.(\d+)'
319
383
  family_replacement: 'Edge Mobile'
320
- - regex: '(EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
321
- family_replacement: 'Edge Mobile'
322
- - regex: '(EdgiOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
384
+ - regex: '(EdgiOS|EdgA)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
323
385
  family_replacement: 'Edge Mobile'
324
386
 
325
387
  # Samsung Internet (based on Chrome, but lacking some features)
@@ -365,9 +427,9 @@ user_agent_parsers:
365
427
  family_replacement: 'TopBuzz'
366
428
 
367
429
  # Google Search App on Android, eg:
368
- - regex: 'Mozilla.+Android.+(GSA)/(\d+)\.(\d+)\.(\d+)'
430
+ - regex: 'Mozilla.{1,200}Android.{1,200}(GSA)/(\d+)\.(\d+)\.(\d+)'
369
431
  family_replacement: 'Google'
370
-
432
+
371
433
  # QQ Browsers
372
434
  - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
373
435
  family_replacement: 'QQ Browser Mini'
@@ -376,10 +438,18 @@ user_agent_parsers:
376
438
  - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+)|)|)|)'
377
439
  family_replacement: 'QQ Browser'
378
440
 
441
+ # DuckDuckGo
442
+ - regex: 'Mobile.{0,200}(DuckDuckGo)/(\d+)'
443
+ family_replacement: 'DuckDuckGo Mobile'
444
+
445
+ # Tenta Browser
446
+ - regex: '(Tenta/)(\d+)\.(\d+)\.(\d+)'
447
+ family_replacement: 'Tenta Browser'
448
+
379
449
  # Chrome Mobile
380
- - regex: 'Version/.+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
450
+ - regex: 'Version/.{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
381
451
  family_replacement: 'Chrome Mobile WebView'
382
- - regex: '; wv\).+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
452
+ - regex: '; wv\).{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
383
453
  family_replacement: 'Chrome Mobile WebView'
384
454
  - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
385
455
  family_replacement: 'Chrome Mobile'
@@ -387,7 +457,7 @@ user_agent_parsers:
387
457
  family_replacement: 'Chrome Mobile iOS'
388
458
  - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
389
459
  family_replacement: 'Chrome Mobile'
390
- - regex: ' Mobile .*(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
460
+ - regex: ' Mobile .{1,300}(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
391
461
  family_replacement: 'Chrome Mobile'
392
462
 
393
463
  # Chrome Frame must come before MSIE.
@@ -406,6 +476,9 @@ user_agent_parsers:
406
476
  - regex: '(Rackspace Monitoring)/(\d+)\.(\d+)'
407
477
  family_replacement: 'RackspaceBot'
408
478
 
479
+ # PRTG Network Monitoring
480
+ - regex: '(PRTG Network Monitor)'
481
+
409
482
  # PyAMF
410
483
  - regex: '(PyAMF)/(\d+)\.(\d+)\.(\d+)'
411
484
 
@@ -414,7 +487,7 @@ user_agent_parsers:
414
487
  family_replacement: 'Yandex Browser'
415
488
 
416
489
  # Mail.ru Amigo/Internet Browser (Chromium-based)
417
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).* MRCHROME'
490
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).{0,100} MRCHROME'
418
491
  family_replacement: 'Mail.ru Chromium Browser'
419
492
 
420
493
  # AOL Browser (IE-based)
@@ -441,6 +514,9 @@ user_agent_parsers:
441
514
  # @ref: http://www.ghost.org
442
515
  - regex: '(Ghost)/(\d+)\.(\d+)\.(\d+)'
443
516
 
517
+ # Palo Alto GlobalProtect Linux
518
+ - regex: 'PAN (GlobalProtect)/(\d+)\.(\d+)\.(\d+) .{1,100} \(X11; Linux x86_64\)'
519
+
444
520
  #### END SPECIAL CASES TOP ####
445
521
 
446
522
  #### MAIN CASES - this catches > 50% of all browsers ####
@@ -482,7 +558,7 @@ user_agent_parsers:
482
558
  - regex: 'Microsoft Office (Word) 2014'
483
559
 
484
560
  # Windows Live Mail
485
- - regex: 'Outlook-Express\/7\.0.*'
561
+ - regex: 'Outlook-Express\/7\.0'
486
562
  family_replacement: 'Windows Live Mail'
487
563
 
488
564
  # Apple Air Mail
@@ -522,7 +598,7 @@ user_agent_parsers:
522
598
  family_replacement: 'Brave'
523
599
 
524
600
  # Iron Browser ~since version 50
525
- - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]* Iron[^/]'
601
+ - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]{0,100} Iron[^/]'
526
602
  family_replacement: 'Iron'
527
603
 
528
604
  # Dolphin Browser
@@ -598,20 +674,20 @@ user_agent_parsers:
598
674
  - regex: '^(HTC) Streaming Player \S+ / \S+ / \S+ / (\d+)\.(\d+)(?:\.(\d+)|)'
599
675
  - regex: '^(Stitcher)/iOS'
600
676
  - regex: '^(Stitcher)/Android'
601
- - regex: '^(VLC) .*version (\d+)\.(\d+)\.(\d+)'
677
+ - regex: '^(VLC) .{0,200}version (\d+)\.(\d+)\.(\d+)'
602
678
  - regex: ' (VLC) for'
603
679
  - regex: '(vlc)/(\d+)\.(\d+)\.(\d+)'
604
680
  family_replacement: 'VLC'
605
- - regex: '^(foobar)\S+/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
606
- - regex: '^(Clementine)\S+ ([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
607
- - regex: '(amarok)/([^.\s]+)\.([^.\s]+|)\.?([^.\s]+|)'
681
+ - regex: '^(foobar)\S{1,10}/(\d+)\.(\d+|)\.?([\da-z]+|)'
682
+ - regex: '^(Clementine)\S{1,10} (\d+)\.(\d+|)\.?(\d+|)'
683
+ - regex: '(amarok)/(\d+)\.(\d+|)\.?(\d+|)'
608
684
  family_replacement: 'Amarok'
609
685
  - regex: '(Custom)-Feed Reader'
610
686
 
611
687
  # Browser major_version.minor_version.beta_version (space instead of slash)
612
688
  - regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
613
689
  # Browser major_version.minor_version (space instead of slash)
614
- - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)\.(\d+)(?:\.(\d+)|)'
690
+ - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
615
691
 
616
692
  # Kindle WebKit
617
693
  - regex: '(Kindle)/(\d+)\.(\d+)'
@@ -638,7 +714,7 @@ user_agent_parsers:
638
714
 
639
715
  # desktop mode
640
716
  # http://www.anandtech.com/show/3982/windows-phone-7-review
641
- - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
717
+ - regex: '(MSIE) (\d+)\.(\d+).{0,100}XBLWP7'
642
718
  family_replacement: 'IE Large Screen'
643
719
 
644
720
  # Nextcloud desktop sync client
@@ -655,6 +731,17 @@ user_agent_parsers:
655
731
  - regex: '(OC)/(\d+)\.(\d+)\.(\d+)\.(\d+) \(Skype for Business\)'
656
732
  family_replacement: 'Skype'
657
733
 
734
+ # OpenVAS Scanner
735
+ - regex: '(OpenVAS)(?:-VT)?(?:[ \/](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
736
+ family_replacement: 'OpenVAS Scanner'
737
+
738
+ # AnyConnect
739
+ - regex: '(AnyConnect)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
740
+
741
+ # Monitis
742
+ - regex: 'compatible; monitis'
743
+ family_replacement: 'Monitis'
744
+
658
745
  #### END MAIN CASES ####
659
746
 
660
747
  #### SPECIAL CASES ####
@@ -691,21 +778,17 @@ user_agent_parsers:
691
778
  family_replacement: 'TopBuzz'
692
779
 
693
780
  # @note: iOS / OSX Applications
694
- - regex: '(iPod|iPhone|iPad).+GSA/(\d+)\.(\d+)\.(\d+) Mobile'
781
+ - regex: '(iPod|iPhone|iPad).{1,200}GSA/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|) Mobile'
695
782
  family_replacement: 'Google'
696
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|).*[ +]Safari'
783
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|).{1,200}[ +]Safari'
697
784
  family_replacement: 'Mobile Safari'
698
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).* AppleNews\/\d+\.\d+\.\d+?'
785
+ - regex: '(iPod|iPod touch|iPhone|iPad);.{0,30}CPU.{0,30}OS[ +](\d+)_(\d+)(?:_(\d+)|).{0,30} AppleNews\/\d+\.\d+(?:\.\d+|)'
699
786
  family_replacement: 'Mobile Safari UI/WKWebView'
700
- - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+)|)'
787
+ - regex: '(iPod|iPhone|iPad).{1,200}Version/(\d+)\.(\d+)(?:\.(\d+)|)'
701
788
  family_replacement: 'Mobile Safari UI/WKWebView'
702
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile.*[ +]Safari'
789
+ - regex: '(iPod|iPod touch|iPhone|iPad).{0,200} Safari'
703
790
  family_replacement: 'Mobile Safari'
704
- - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+)|).*Mobile'
705
- family_replacement: 'Mobile Safari UI/WKWebView'
706
- - regex: '(iPod|iPhone|iPad).* Safari'
707
- family_replacement: 'Mobile Safari'
708
- - regex: '(iPod|iPhone|iPad)'
791
+ - regex: '(iPod|iPod touch|iPhone|iPad)'
709
792
  family_replacement: 'Mobile Safari UI/WKWebView'
710
793
  - regex: '(Watch)(\d+),(\d+)'
711
794
  family_replacement: 'Apple $1 App'
@@ -754,9 +837,9 @@ user_agent_parsers:
754
837
  - regex: '(Nokia)[EN]?(\d+)'
755
838
 
756
839
  # BlackBerry devices
757
- - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
840
+ - regex: '(PlayBook).{1,200}RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
758
841
  family_replacement: 'BlackBerry WebKit'
759
- - regex: '(Black[bB]erry|BB10).+Version/(\d+)\.(\d+)\.(\d+)'
842
+ - regex: '(Black[bB]erry|BB10).{1,200}Version/(\d+)\.(\d+)\.(\d+)'
760
843
  family_replacement: 'BlackBerry WebKit'
761
844
  - regex: '(Black[bB]erry)\s?(\d+)'
762
845
  family_replacement: 'BlackBerry'
@@ -776,18 +859,15 @@ user_agent_parsers:
776
859
 
777
860
  - regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
778
861
 
779
- #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
780
- # family_replacement: 'iPad'
781
-
782
862
  # Phantomjs, should go before Safari
783
863
  - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
784
864
 
785
865
  # WebKit Nightly
786
- - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .* Safari'
866
+ - regex: '(AppleWebKit)/(\d+)(?:\.(\d+)|)\+ .{0,200} Safari'
787
867
  family_replacement: 'WebKit Nightly'
788
868
 
789
869
  # Safari
790
- - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).*Safari/'
870
+ - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+)|).{0,100}Safari/'
791
871
  family_replacement: 'Safari'
792
872
  # Safari didn't provide "Version/d.d.d" prior to 3.0
793
873
  - regex: '(Safari)/\d+'
@@ -836,6 +916,7 @@ user_agent_parsers:
836
916
  - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
837
917
  - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*|)'
838
918
 
919
+
839
920
  - regex: '([MS]?IE) (\d+)\.(\d+)'
840
921
  family_replacement: 'IE'
841
922
 
@@ -843,18 +924,56 @@ user_agent_parsers:
843
924
  family_replacement: 'Python Requests'
844
925
 
845
926
  # headless user-agents
846
- - regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
927
+ - regex: '\b(Windows-Update-Agent|WindowsPowerShell|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|wget2|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got|CloudCockpitBackend|ReactorNetty|axios|Jersey|Vert.x-WebClient|Apache-CXF|Go-CF-client|go-resty|AHC)(?:[ /](\d+)(?:\.(\d+)|)(?:\.(\d+)|)|)'
928
+
929
+ # CloudFoundry
930
+ - regex: '^(cf)\/(\d+)\.(\d+)\.(\S+)'
931
+ family_replacement: 'CloudFoundry'
932
+
933
+ # SAP Leonardo
934
+ - regex: '^(sap-leonardo-iot-sdk-nodejs) \/ (\d+)\.(\d+)\.(\d+)'
935
+
936
+ # SAP Netweaver Application Server
937
+ - regex: '^(SAP NetWeaver Application Server) \(1.0;(\d{1})(\d{2})\)'
938
+
939
+ # HttpClient
940
+ - regex: '^(\w+-HTTPClient)\/(\d+)\.(\d+)-(\S+)'
941
+ family_replacement: 'HTTPClient'
942
+
943
+ # go-cli
944
+ - regex: '^(go-cli)\s(\d+)\.(\d+).(\S+)'
945
+
946
+ # Other Clients with the pattern <Name>/[v]<Major>.<Minor>[.<Patch>]
947
+ - regex: '^(Java-EurekaClient|Java-EurekaClient-Replication|HTTPClient|lua-resty-http)\/v?(\d+)\.(\d+)\.?(\d*)'
948
+
949
+ ## Clints with the pattern <Name>
950
+ - regex: '^(ping-service|sap xsuaa|Node-oauth|Site24x7|SAP CPI|JAEGER_SECURITY)'
847
951
 
848
952
  # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
849
953
  - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
850
- # Asynchronous HTTP Client/Server for asyncio and Python (https://aiohttp.readthedocs.io/)
851
- - regex: '(Python/3\.\d{1,3} aiohttp)/(\d+)\.(\d+)\.(\d+)'
954
+ family_replacement: 'Python aiohttp'
955
+
956
+ - regex: '(Java)[/ ]?\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
852
957
 
853
- - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+|)'
958
+ # minio-go (https://github.com/minio/minio-go)
959
+ - regex: '(minio-go)/v(\d+)\.(\d+)\.(\d+)'
960
+
961
+ # ureq - minimal request library in rust (https://github.com/algesten/ureq)
962
+ - regex: '^(ureq)[/ ](\d+)\.(\d+).(\d+)'
963
+
964
+ # http.rb - HTTP (The Gem! a.k.a. http.rb) - a fast Ruby HTTP client
965
+ # (https://github.com/httprb/http/blob/3aa7470288deb81f7d7b982c1e2381871049dcbb/lib/http/request.rb#L27)
966
+ - regex: '^(http\.rb)/(\d+)\.(\d+).(\d+)'
967
+
968
+ # Guzzle, PHP HTTP client (https://docs.guzzlephp.org/)
969
+ - regex: '^(GuzzleHttp)/(\d+)\.(\d+).(\d+)'
970
+
971
+ # lorien/grab - Web Scraping Framework (https://github.com/lorien/grab)
972
+ - regex: '^(grab)\b'
854
973
 
855
974
  # Cloud Storage Clients
856
975
  - regex: '^(Cyberduck)/(\d+)\.(\d+)\.(\d+)(?:\.\d+|)'
857
- - regex: '^(S3 Browser) (\d+)-(\d+)-(\d+)(?:\s*http://s3browser\.com|)'
976
+ - regex: '^(S3 Browser) (\d+)[.-](\d+)[.-](\d+)(?:\s*https?://s3browser\.com|)'
858
977
  - regex: '(S3Gof3r)'
859
978
  # IBM COS (Cloud Object Storage) API
860
979
  - regex: '\b(ibm-cos-sdk-(?:core|java|js|python))/(\d+)\.(\d+)(?:\.(\d+)|)'
@@ -877,6 +996,15 @@ user_agent_parsers:
877
996
  - regex: '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\d+)\.(\d+)\.(\d+)'
878
997
  family_replacement: 'ViaFree'
879
998
 
999
+ # Transmit (https://library.panic.com/transmit/)
1000
+ - regex: '(Transmit)/(\d+)\.(\d+)\.(\d+)'
1001
+
1002
+ # Download Master (https://downloadmaster.ru/)
1003
+ - regex: '(Download Master)'
1004
+
1005
+ # HTTrack crawler
1006
+ - regex: '\b(HTTrack) (\d+)\.(\d+)(?:[\.\-](\d+)|)'
1007
+
880
1008
  os_parsers:
881
1009
  ##########
882
1010
  # HbbTV vendors
@@ -892,7 +1020,7 @@ os_parsers:
892
1020
  # Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11
893
1021
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL40HX751; PKG1.902EUA; 2012;);; en) Presto/2.10.250 Version/11.60
894
1022
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Sony; KDL22EX320; PKG4.017EUA; 2011;);; en) Presto/2.7.61 Version/11.00
895
- #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.*;.*; ([0-9]{4});\)'
1023
+ #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.{0,200};.{0,200}; ([0-9]{4});\)'
896
1024
 
897
1025
 
898
1026
  # LG is consistent too, but we need to add manually the year model
@@ -912,9 +1040,9 @@ os_parsers:
912
1040
  os_replacement: 'Samsung'
913
1041
  os_v1_replacement: '2011'
914
1042
  # manage the two models of 2013
915
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC'
1043
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}FXPDEUC'
916
1044
  os_v2_replacement: 'UE40F7000'
917
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC'
1045
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.{0,200}MST12DEUC'
918
1046
  os_v2_replacement: 'UE32F4500'
919
1047
  # generic Samsung (works starting in 2012)
920
1048
  #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});'
@@ -922,22 +1050,26 @@ os_parsers:
922
1050
  # Philips : not found any other way than a manual mapping
923
1051
  # Opera/9.80 (Linux mips; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/4.1.3 PHILIPSTV/1.1.1; en) Presto/2.10.250 Version/11.60
924
1052
  # Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.2.1; en) Presto/2.6.33 Version/10.70
925
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/4'
1053
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/4'
926
1054
  os_v1_replacement: '2013'
927
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/3'
1055
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/3'
928
1056
  os_v1_replacement: '2012'
929
- - regex: 'HbbTV/1\.1\.1 \(; (Philips);.*NETTV/2'
1057
+ - regex: 'HbbTV/1\.1\.1 \(; (Philips);.{0,200}NETTV/2'
930
1058
  os_v1_replacement: '2011'
931
1059
 
932
1060
  # the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
933
- - regex: 'HbbTV/\d+\.\d+\.\d+.*(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
1061
+ - regex: 'HbbTV/\d+\.\d+\.\d+.{0,100}(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
934
1062
  os_replacement: 'FireHbbTV'
935
1063
 
936
1064
  # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
937
- - regex: 'HbbTV/\d+\.\d+\.\d+ \(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\)'
1065
+ - regex: 'HbbTV/\d+\.\d+\.\d+ \(.{0,30}; ?([a-zA-Z]+) ?;.{0,30}(201[1-9]).{0,30}\)'
1066
+
1067
+ # aspiegel.com spider (owned by Huawei)
1068
+ - regex: 'AspiegelBot'
1069
+ os_replacement: 'Other'
938
1070
 
939
1071
  ##########
940
- # @note: Windows Phone needs to come before Windows NT 6.1 *and* before Android to catch cases such as:
1072
+ # @note: Windows Phone needs to come before Windows NT 6.1 {0,2}and* before Android to catch cases such as:
941
1073
  # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920)...
942
1074
  # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; ANZ821)...
943
1075
  # Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920; Orange)...
@@ -946,10 +1078,16 @@ os_parsers:
946
1078
 
947
1079
  - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
948
1080
 
949
- # Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
950
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).*Outlook-iOS-Android'
1081
+ # Again a MS-special one: iPhone.{0,200}Outlook-iOS-Android/x.x is erroneously detected as Android
1082
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|).{0,100}Outlook-iOS-Android'
951
1083
  os_replacement: 'iOS'
952
1084
 
1085
+ # Special case for old ArcGIS Mobile products
1086
+ - regex: 'ArcGIS\.?(iOS|Android)-\d+\.\d+(?:\.\d+|)(?:[^\/]{1,50}|)\/(\d+)(?:\.(\d+)(?:\.(\d+)|)|)'
1087
+
1088
+ # Special case for new ArcGIS Mobile products
1089
+ - regex: 'ArcGISRuntime-(?:Android|iOS)\/\d+\.\d+(?:\.\d+|) \((Android|iOS) (\d+)(?:\.(\d+)(?:\.(\d+)|)|);'
1090
+
953
1091
  ##########
954
1092
  # Android
955
1093
  # can actually detect rooted android os. do we care?
@@ -976,17 +1114,17 @@ os_parsers:
976
1114
  os_v1_replacement: '3'
977
1115
 
978
1116
  # Android 9; Android 10;
979
- - regex: '(Android) (\d+);'
1117
+ - regex: '(Android) (\d+);'
980
1118
 
981
1119
  # UCWEB
982
- - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+)|);'
1120
+ - regex: '^UCWEB.{0,200}; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]{1,100})|);'
983
1121
  os_replacement: 'Android'
984
- - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
1122
+ - regex: '^UCWEB.{0,200}; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+)|);'
985
1123
  os_replacement: 'iOS'
986
- - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
1124
+ - regex: '^UCWEB.{0,200}; (wds) (\d+)\.(\d+)(?:\.(\d+)|);'
987
1125
  os_replacement: 'Windows Phone'
988
1126
  # JUC
989
- - regex: '^(JUC).*; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+)|)'
1127
+ - regex: '^(JUC).{0,200}; ?U; ?(?:Android|)(\d+)\.(\d+)(?:[\.\-]([a-z0-9]{1,100})|)'
990
1128
  os_replacement: 'Android'
991
1129
 
992
1130
  # Salesforce
@@ -1004,7 +1142,7 @@ os_parsers:
1004
1142
  # properly identify as Chrome OS
1005
1143
  #
1006
1144
  # ex: Mozilla/5.0 (X11; Windows aarch64 10718.88.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.118 Safari/537.36 CitrixChromeApp
1007
- - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).*Chrome.*(?:CitrixChromeApp)$'
1145
+ - regex: '(x86_64|aarch64)\ (\d+)\.(\d+)\.(\d+).{0,100}Chrome.{0,100}(?:CitrixChromeApp)$'
1008
1146
  os_replacement: 'Chrome OS'
1009
1147
 
1010
1148
  ##########
@@ -1033,11 +1171,11 @@ os_parsers:
1033
1171
  os_replacement: 'Windows'
1034
1172
  os_v1_replacement: 'XP'
1035
1173
 
1036
- - regex: '(Windows NT 6\.1)'
1174
+ - regex: '(Win(?:dows NT |32NT\/)6\.1)'
1037
1175
  os_replacement: 'Windows'
1038
1176
  os_v1_replacement: '7'
1039
1177
 
1040
- - regex: '(Windows NT 6\.0)'
1178
+ - regex: '(Win(?:dows NT |32NT\/)6\.0)'
1041
1179
  os_replacement: 'Windows'
1042
1180
  os_v1_replacement: 'Vista'
1043
1181
 
@@ -1049,7 +1187,7 @@ os_parsers:
1049
1187
  os_replacement: 'Windows'
1050
1188
  os_v1_replacement: 'RT'
1051
1189
 
1052
- - regex: '(Windows NT 6\.2)'
1190
+ - regex: '(Win(?:dows NT |32NT\/)6\.2)'
1053
1191
  os_replacement: 'Windows'
1054
1192
  os_v1_replacement: '8'
1055
1193
 
@@ -1058,12 +1196,12 @@ os_parsers:
1058
1196
  os_v1_replacement: 'RT 8'
1059
1197
  os_v2_replacement: '1'
1060
1198
 
1061
- - regex: '(Windows NT 6\.3)'
1199
+ - regex: '(Win(?:dows NT |32NT\/)6\.3)'
1062
1200
  os_replacement: 'Windows'
1063
1201
  os_v1_replacement: '8'
1064
1202
  os_v2_replacement: '1'
1065
1203
 
1066
- - regex: '(Windows NT 6\.4)'
1204
+ - regex: '(Win(?:dows NT |32NT\/)6\.4)'
1067
1205
  os_replacement: 'Windows'
1068
1206
  os_v1_replacement: '10'
1069
1207
 
@@ -1096,7 +1234,7 @@ os_parsers:
1096
1234
  os_v1_replacement: '95'
1097
1235
 
1098
1236
  # Box apps (Drive, Sync, Notes) on Windows https://www.box.com/resources/downloads
1099
- - regex: '^Box.*Windows/([\d.]+);'
1237
+ - regex: '^Box.{0,200}Windows/([\d.]+);'
1100
1238
  os_replacement: 'Windows'
1101
1239
  os_v1_replacement: '$1'
1102
1240
 
@@ -1113,33 +1251,33 @@ os_parsers:
1113
1251
  ##########
1114
1252
  - regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+)|)|Mach-O)'
1115
1253
  os_replacement: 'Mac OS X'
1116
- - regex: '\w+\s+Mac OS X\s+\w+\s+(\d+).(\d+).(\d+).*'
1254
+ - regex: 'Mac OS X\s.{1,50}\s(\d+).(\d+).(\d+)'
1117
1255
  os_replacement: 'Mac OS X'
1118
1256
  os_v1_replacement: '$1'
1119
1257
  os_v2_replacement: '$2'
1120
1258
  os_v3_replacement: '$3'
1121
1259
  # Leopard
1122
- - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
1260
+ - regex: ' (Dar)(win)/(9).(\d+).{0,100}\((?:i386|x86_64|Power Macintosh)\)'
1123
1261
  os_replacement: 'Mac OS X'
1124
1262
  os_v1_replacement: '10'
1125
1263
  os_v2_replacement: '5'
1126
1264
  # Snow Leopard
1127
- - regex: ' (Dar)(win)/(10).(\d+).*\((?:i386|x86_64)\)'
1265
+ - regex: ' (Dar)(win)/(10).(\d+).{0,100}\((?:i386|x86_64)\)'
1128
1266
  os_replacement: 'Mac OS X'
1129
1267
  os_v1_replacement: '10'
1130
1268
  os_v2_replacement: '6'
1131
1269
  # Lion
1132
- - regex: ' (Dar)(win)/(11).(\d+).*\((?:i386|x86_64)\)'
1270
+ - regex: ' (Dar)(win)/(11).(\d+).{0,100}\((?:i386|x86_64)\)'
1133
1271
  os_replacement: 'Mac OS X'
1134
1272
  os_v1_replacement: '10'
1135
1273
  os_v2_replacement: '7'
1136
1274
  # Mountain Lion
1137
- - regex: ' (Dar)(win)/(12).(\d+).*\((?:i386|x86_64)\)'
1275
+ - regex: ' (Dar)(win)/(12).(\d+).{0,100}\((?:i386|x86_64)\)'
1138
1276
  os_replacement: 'Mac OS X'
1139
1277
  os_v1_replacement: '10'
1140
1278
  os_v2_replacement: '8'
1141
1279
  # Mavericks
1142
- - regex: ' (Dar)(win)/(13).(\d+).*\((?:i386|x86_64)\)'
1280
+ - regex: ' (Dar)(win)/(13).(\d+).{0,100}\((?:i386|x86_64)\)'
1143
1281
  os_replacement: 'Mac OS X'
1144
1282
  os_v1_replacement: '10'
1145
1283
  os_v2_replacement: '9'
@@ -1156,7 +1294,7 @@ os_parsers:
1156
1294
  - regex: '(?:PPC|Intel) (Mac OS X)'
1157
1295
 
1158
1296
  # Box Drive and Box Sync on Mac OS X use OSX version numbers, not Darwin
1159
- - regex: '^Box.*;(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1297
+ - regex: '^Box.{0,200};(Darwin)/(10)\.(1\d)(?:\.(\d+)|)'
1160
1298
  os_replacement: 'Mac OS X'
1161
1299
 
1162
1300
  ##########
@@ -1167,7 +1305,7 @@ os_parsers:
1167
1305
  - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+)|)'
1168
1306
  os_replacement: 'ATV OS X'
1169
1307
 
1170
- - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1308
+ - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+)|)'
1171
1309
  os_replacement: 'iOS'
1172
1310
 
1173
1311
  # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
@@ -1175,15 +1313,15 @@ os_parsers:
1175
1313
  os_replacement: 'iOS'
1176
1314
 
1177
1315
  # few more stragglers
1178
- - regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
1316
+ - regex: '(iPhone|iPad|iPod).{0,100}Mac OS X.{0,100}Version/(\d+)\.(\d+)'
1179
1317
  os_replacement: 'iOS'
1180
1318
 
1181
1319
  # CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
1182
1320
  # whether the os maps to Mac OS, or iOS, or just Darwin.
1183
1321
  # See: http://user-agents.me/cfnetwork-version-list
1184
- - regex: '(CFNetwork)/(5)48\.0\.3.* Darwin/11\.0\.0'
1322
+ - regex: '(CFNetwork)/(5)48\.0\.3.{0,100} Darwin/11\.0\.0'
1185
1323
  os_replacement: 'iOS'
1186
- - regex: '(CFNetwork)/(5)48\.(0)\.4.* Darwin/(1)1\.0\.0'
1324
+ - regex: '(CFNetwork)/(5)48\.(0)\.4.{0,100} Darwin/(1)1\.0\.0'
1187
1325
  os_replacement: 'iOS'
1188
1326
  - regex: '(CFNetwork)/(5)48\.(1)\.4'
1189
1327
  os_replacement: 'iOS'
@@ -1218,17 +1356,17 @@ os_parsers:
1218
1356
  os_replacement: 'Mac OS X'
1219
1357
  os_v1_replacement: '10'
1220
1358
  os_v2_replacement: '11'
1221
- - regex: 'CFNetwork/7.* Darwin/15\.4\.\d+'
1359
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.4\.\d+'
1222
1360
  os_replacement: 'iOS'
1223
1361
  os_v1_replacement: '9'
1224
1362
  os_v2_replacement: '3'
1225
1363
  os_v3_replacement: '1'
1226
- - regex: 'CFNetwork/7.* Darwin/15\.5\.\d+'
1364
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.5\.\d+'
1227
1365
  os_replacement: 'iOS'
1228
1366
  os_v1_replacement: '9'
1229
1367
  os_v2_replacement: '3'
1230
1368
  os_v3_replacement: '2'
1231
- - regex: 'CFNetwork/7.* Darwin/15\.6\.\d+'
1369
+ - regex: 'CFNetwork/7.{0,100} Darwin/15\.6\.\d+'
1232
1370
  os_replacement: 'iOS'
1233
1371
  os_v1_replacement: '9'
1234
1372
  os_v2_replacement: '3'
@@ -1249,15 +1387,15 @@ os_parsers:
1249
1387
  # CFNetwork macOS Apps (must be before CFNetwork iOS Apps
1250
1388
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1251
1389
  ##########
1252
- - regex: 'CFNetwork/.* Darwin/17\.\d+.*\(x86_64\)'
1390
+ - regex: 'CFNetwork/.{0,100} Darwin/17\.\d+.{0,100}\(x86_64\)'
1253
1391
  os_replacement: 'Mac OS X'
1254
1392
  os_v1_replacement: '10'
1255
1393
  os_v2_replacement: '13'
1256
- - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)'
1394
+ - regex: 'CFNetwork/.{0,100} Darwin/16\.\d+.{0,100}\(x86_64\)'
1257
1395
  os_replacement: 'Mac OS X'
1258
1396
  os_v1_replacement: '10'
1259
1397
  os_v2_replacement: '12'
1260
- - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)'
1398
+ - regex: 'CFNetwork/8.{0,100} Darwin/15\.\d+.{0,100}\(x86_64\)'
1261
1399
  os_replacement: 'Mac OS X'
1262
1400
  os_v1_replacement: '10'
1263
1401
  os_v2_replacement: '11'
@@ -1265,87 +1403,146 @@ os_parsers:
1265
1403
  # CFNetwork iOS Apps
1266
1404
  # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
1267
1405
  ##########
1268
- - regex: 'CFNetwork/.* Darwin/(9)\.\d+'
1406
+ - regex: 'CFNetwork/.{0,100} Darwin/(9)\.\d+'
1269
1407
  os_replacement: 'iOS'
1270
1408
  os_v1_replacement: '1'
1271
- - regex: 'CFNetwork/.* Darwin/(10)\.\d+'
1409
+ - regex: 'CFNetwork/.{0,100} Darwin/(10)\.\d+'
1272
1410
  os_replacement: 'iOS'
1273
1411
  os_v1_replacement: '4'
1274
- - regex: 'CFNetwork/.* Darwin/(11)\.\d+'
1412
+ - regex: 'CFNetwork/.{0,100} Darwin/(11)\.\d+'
1275
1413
  os_replacement: 'iOS'
1276
1414
  os_v1_replacement: '5'
1277
- - regex: 'CFNetwork/.* Darwin/(13)\.\d+'
1415
+ - regex: 'CFNetwork/.{0,100} Darwin/(13)\.\d+'
1278
1416
  os_replacement: 'iOS'
1279
1417
  os_v1_replacement: '6'
1280
- - regex: 'CFNetwork/6.* Darwin/(14)\.\d+'
1418
+ - regex: 'CFNetwork/6.{0,100} Darwin/(14)\.\d+'
1281
1419
  os_replacement: 'iOS'
1282
1420
  os_v1_replacement: '7'
1283
- - regex: 'CFNetwork/7.* Darwin/(14)\.\d+'
1421
+ - regex: 'CFNetwork/7.{0,100} Darwin/(14)\.\d+'
1284
1422
  os_replacement: 'iOS'
1285
1423
  os_v1_replacement: '8'
1286
1424
  os_v2_replacement: '0'
1287
- - regex: 'CFNetwork/7.* Darwin/(15)\.\d+'
1425
+ - regex: 'CFNetwork/7.{0,100} Darwin/(15)\.\d+'
1288
1426
  os_replacement: 'iOS'
1289
1427
  os_v1_replacement: '9'
1290
1428
  os_v2_replacement: '0'
1291
- - regex: 'CFNetwork/8.* Darwin/16\.5\.\d+'
1429
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.5\.\d+'
1292
1430
  os_replacement: 'iOS'
1293
1431
  os_v1_replacement: '10'
1294
1432
  os_v2_replacement: '3'
1295
- - regex: 'CFNetwork/8.* Darwin/16\.6\.\d+'
1433
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.6\.\d+'
1296
1434
  os_replacement: 'iOS'
1297
1435
  os_v1_replacement: '10'
1298
1436
  os_v2_replacement: '3'
1299
1437
  os_v3_replacement: '2'
1300
- - regex: 'CFNetwork/8.* Darwin/16\.7\.\d+'
1438
+ - regex: 'CFNetwork/8.{0,100} Darwin/16\.7\.\d+'
1301
1439
  os_replacement: 'iOS'
1302
1440
  os_v1_replacement: '10'
1303
1441
  os_v2_replacement: '3'
1304
1442
  os_v3_replacement: '3'
1305
- - regex: 'CFNetwork/8.* Darwin/(16)\.\d+'
1443
+ - regex: 'CFNetwork/8.{0,100} Darwin/(16)\.\d+'
1306
1444
  os_replacement: 'iOS'
1307
1445
  os_v1_replacement: '10'
1308
- - regex: 'CFNetwork/8.* Darwin/17\.0\.\d+'
1446
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.0\.\d+'
1309
1447
  os_replacement: 'iOS'
1310
1448
  os_v1_replacement: '11'
1311
1449
  os_v2_replacement: '0'
1312
- - regex: 'CFNetwork/8.* Darwin/17\.2\.\d+'
1450
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.2\.\d+'
1313
1451
  os_replacement: 'iOS'
1314
1452
  os_v1_replacement: '11'
1315
1453
  os_v2_replacement: '1'
1316
- - regex: 'CFNetwork/8.* Darwin/17\.3\.\d+'
1454
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.3\.\d+'
1317
1455
  os_replacement: 'iOS'
1318
1456
  os_v1_replacement: '11'
1319
1457
  os_v2_replacement: '2'
1320
- - regex: 'CFNetwork/8.* Darwin/17\.4\.\d+'
1458
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.4\.\d+'
1321
1459
  os_replacement: 'iOS'
1322
1460
  os_v1_replacement: '11'
1323
1461
  os_v2_replacement: '2'
1324
1462
  os_v3_replacement: '6'
1325
- - regex: 'CFNetwork/8.* Darwin/17\.5\.\d+'
1463
+ - regex: 'CFNetwork/8.{0,100} Darwin/17\.5\.\d+'
1326
1464
  os_replacement: 'iOS'
1327
1465
  os_v1_replacement: '11'
1328
1466
  os_v2_replacement: '3'
1329
- - regex: 'CFNetwork/9.* Darwin/17\.6\.\d+'
1467
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.6\.\d+'
1330
1468
  os_replacement: 'iOS'
1331
1469
  os_v1_replacement: '11'
1332
1470
  os_v2_replacement: '4'
1333
- - regex: 'CFNetwork/9.* Darwin/17\.7\.\d+'
1471
+ - regex: 'CFNetwork/9.{0,100} Darwin/17\.7\.\d+'
1334
1472
  os_replacement: 'iOS'
1335
1473
  os_v1_replacement: '11'
1336
1474
  os_v2_replacement: '4'
1337
1475
  os_v3_replacement: '1'
1338
- - regex: 'CFNetwork/8.* Darwin/(17)\.\d+'
1476
+ - regex: 'CFNetwork/8.{0,100} Darwin/(17)\.\d+'
1339
1477
  os_replacement: 'iOS'
1340
1478
  os_v1_replacement: '11'
1341
- - regex: 'CFNetwork/9.* Darwin/18\.0\.\d+'
1479
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.0\.\d+'
1342
1480
  os_replacement: 'iOS'
1343
1481
  os_v1_replacement: '12'
1344
1482
  os_v2_replacement: '0'
1345
- - regex: 'CFNetwork/9.* Darwin/(18)\.\d+'
1483
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.2\.\d+'
1346
1484
  os_replacement: 'iOS'
1347
1485
  os_v1_replacement: '12'
1348
- - regex: 'CFNetwork/.* Darwin/'
1486
+ os_v2_replacement: '1'
1487
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.5\.\d+'
1488
+ os_replacement: 'iOS'
1489
+ os_v1_replacement: '12'
1490
+ os_v2_replacement: '2'
1491
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.6\.\d+'
1492
+ os_replacement: 'iOS'
1493
+ os_v1_replacement: '12'
1494
+ os_v2_replacement: '3'
1495
+ - regex: 'CFNetwork/9.{0,100} Darwin/18\.7\.\d+'
1496
+ os_replacement: 'iOS'
1497
+ os_v1_replacement: '12'
1498
+ os_v2_replacement: '4'
1499
+ - regex: 'CFNetwork/9.{0,100} Darwin/(18)\.\d+'
1500
+ os_replacement: 'iOS'
1501
+ os_v1_replacement: '12'
1502
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.2\.\d+'
1503
+ os_replacement: 'iOS'
1504
+ os_v1_replacement: '13'
1505
+ os_v2_replacement: '3'
1506
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.3\.\d+'
1507
+ os_replacement: 'iOS'
1508
+ os_v1_replacement: '13'
1509
+ os_v2_replacement: '3'
1510
+ os_v3_replacement: '1'
1511
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.4\.\d+'
1512
+ os_replacement: 'iOS'
1513
+ os_v1_replacement: '13'
1514
+ os_v2_replacement: '4'
1515
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.5\.\d+'
1516
+ os_replacement: 'iOS'
1517
+ os_v1_replacement: '13'
1518
+ os_v2_replacement: '5'
1519
+ - regex: 'CFNetwork/11.{0,100} Darwin/19\.6\.\d+'
1520
+ os_replacement: 'iOS'
1521
+ os_v1_replacement: '13'
1522
+ os_v2_replacement: '6'
1523
+ - regex: 'CFNetwork/1[01].{0,100} Darwin/19\.\d+'
1524
+ os_replacement: 'iOS'
1525
+ os_v1_replacement: '13'
1526
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.1\.\d+'
1527
+ os_replacement: 'iOS'
1528
+ os_v1_replacement: '14'
1529
+ os_v2_replacement: '2'
1530
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.2\.\d+'
1531
+ os_replacement: 'iOS'
1532
+ os_v1_replacement: '14'
1533
+ os_v2_replacement: '3'
1534
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.3\.\d+'
1535
+ os_replacement: 'iOS'
1536
+ os_v1_replacement: '14'
1537
+ os_v2_replacement: '4'
1538
+ - regex: 'CFNetwork/12.{0,100} Darwin/20\.4\.\d+'
1539
+ os_replacement: 'iOS'
1540
+ os_v1_replacement: '14'
1541
+ os_v2_replacement: '5'
1542
+ - regex: 'CFNetwork/.{0,100} Darwin/(20)\.\d+'
1543
+ os_replacement: 'iOS'
1544
+ os_v1_replacement: '14'
1545
+ - regex: 'CFNetwork/.{0,100} Darwin/'
1349
1546
  os_replacement: 'iOS'
1350
1547
 
1351
1548
  # iOS Apps
@@ -1356,7 +1553,7 @@ os_parsers:
1356
1553
  ##########
1357
1554
  # Apple Watch
1358
1555
  ##########
1359
- - regex: '(watchOS)/(\d+)\.(\d+)(?:\.(\d+)|)'
1556
+ - regex: '(watchOS)[/ ](\d+)\.(\d+)(?:\.(\d+)|)'
1360
1557
  os_replacement: 'WatchOS'
1361
1558
 
1362
1559
  ##########################
@@ -1399,9 +1596,9 @@ os_parsers:
1399
1596
  ##########
1400
1597
  - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'
1401
1598
  os_replacement: 'Symbian OS'
1402
- - regex: '(Symbian/3).+NokiaBrowser/7\.3'
1599
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.3'
1403
1600
  os_replacement: 'Symbian^3 Anna'
1404
- - regex: '(Symbian/3).+NokiaBrowser/7\.4'
1601
+ - regex: '(Symbian/3).{1,200}NokiaBrowser/7\.4'
1405
1602
  os_replacement: 'Symbian^3 Belle'
1406
1603
  - regex: '(Symbian/3)'
1407
1604
  os_replacement: 'Symbian^3'
@@ -1418,11 +1615,11 @@ os_parsers:
1418
1615
  ##########
1419
1616
  # BlackBerry devices
1420
1617
  ##########
1421
- - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
1618
+ - regex: '(BB10);.{1,200}Version/(\d+)\.(\d+)\.(\d+)'
1422
1619
  os_replacement: 'BlackBerry OS'
1423
1620
  - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1424
1621
  os_replacement: 'BlackBerry OS'
1425
- - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1622
+ - regex: '(Black[Bb]erry).{1,200}Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+)|)'
1426
1623
  os_replacement: 'BlackBerry OS'
1427
1624
  - regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
1428
1625
  os_replacement: 'BlackBerry Tablet OS'
@@ -1440,44 +1637,44 @@ os_parsers:
1440
1637
  ##########
1441
1638
  # Firefox OS
1442
1639
  ##########
1443
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\d+\.\d+'
1640
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.0 Firefox/\d+\.\d+'
1444
1641
  os_replacement: 'Firefox OS'
1445
1642
  os_v1_replacement: '1'
1446
1643
  os_v2_replacement: '0'
1447
1644
  os_v3_replacement: '1'
1448
1645
 
1449
- - regex: '\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\d+\.\d+'
1646
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/18.1 Firefox/\d+\.\d+'
1450
1647
  os_replacement: 'Firefox OS'
1451
1648
  os_v1_replacement: '1'
1452
1649
  os_v2_replacement: '1'
1453
1650
 
1454
- - regex: '\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\d+\.\d+'
1651
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/26.0 Firefox/\d+\.\d+'
1455
1652
  os_replacement: 'Firefox OS'
1456
1653
  os_v1_replacement: '1'
1457
1654
  os_v2_replacement: '2'
1458
1655
 
1459
- - regex: '\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\d+\.\d+'
1656
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/28.0 Firefox/\d+\.\d+'
1460
1657
  os_replacement: 'Firefox OS'
1461
1658
  os_v1_replacement: '1'
1462
1659
  os_v2_replacement: '3'
1463
1660
 
1464
- - regex: '\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\d+\.\d+'
1661
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/30.0 Firefox/\d+\.\d+'
1465
1662
  os_replacement: 'Firefox OS'
1466
1663
  os_v1_replacement: '1'
1467
1664
  os_v2_replacement: '4'
1468
1665
 
1469
- - regex: '\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\d+\.\d+'
1666
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/32.0 Firefox/\d+\.\d+'
1470
1667
  os_replacement: 'Firefox OS'
1471
1668
  os_v1_replacement: '2'
1472
1669
  os_v2_replacement: '0'
1473
1670
 
1474
- - regex: '\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\d+\.\d+'
1671
+ - regex: '\((?:Mobile|Tablet);.{1,200}Gecko/34.0 Firefox/\d+\.\d+'
1475
1672
  os_replacement: 'Firefox OS'
1476
1673
  os_v1_replacement: '2'
1477
1674
  os_v2_replacement: '1'
1478
1675
 
1479
1676
  # Firefox OS Generic
1480
- - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
1677
+ - regex: '\((?:Mobile|Tablet);.{1,200}Firefox/\d+\.\d+'
1481
1678
  os_replacement: 'Firefox OS'
1482
1679
 
1483
1680
 
@@ -1519,7 +1716,7 @@ os_parsers:
1519
1716
  - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)|)(?:\.(\d+)|)'
1520
1717
 
1521
1718
  # Gentoo Linux + Kernel Version
1522
- - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).*gentoo'
1719
+ - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+)|).{0,100}gentoo'
1523
1720
  os_replacement: 'Gentoo'
1524
1721
 
1525
1722
  # Opera Mini Bada
@@ -1551,19 +1748,19 @@ device_parsers:
1551
1748
  # Mobile Spiders
1552
1749
  # Catch the mobile crawler before checking for iPhones / Androids.
1553
1750
  #########
1554
- - regex: '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)'
1751
+ - regex: '^.{0,100}?(?:(?:iPhone|Windows CE|Windows Phone|Android).{0,300}(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.{0,200}iPhone)'
1555
1752
  regex_flag: 'i'
1556
1753
  device_replacement: 'Spider'
1557
1754
  brand_replacement: 'Spider'
1558
1755
  model_replacement: 'Smartphone'
1559
- - regex: '(?:DoCoMo|\bMOT\b|\bLG\b|Nokia|Samsung|SonyEricsson).*(?:(?:Bot|Yeti)-Mobile|bots?/\d|(?:bot|crawler)\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)'
1756
+ - regex: '^.{0,100}?(?:DoCoMo|\bMOT\b|\bLG\b|Nokia|Samsung|SonyEricsson).{0,200}(?:(?:Bot|Yeti)-Mobile|bots?/\d|(?:bot|crawler)\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)'
1560
1757
  regex_flag: 'i'
1561
1758
  device_replacement: 'Spider'
1562
1759
  brand_replacement: 'Spider'
1563
1760
  model_replacement: 'Feature Phone'
1564
1761
 
1565
1762
  # PTST / WebPageTest.org crawlers
1566
- - regex: ' PTST/\d+(?:\.)?\d+$'
1763
+ - regex: ' PTST/\d+(?:\.\d+|)$'
1567
1764
  device_replacement: 'Spider'
1568
1765
  brand_replacement: 'Spider'
1569
1766
 
@@ -1572,11 +1769,21 @@ device_parsers:
1572
1769
  device_replacement: 'Spider'
1573
1770
  brand_replacement: 'Spider'
1574
1771
 
1772
+ # aspiegel.com spider (owned by Huawei)
1773
+ - regex: 'Mozilla.{1,100}Mobile.{1,100}AspiegelBot'
1774
+ device_replacement: 'Spider'
1775
+ brand_replacement: 'Spider'
1776
+ model_replacement: 'Smartphone'
1777
+ - regex: 'Mozilla.{0,200}AspiegelBot'
1778
+ device_replacement: 'Spider'
1779
+ brand_replacement: 'Spider'
1780
+ model_replacement: 'Desktop'
1781
+
1575
1782
  #########
1576
1783
  # WebBrowser for SmartWatch
1577
1784
  # @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
1578
1785
  #########
1579
- - regex: '\bSmartWatch *\( *([^;]+) *; *([^;]+) *;'
1786
+ - regex: '\bSmartWatch {0,2}\( {0,2}([^;]{1,200}) {0,2}; {0,2}([^;]{1,200}) {0,2};'
1580
1787
  device_replacement: '$1 $2'
1581
1788
  brand_replacement: '$1'
1582
1789
  model_replacement: '$2'
@@ -1588,16 +1795,16 @@ device_parsers:
1588
1795
  ######################################################################
1589
1796
 
1590
1797
  # Android Application
1591
- - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson|) (.+) \w+ - '
1798
+ - regex: 'Android Application[^\-]{1,300} - (Sony) ?(Ericsson|) (.{1,200}) \w{1,20} - '
1592
1799
  device_replacement: '$1 $2'
1593
1800
  brand_replacement: '$1$2'
1594
1801
  model_replacement: '$3'
1595
- - regex: 'Android Application[^\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.+) \w+ - '
1802
+ - regex: 'Android Application[^\-]{1,300} - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.{1,200}) \w{1,20} - '
1596
1803
  regex_flag: 'i'
1597
1804
  device_replacement: '$1 $2'
1598
1805
  brand_replacement: '$1'
1599
1806
  model_replacement: '$2'
1600
- - regex: 'Android Application[^\-]+ - ([^ ]+) (.+) \w+ - '
1807
+ - regex: 'Android Application[^\-]{1,300} - ([^ ]+) (.{1,200}) \w{1,20} - '
1601
1808
  device_replacement: '$1 $2'
1602
1809
  brand_replacement: '$1'
1603
1810
  model_replacement: '$2'
@@ -1606,11 +1813,11 @@ device_parsers:
1606
1813
  # 3Q
1607
1814
  # @ref: http://www.3q-int.com/
1608
1815
  #########
1609
- - regex: '; *([BLRQ]C\d{4}[A-Z]+?)(?: Build|\) AppleWebKit)'
1816
+ - regex: '; {0,2}([BLRQ]C\d{4}[A-Z]{1,100}?)(?: Build|\) AppleWebKit)'
1610
1817
  device_replacement: '3Q $1'
1611
1818
  brand_replacement: '3Q'
1612
1819
  model_replacement: '$1'
1613
- - regex: '; *(?:3Q_)([^;/]+?)(?: Build|\) AppleWebKit)'
1820
+ - regex: '; {0,2}(?:3Q_)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1614
1821
  device_replacement: '3Q $1'
1615
1822
  brand_replacement: '3Q'
1616
1823
  model_replacement: '$1'
@@ -1619,19 +1826,19 @@ device_parsers:
1619
1826
  # Acer
1620
1827
  # @ref: http://us.acer.com/ac/en/US/content/group/tablets
1621
1828
  #########
1622
- - regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+?)(?: Build|\) AppleWebKit)'
1829
+ - regex: 'Android [34].{0,200}; {0,2}(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1623
1830
  device_replacement: '$1'
1624
1831
  brand_replacement: 'Acer'
1625
1832
  model_replacement: '$1'
1626
- - regex: '; *Acer Iconia Tab ([^;/]+?)(?: Build|\) AppleWebKit)'
1833
+ - regex: '; {0,2}Acer Iconia Tab ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1627
1834
  device_replacement: '$1'
1628
1835
  brand_replacement: 'Acer'
1629
1836
  model_replacement: '$1'
1630
- - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+)(?: Build|\) AppleWebKit)'
1837
+ - regex: '; {0,2}(Z1[1235]0|E320[^/]{0,10}|S500|S510|Liquid[^;/]{0,30}|Iconia A\d+)(?: Build|\) AppleWebKit)'
1631
1838
  device_replacement: '$1'
1632
1839
  brand_replacement: 'Acer'
1633
1840
  model_replacement: '$1'
1634
- - regex: '; *(Acer |ACER )([^;/]+?)(?: Build|\) AppleWebKit)'
1841
+ - regex: '; {0,2}(Acer |ACER )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1635
1842
  device_replacement: '$1$2'
1636
1843
  brand_replacement: 'Acer'
1637
1844
  model_replacement: '$2'
@@ -1642,7 +1849,7 @@ device_parsers:
1642
1849
  # @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
1643
1850
  # custom ROM builds for Vega
1644
1851
  #########
1645
- - regex: '; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\) AppleWebKit)'
1852
+ - regex: '; {0,2}(Advent |)(Vega(?:Bean|Comb|)).{0,200}?(?: Build|\) AppleWebKit)'
1646
1853
  device_replacement: '$1$2'
1647
1854
  brand_replacement: 'Advent'
1648
1855
  model_replacement: '$2'
@@ -1651,7 +1858,7 @@ device_parsers:
1651
1858
  # Ainol
1652
1859
  # @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
1653
1860
  #########
1654
- - regex: '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\) AppleWebKit)'
1861
+ - regex: '; {0,2}(Ainol |)((?:NOVO|[Nn]ovo)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1655
1862
  device_replacement: '$1$2'
1656
1863
  brand_replacement: 'Ainol'
1657
1864
  model_replacement: '$2'
@@ -1660,12 +1867,12 @@ device_parsers:
1660
1867
  # Airis
1661
1868
  # @ref: http://airis.es/Tienda/Default.aspx?idG=001
1662
1869
  #########
1663
- - regex: '; *AIRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
1870
+ - regex: '; {0,2}AIRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
1664
1871
  regex_flag: 'i'
1665
1872
  device_replacement: '$1'
1666
1873
  brand_replacement: 'Airis'
1667
1874
  model_replacement: '$1'
1668
- - regex: '; *(OnePAD[^;/]+?)(?: Build|\) AppleWebKit)'
1875
+ - regex: '; {0,2}(OnePAD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1669
1876
  regex_flag: 'i'
1670
1877
  device_replacement: '$1'
1671
1878
  brand_replacement: 'Airis'
@@ -1675,7 +1882,7 @@ device_parsers:
1675
1882
  # Airpad
1676
1883
  # @ref: ??
1677
1884
  #########
1678
- - regex: '; *Airpad[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
1885
+ - regex: '; {0,2}Airpad[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1679
1886
  device_replacement: 'Airpad $1'
1680
1887
  brand_replacement: 'Airpad'
1681
1888
  model_replacement: '$1'
@@ -1684,29 +1891,29 @@ device_parsers:
1684
1891
  # Alcatel - TCT
1685
1892
  # @ref: http://www.alcatelonetouch.com/global-en/products/smartphones.html
1686
1893
  #########
1687
- - regex: '; *(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1894
+ - regex: '; {0,2}(one ?touch) (EVO7|T10|T20)(?: Build|\) AppleWebKit)'
1688
1895
  device_replacement: 'Alcatel One Touch $2'
1689
1896
  brand_replacement: 'Alcatel'
1690
1897
  model_replacement: 'One Touch $2'
1691
- - regex: '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+?)(?: Build|\) AppleWebKit)'
1898
+ - regex: '; {0,2}(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1692
1899
  regex_flag: 'i'
1693
1900
  device_replacement: 'Alcatel One Touch $1'
1694
1901
  brand_replacement: 'Alcatel'
1695
1902
  model_replacement: 'One Touch $1'
1696
- - regex: '; *(TCL)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1903
+ - regex: '; {0,2}(TCL)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1697
1904
  device_replacement: '$1 $2'
1698
1905
  brand_replacement: '$1'
1699
1906
  model_replacement: '$2'
1700
1907
  # operator specific models
1701
- - regex: '; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1908
+ - regex: '; {0,2}(Vodafone Smart II|Optimus_Madrid)(?: Build|\) AppleWebKit)'
1702
1909
  device_replacement: 'Alcatel $1'
1703
1910
  brand_replacement: 'Alcatel'
1704
1911
  model_replacement: '$1'
1705
- - regex: '; *BASE_Lutea_3(?: Build|\) AppleWebKit)'
1912
+ - regex: '; {0,2}BASE_Lutea_3(?: Build|\) AppleWebKit)'
1706
1913
  device_replacement: 'Alcatel One Touch 998'
1707
1914
  brand_replacement: 'Alcatel'
1708
1915
  model_replacement: 'One Touch 998'
1709
- - regex: '; *BASE_Varia(?: Build|\) AppleWebKit)'
1916
+ - regex: '; {0,2}BASE_Varia(?: Build|\) AppleWebKit)'
1710
1917
  device_replacement: 'Alcatel One Touch 918D'
1711
1918
  brand_replacement: 'Alcatel'
1712
1919
  model_replacement: 'One Touch 918D'
@@ -1715,7 +1922,7 @@ device_parsers:
1715
1922
  # Allfine
1716
1923
  # @ref: http://www.myallfine.com/Products.asp
1717
1924
  #########
1718
- - regex: '; *((?:FINE|Fine)\d[^;/]+?)(?: Build|\) AppleWebKit)'
1925
+ - regex: '; {0,2}((?:FINE|Fine)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1719
1926
  device_replacement: '$1'
1720
1927
  brand_replacement: 'Allfine'
1721
1928
  model_replacement: '$1'
@@ -1724,15 +1931,15 @@ device_parsers:
1724
1931
  # Allview
1725
1932
  # @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
1726
1933
  #########
1727
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\) AppleWebKit)'
1934
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).{0,200}?)(?: Build|\) AppleWebKit)'
1728
1935
  device_replacement: '$1$2'
1729
1936
  brand_replacement: 'Allview'
1730
1937
  model_replacement: '$2'
1731
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1938
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\) AppleWebKit)'
1732
1939
  device_replacement: '$1$2'
1733
1940
  brand_replacement: 'Allview'
1734
1941
  model_replacement: '$2'
1735
- - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1942
+ - regex: '; {0,2}(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\) AppleWebKit)'
1736
1943
  device_replacement: '$1$2'
1737
1944
  brand_replacement: 'Allview'
1738
1945
  model_replacement: '$2'
@@ -1742,11 +1949,11 @@ device_parsers:
1742
1949
  # @ref: http://www.allwinner.com/
1743
1950
  # @models: A31 (13.3"),A20,A10,
1744
1951
  #########
1745
- - regex: '; *(A13-MID)(?: Build|\) AppleWebKit)'
1952
+ - regex: '; {0,2}(A13-MID)(?: Build|\) AppleWebKit)'
1746
1953
  device_replacement: '$1'
1747
1954
  brand_replacement: 'Allwinner'
1748
1955
  model_replacement: '$1'
1749
- - regex: '; *(Allwinner)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
1956
+ - regex: '; {0,2}(Allwinner)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1750
1957
  device_replacement: '$1 $2'
1751
1958
  brand_replacement: 'Allwinner'
1752
1959
  model_replacement: '$1'
@@ -1755,7 +1962,7 @@ device_parsers:
1755
1962
  # Amaway
1756
1963
  # @ref: http://www.amaway.cn/
1757
1964
  #########
1758
- - regex: '; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\) AppleWebKit)'
1965
+ - regex: '; {0,2}(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\) AppleWebKit)'
1759
1966
  device_replacement: '$1'
1760
1967
  brand_replacement: 'Amaway'
1761
1968
  model_replacement: '$1'
@@ -1764,11 +1971,11 @@ device_parsers:
1764
1971
  # Amoi
1765
1972
  # @ref: http://www.amoi.com/en/prd/prd_index.jspx
1766
1973
  #########
1767
- - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
1974
+ - regex: '; {0,2}(?:AMOI|Amoi)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1768
1975
  device_replacement: 'Amoi $1'
1769
1976
  brand_replacement: 'Amoi'
1770
1977
  model_replacement: '$1'
1771
- - regex: '^(?:AMOI|Amoi)[ _]([^;/]+?) Linux'
1978
+ - regex: '^(?:AMOI|Amoi)[ _]([^;/]{1,100}?) Linux'
1772
1979
  device_replacement: 'Amoi $1'
1773
1980
  brand_replacement: 'Amoi'
1774
1981
  model_replacement: '$1'
@@ -1777,7 +1984,7 @@ device_parsers:
1777
1984
  # Aoc
1778
1985
  # @ref: http://latin.aoc.com/media_tablet
1779
1986
  #########
1780
- - regex: '; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\) AppleWebKit)'
1987
+ - regex: '; {0,2}(MW(?:0[789]|10)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1781
1988
  device_replacement: '$1'
1782
1989
  brand_replacement: 'Aoc'
1783
1990
  model_replacement: '$1'
@@ -1788,11 +1995,11 @@ device_parsers:
1788
1995
  # @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
1789
1996
  # @note: brand owned by luckystar
1790
1997
  #########
1791
- - regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\) AppleWebKit)'
1998
+ - regex: '; {0,2}(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\) AppleWebKit)'
1792
1999
  device_replacement: 'Aoson $1'
1793
2000
  brand_replacement: 'Aoson'
1794
2001
  model_replacement: '$1'
1795
- - regex: '; *Aoson ([^;/]+?)(?: Build|\) AppleWebKit)'
2002
+ - regex: '; {0,2}Aoson ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1796
2003
  regex_flag: 'i'
1797
2004
  device_replacement: 'Aoson $1'
1798
2005
  brand_replacement: 'Aoson'
@@ -1802,7 +2009,7 @@ device_parsers:
1802
2009
  # Apanda
1803
2010
  # @ref: http://www.apanda.com.cn/
1804
2011
  #########
1805
- - regex: '; *[Aa]panda[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2012
+ - regex: '; {0,2}[Aa]panda[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1806
2013
  device_replacement: 'Apanda $1'
1807
2014
  brand_replacement: 'Apanda'
1808
2015
  model_replacement: '$1'
@@ -1812,23 +2019,23 @@ device_parsers:
1812
2019
  # @ref: http://www.archos.com/de/products/tablets.html
1813
2020
  # @ref: http://www.archos.com/de/products/smartphones/index.html
1814
2021
  #########
1815
- - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\) AppleWebKit)'
2022
+ - regex: '; {0,2}(?:ARCHOS|Archos) ?(GAMEPAD.{0,200}?)(?: Build|\) AppleWebKit)'
1816
2023
  device_replacement: 'Archos $1'
1817
2024
  brand_replacement: 'Archos'
1818
2025
  model_replacement: '$1'
1819
- - regex: 'ARCHOS; GOGI; ([^;]+);'
2026
+ - regex: 'ARCHOS; GOGI; ([^;]{1,200});'
1820
2027
  device_replacement: 'Archos $1'
1821
2028
  brand_replacement: 'Archos'
1822
2029
  model_replacement: '$1'
1823
- - regex: '(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\(\)\-]|$)'
2030
+ - regex: '(?:ARCHOS|Archos)[ _]?(.{0,200}?)(?: Build|[;/\(\)\-]|$)'
1824
2031
  device_replacement: 'Archos $1'
1825
2032
  brand_replacement: 'Archos'
1826
2033
  model_replacement: '$1'
1827
- - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
2034
+ - regex: '; {0,2}(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\) AppleWebKit)'
1828
2035
  device_replacement: 'Archos $1'
1829
2036
  brand_replacement: 'Archos'
1830
2037
  model_replacement: '$1'
1831
- - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
2038
+ - regex: '; {0,2}(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\) AppleWebKit)'
1832
2039
  device_replacement: 'Archos $1'
1833
2040
  brand_replacement: 'Archos'
1834
2041
  model_replacement: '$1'
@@ -1837,11 +2044,11 @@ device_parsers:
1837
2044
  # A-rival
1838
2045
  # @ref: http://www.a-rival.de/de/
1839
2046
  #########
1840
- - regex: '; *(PAD-FMD[^;/]+?)(?: Build|\) AppleWebKit)'
2047
+ - regex: '; {0,2}(PAD-FMD[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1841
2048
  device_replacement: '$1'
1842
2049
  brand_replacement: 'Arival'
1843
2050
  model_replacement: '$1'
1844
- - regex: '; *(BioniQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
2051
+ - regex: '; {0,2}(BioniQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1845
2052
  device_replacement: '$1 $2'
1846
2053
  brand_replacement: 'Arival'
1847
2054
  model_replacement: '$1 $2'
@@ -1850,11 +2057,11 @@ device_parsers:
1850
2057
  # Arnova
1851
2058
  # @ref: http://arnovatech.com/
1852
2059
  #########
1853
- - regex: '; *(AN\d[^;/]+|ARCHM\d+)(?: Build|\) AppleWebKit)'
2060
+ - regex: '; {0,2}(AN\d[^;/]{1,100}|ARCHM\d+)(?: Build|\) AppleWebKit)'
1854
2061
  device_replacement: 'Arnova $1'
1855
2062
  brand_replacement: 'Arnova'
1856
2063
  model_replacement: '$1'
1857
- - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\) AppleWebKit)'
2064
+ - regex: '; {0,2}(?:ARNOVA|Arnova) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1858
2065
  device_replacement: 'Arnova $1'
1859
2066
  brand_replacement: 'Arnova'
1860
2067
  model_replacement: '$1'
@@ -1863,7 +2070,7 @@ device_parsers:
1863
2070
  # Assistant
1864
2071
  # @ref: http://www.assistant.ua
1865
2072
  #########
1866
- - regex: '; *(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
2073
+ - regex: '; {0,2}(?:ASSISTANT |)(AP)-?([1789]\d{2}[A-Z]{0,2}|80104)(?: Build|\) AppleWebKit)'
1867
2074
  device_replacement: 'Assistant $1-$2'
1868
2075
  brand_replacement: 'Assistant'
1869
2076
  model_replacement: '$1-$2'
@@ -1872,11 +2079,11 @@ device_parsers:
1872
2079
  # Asus
1873
2080
  # @ref: http://www.asus.com/uk/Tablets_Mobile/
1874
2081
  #########
1875
- - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
2082
+ - regex: '; {0,2}(ME17\d[^;/]*|ME3\d{2}[^;/]{1,100}|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc)(?: Build|\) AppleWebKit)'
1876
2083
  device_replacement: 'Asus $1'
1877
2084
  brand_replacement: 'Asus'
1878
2085
  model_replacement: '$1'
1879
- - regex: '; *ASUS[ _]*([^;/]+?)(?: Build|\) AppleWebKit)'
2086
+ - regex: '; {0,2}ASUS[ _]{0,10}([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1880
2087
  device_replacement: 'Asus $1'
1881
2088
  brand_replacement: 'Asus'
1882
2089
  model_replacement: '$1'
@@ -1884,11 +2091,11 @@ device_parsers:
1884
2091
  #########
1885
2092
  # Garmin-Asus
1886
2093
  #########
1887
- - regex: '; *Garmin-Asus ([^;/]+?)(?: Build|\) AppleWebKit)'
2094
+ - regex: '; {0,2}Garmin-Asus ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1888
2095
  device_replacement: 'Garmin-Asus $1'
1889
2096
  brand_replacement: 'Garmin-Asus'
1890
2097
  model_replacement: '$1'
1891
- - regex: '; *(Garminfone)(?: Build|\) AppleWebKit)'
2098
+ - regex: '; {0,2}(Garminfone)(?: Build|\) AppleWebKit)'
1892
2099
  device_replacement: 'Garmin $1'
1893
2100
  brand_replacement: 'Garmin-Asus'
1894
2101
  model_replacement: '$1'
@@ -1897,7 +2104,7 @@ device_parsers:
1897
2104
  # Attab
1898
2105
  # @ref: http://www.theattab.com/
1899
2106
  #########
1900
- - regex: '; (@TAB-[^;/]+?)(?: Build|\) AppleWebKit)'
2107
+ - regex: '; (@TAB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1901
2108
  device_replacement: '$1'
1902
2109
  brand_replacement: 'Attab'
1903
2110
  model_replacement: '$1'
@@ -1907,7 +2114,7 @@ device_parsers:
1907
2114
  # @ref: ??
1908
2115
  # @note: Take care with Docomo T-01 Toshiba
1909
2116
  #########
1910
- - regex: '; *(T-(?:07|[^0]\d)[^;/]+?)(?: Build|\) AppleWebKit)'
2117
+ - regex: '; {0,2}(T-(?:07|[^0]\d)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1911
2118
  device_replacement: '$1'
1912
2119
  brand_replacement: 'Audiosonic'
1913
2120
  model_replacement: '$1'
@@ -1916,7 +2123,7 @@ device_parsers:
1916
2123
  # Axioo
1917
2124
  # @ref: http://www.axiooworld.com/ww/index.php
1918
2125
  #########
1919
- - regex: '; *(?:Axioo[ _\-]([^;/]+?)|(picopad)[ _\-]([^;/]+?))(?: Build|\) AppleWebKit)'
2126
+ - regex: '; {0,2}(?:Axioo[ _\-]([^;/]{1,100}?)|(picopad)[ _\-]([^;/]{1,100}?))(?: Build|\) AppleWebKit)'
1920
2127
  regex_flag: 'i'
1921
2128
  device_replacement: 'Axioo $1$2 $3'
1922
2129
  brand_replacement: 'Axioo'
@@ -1926,7 +2133,7 @@ device_parsers:
1926
2133
  # Azend
1927
2134
  # @ref: http://azendcorp.com/index.php/products/portable-electronics
1928
2135
  #########
1929
- - regex: '; *(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
2136
+ - regex: '; {0,2}(V(?:100|700|800)[^;/]*)(?: Build|\) AppleWebKit)'
1930
2137
  device_replacement: '$1'
1931
2138
  brand_replacement: 'Azend'
1932
2139
  model_replacement: '$1'
@@ -1935,7 +2142,7 @@ device_parsers:
1935
2142
  # Bak
1936
2143
  # @ref: http://www.bakinternational.com/produtos.php?cat=80
1937
2144
  #########
1938
- - regex: '; *(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
2145
+ - regex: '; {0,2}(IBAK\-[^;/]*)(?: Build|\) AppleWebKit)'
1939
2146
  regex_flag: 'i'
1940
2147
  device_replacement: '$1'
1941
2148
  brand_replacement: 'Bak'
@@ -1946,7 +2153,7 @@ device_parsers:
1946
2153
  # @ref: http://www.bedove.com/product.html
1947
2154
  # @models: HY6501|HY5001|X12|X21|I5
1948
2155
  #########
1949
- - regex: '; *(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
2156
+ - regex: '; {0,2}(HY5001|HY6501|X12|X21|I5)(?: Build|\) AppleWebKit)'
1950
2157
  device_replacement: 'Bedove $1'
1951
2158
  brand_replacement: 'Bedove'
1952
2159
  model_replacement: '$1'
@@ -1955,7 +2162,7 @@ device_parsers:
1955
2162
  # Benss
1956
2163
  # @ref: http://www.benss.net/
1957
2164
  #########
1958
- - regex: '; *(JC-[^;/]*)(?: Build|\) AppleWebKit)'
2165
+ - regex: '; {0,2}(JC-[^;/]*)(?: Build|\) AppleWebKit)'
1959
2166
  device_replacement: 'Benss $1'
1960
2167
  brand_replacement: 'Benss'
1961
2168
  model_replacement: '$1'
@@ -1965,7 +2172,7 @@ device_parsers:
1965
2172
  # @ref: http://uk.blackberry.com/
1966
2173
  # @note: Android Apps seams to be used here
1967
2174
  #########
1968
- - regex: '; *(BB) ([^;/]+?)(?: Build|\) AppleWebKit)'
2175
+ - regex: '; {0,2}(BB) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1969
2176
  device_replacement: '$1 $2'
1970
2177
  brand_replacement: 'Blackberry'
1971
2178
  model_replacement: '$2'
@@ -1974,11 +2181,11 @@ device_parsers:
1974
2181
  # Blackbird
1975
2182
  # @ref: http://iblackbird.co.kr
1976
2183
  #########
1977
- - regex: '; *(BlackBird)[ _](I8.*?)(?: Build|\) AppleWebKit)'
2184
+ - regex: '; {0,2}(BlackBird)[ _](I8.{0,200}?)(?: Build|\) AppleWebKit)'
1978
2185
  device_replacement: '$1 $2'
1979
2186
  brand_replacement: '$1'
1980
2187
  model_replacement: '$2'
1981
- - regex: '; *(BlackBird)[ _](.*?)(?: Build|\) AppleWebKit)'
2188
+ - regex: '; {0,2}(BlackBird)[ _](.{0,200}?)(?: Build|\) AppleWebKit)'
1982
2189
  device_replacement: '$1 $2'
1983
2190
  brand_replacement: '$1'
1984
2191
  model_replacement: '$2'
@@ -1988,7 +2195,7 @@ device_parsers:
1988
2195
  # @ref: http://www.blaupunkt.com
1989
2196
  #########
1990
2197
  # Endeavour
1991
- - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\) AppleWebKit)'
2198
+ - regex: '; {0,2}([0-9]+BP[EM][^;/]*|Endeavour[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
1992
2199
  device_replacement: 'Blaupunkt $1'
1993
2200
  brand_replacement: 'Blaupunkt'
1994
2201
  model_replacement: '$1'
@@ -1997,12 +2204,12 @@ device_parsers:
1997
2204
  # Blu
1998
2205
  # @ref: http://bluproducts.com
1999
2206
  #########
2000
- - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
2207
+ - regex: '; {0,2}((?:BLU|Blu)[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2001
2208
  device_replacement: '$1$2'
2002
2209
  brand_replacement: 'Blu'
2003
2210
  model_replacement: '$2'
2004
2211
  # BMOBILE = operator branded device
2005
- - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
2212
+ - regex: '; {0,2}(?:BMOBILE )?(Blu|BLU|DASH [^;/]{1,100}|VIVO 4\.3|TANK 4\.5)(?: Build|\) AppleWebKit)'
2006
2213
  device_replacement: '$1'
2007
2214
  brand_replacement: 'Blu'
2008
2215
  model_replacement: '$1'
@@ -2012,7 +2219,7 @@ device_parsers:
2012
2219
  # @ref: http://www.blusens.com/es/?sg=1&sv=al&roc=1
2013
2220
  #########
2014
2221
  # tablet
2015
- - regex: '; *(TOUCH\d[^;/]+?)(?: Build|\) AppleWebKit)'
2222
+ - regex: '; {0,2}(TOUCH\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2016
2223
  device_replacement: '$1'
2017
2224
  brand_replacement: 'Blusens'
2018
2225
  model_replacement: '$1'
@@ -2023,7 +2230,7 @@ device_parsers:
2023
2230
  # @note: Might collide with Maxx as AX is used also there.
2024
2231
  #########
2025
2232
  # smartphone
2026
- - regex: '; *(AX5\d+)(?: Build|\) AppleWebKit)'
2233
+ - regex: '; {0,2}(AX5\d+)(?: Build|\) AppleWebKit)'
2027
2234
  device_replacement: '$1'
2028
2235
  brand_replacement: 'Bmobile'
2029
2236
  model_replacement: '$1'
@@ -2032,11 +2239,11 @@ device_parsers:
2032
2239
  # bq
2033
2240
  # @ref: http://bqreaders.com
2034
2241
  #########
2035
- - regex: '; *([Bb]q) ([^;/]+?);?(?: Build|\) AppleWebKit)'
2242
+ - regex: '; {0,2}([Bb]q) ([^;/]{1,100}?);?(?: Build|\) AppleWebKit)'
2036
2243
  device_replacement: '$1 $2'
2037
2244
  brand_replacement: 'bq'
2038
2245
  model_replacement: '$2'
2039
- - regex: '; *(Maxwell [^;/]+?)(?: Build|\) AppleWebKit)'
2246
+ - regex: '; {0,2}(Maxwell [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2040
2247
  device_replacement: '$1'
2041
2248
  brand_replacement: 'bq'
2042
2249
  model_replacement: '$1'
@@ -2045,7 +2252,7 @@ device_parsers:
2045
2252
  # Braun Phototechnik
2046
2253
  # @ref: http://www.braun-phototechnik.de/en/products/list/~pcat.250/Tablet-PC.html
2047
2254
  #########
2048
- - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+?)(?: Build|\) AppleWebKit)'
2255
+ - regex: '; {0,2}((?:B-Tab|B-TAB) ?\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2049
2256
  device_replacement: '$1'
2050
2257
  brand_replacement: 'Braun'
2051
2258
  model_replacement: '$1'
@@ -2054,7 +2261,7 @@ device_parsers:
2054
2261
  # Broncho
2055
2262
  # @ref: http://www.broncho.cn/
2056
2263
  #########
2057
- - regex: '; *(Broncho) ([^;/]+?)(?: Build|\) AppleWebKit)'
2264
+ - regex: '; {0,2}(Broncho) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2058
2265
  device_replacement: '$1 $2'
2059
2266
  brand_replacement: '$1'
2060
2267
  model_replacement: '$2'
@@ -2063,7 +2270,7 @@ device_parsers:
2063
2270
  # Captiva
2064
2271
  # @ref: http://www.captiva-power.de
2065
2272
  #########
2066
- - regex: '; *CAPTIVA ([^;/]+?)(?: Build|\) AppleWebKit)'
2273
+ - regex: '; {0,2}CAPTIVA ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2067
2274
  device_replacement: 'Captiva $1'
2068
2275
  brand_replacement: 'Captiva'
2069
2276
  model_replacement: '$1'
@@ -2072,7 +2279,7 @@ device_parsers:
2072
2279
  # Casio
2073
2280
  # @ref: http://www.casiogzone.com/
2074
2281
  #########
2075
- - regex: '; *(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2282
+ - regex: '; {0,2}(C771|CAL21|IS11CA)(?: Build|\) AppleWebKit)'
2076
2283
  device_replacement: '$1'
2077
2284
  brand_replacement: 'Casio'
2078
2285
  model_replacement: '$1'
@@ -2081,15 +2288,15 @@ device_parsers:
2081
2288
  # Cat
2082
2289
  # @ref: http://www.cat-sound.com
2083
2290
  #########
2084
- - regex: '; *(?:Cat|CAT) ([^;/]+?)(?: Build|\) AppleWebKit)'
2291
+ - regex: '; {0,2}(?:Cat|CAT) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2085
2292
  device_replacement: 'Cat $1'
2086
2293
  brand_replacement: 'Cat'
2087
2294
  model_replacement: '$1'
2088
- - regex: '; *(?:Cat)(Nova.*?)(?: Build|\) AppleWebKit)'
2295
+ - regex: '; {0,2}(?:Cat)(Nova.{0,200}?)(?: Build|\) AppleWebKit)'
2089
2296
  device_replacement: 'Cat $1'
2090
2297
  brand_replacement: 'Cat'
2091
2298
  model_replacement: '$1'
2092
- - regex: '; *(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2299
+ - regex: '; {0,2}(INM8002KP|ADM8000KP_[AB])(?: Build|\) AppleWebKit)'
2093
2300
  device_replacement: '$1'
2094
2301
  brand_replacement: 'Cat'
2095
2302
  model_replacement: 'Tablet PHOENIX 8.1J0'
@@ -2099,7 +2306,7 @@ device_parsers:
2099
2306
  # @ref: http://www.celkonmobiles.com/?_a=products
2100
2307
  # @models: A10, A19Q, A101, A105, A107, A107\+, A112, A118, A119, A119Q, A15, A19, A20, A200, A220, A225, A22 Race, A27, A58, A59, A60, A62, A63, A64, A66, A67, A69, A75, A77, A79, A8\+, A83, A85, A86, A87, A89 Ultima, A9\+, A90, A900, A95, A97i, A98, AR 40, AR 45, AR 50, ML5
2101
2308
  #########
2102
- - regex: '; *(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2309
+ - regex: '; {0,2}(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
2103
2310
  device_replacement: '$1'
2104
2311
  brand_replacement: 'Celkon'
2105
2312
  model_replacement: '$1'
@@ -2107,12 +2314,12 @@ device_parsers:
2107
2314
  device_replacement: '$1'
2108
2315
  brand_replacement: 'Celkon'
2109
2316
  model_replacement: '$1'
2110
- - regex: '; *(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2317
+ - regex: '; {0,2}(CT)-?(\d+)(?: Build|\) AppleWebKit)'
2111
2318
  device_replacement: '$1$2'
2112
2319
  brand_replacement: 'Celkon'
2113
2320
  model_replacement: '$1$2'
2114
2321
  # smartphones
2115
- - regex: '; *(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2322
+ - regex: '; {0,2}(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
2116
2323
  device_replacement: '$1'
2117
2324
  brand_replacement: 'Celkon'
2118
2325
  model_replacement: '$1'
@@ -2123,7 +2330,7 @@ device_parsers:
2123
2330
  # @brief: China manufacturer makes tablets for different small brands
2124
2331
  # (eg. http://www.zeepad.net/index.html)
2125
2332
  #########
2126
- - regex: '; *(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2333
+ - regex: '; {0,2}(TPC[0-9]{4,5})(?: Build|\) AppleWebKit)'
2127
2334
  device_replacement: '$1'
2128
2335
  brand_replacement: 'ChangJia'
2129
2336
  model_replacement: '$1'
@@ -2132,15 +2339,15 @@ device_parsers:
2132
2339
  # Cloudfone
2133
2340
  # @ref: http://www.cloudfonemobile.com/
2134
2341
  #########
2135
- - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\) AppleWebKit)'
2342
+ - regex: '; {0,2}(Cloudfone)[ _](Excite)([^ ][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2136
2343
  device_replacement: '$1 $2 $3'
2137
2344
  brand_replacement: 'Cloudfone'
2138
2345
  model_replacement: '$1 $2 $3'
2139
- - regex: '; *(Excite|ICE)[ _](\d+[^;/]+?)(?: Build|\) AppleWebKit)'
2346
+ - regex: '; {0,2}(Excite|ICE)[ _](\d+[^;/]{0,100}?)(?: Build|\) AppleWebKit)'
2140
2347
  device_replacement: 'Cloudfone $1 $2'
2141
2348
  brand_replacement: 'Cloudfone'
2142
2349
  model_replacement: 'Cloudfone $1 $2'
2143
- - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2350
+ - regex: '; {0,2}(Cloudfone|CloudPad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2144
2351
  device_replacement: '$1 $2'
2145
2352
  brand_replacement: 'Cloudfone'
2146
2353
  model_replacement: '$1 $2'
@@ -2149,7 +2356,7 @@ device_parsers:
2149
2356
  # Cmx
2150
2357
  # @ref: http://cmx.at/de/
2151
2358
  #########
2152
- - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\) AppleWebKit)'
2359
+ - regex: '; {0,2}((?:Aquila|Clanga|Rapax)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2153
2360
  regex_flag: 'i'
2154
2361
  device_replacement: '$1'
2155
2362
  brand_replacement: 'Cmx'
@@ -2160,7 +2367,7 @@ device_parsers:
2160
2367
  # @ref: http://cobykyros.com
2161
2368
  # @note: Be careful with MID\d{3} from MpMan or Manta
2162
2369
  #########
2163
- - regex: '; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\)])'
2370
+ - regex: '; {0,2}(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? {0,2}(?:Build|[;\)])'
2164
2371
  device_replacement: 'CobyKyros $1$2'
2165
2372
  brand_replacement: 'CobyKyros'
2166
2373
  model_replacement: '$1$2'
@@ -2169,7 +2376,7 @@ device_parsers:
2169
2376
  # Coolpad
2170
2377
  # @ref: ??
2171
2378
  #########
2172
- - regex: '; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2379
+ - regex: '; {0,2}([^;/]{0,50})Coolpad[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2173
2380
  device_replacement: '$1$2'
2174
2381
  brand_replacement: 'Coolpad'
2175
2382
  model_replacement: '$1$2'
@@ -2178,7 +2385,7 @@ device_parsers:
2178
2385
  # Cube
2179
2386
  # @ref: http://www.cube-tablet.com/buy-products.html
2180
2387
  #########
2181
- - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\) AppleWebKit)'
2388
+ - regex: '; {0,2}(CUBE[ _])?([KU][0-9]+ ?GT.{0,200}?|A5300)(?: Build|\) AppleWebKit)'
2182
2389
  regex_flag: 'i'
2183
2390
  device_replacement: '$1$2'
2184
2391
  brand_replacement: 'Cube'
@@ -2188,12 +2395,12 @@ device_parsers:
2188
2395
  # Cubot
2189
2396
  # @ref: http://www.cubotmall.com/
2190
2397
  #########
2191
- - regex: '; *CUBOT ([^;/]+?)(?: Build|\) AppleWebKit)'
2398
+ - regex: '; {0,2}CUBOT ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2192
2399
  regex_flag: 'i'
2193
2400
  device_replacement: '$1'
2194
2401
  brand_replacement: 'Cubot'
2195
2402
  model_replacement: '$1'
2196
- - regex: '; *(BOBBY)(?: Build|\) AppleWebKit)'
2403
+ - regex: '; {0,2}(BOBBY)(?: Build|\) AppleWebKit)'
2197
2404
  regex_flag: 'i'
2198
2405
  device_replacement: '$1'
2199
2406
  brand_replacement: 'Cubot'
@@ -2203,7 +2410,7 @@ device_parsers:
2203
2410
  # Danew
2204
2411
  # @ref: http://www.danew.com/produits-tablette.php
2205
2412
  #########
2206
- - regex: '; *(Dslide [^;/]+?)(?: Build|\) AppleWebKit)'
2413
+ - regex: '; {0,2}(Dslide [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2207
2414
  device_replacement: '$1'
2208
2415
  brand_replacement: 'Danew'
2209
2416
  model_replacement: '$1'
@@ -2217,39 +2424,39 @@ device_parsers:
2217
2424
  # @ref: http://www.dell.com/in/p/mobile-xcd28/pd
2218
2425
  # @ref: http://www.dell.com/in/p/mobile-xcd35/pd
2219
2426
  #########
2220
- - regex: '; *(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2427
+ - regex: '; {0,2}(XCD)[ _]?(28|35)(?: Build|\) AppleWebKit)'
2221
2428
  device_replacement: 'Dell $1$2'
2222
2429
  brand_replacement: 'Dell'
2223
2430
  model_replacement: '$1$2'
2224
- - regex: '; *(001DL)(?: Build|\) AppleWebKit)'
2431
+ - regex: '; {0,2}(001DL)(?: Build|\) AppleWebKit)'
2225
2432
  device_replacement: 'Dell $1'
2226
2433
  brand_replacement: 'Dell'
2227
2434
  model_replacement: 'Streak'
2228
- - regex: '; *(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2435
+ - regex: '; {0,2}(?:Dell|DELL) (Streak)(?: Build|\) AppleWebKit)'
2229
2436
  device_replacement: 'Dell $1'
2230
2437
  brand_replacement: 'Dell'
2231
2438
  model_replacement: 'Streak'
2232
- - regex: '; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\) AppleWebKit)'
2439
+ - regex: '; {0,2}(101DL|GS01|Streak Pro[^;/]{0,100})(?: Build|\) AppleWebKit)'
2233
2440
  device_replacement: 'Dell $1'
2234
2441
  brand_replacement: 'Dell'
2235
2442
  model_replacement: 'Streak Pro'
2236
- - regex: '; *([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2443
+ - regex: '; {0,2}([Ss]treak ?7)(?: Build|\) AppleWebKit)'
2237
2444
  device_replacement: 'Dell $1'
2238
2445
  brand_replacement: 'Dell'
2239
2446
  model_replacement: 'Streak 7'
2240
- - regex: '; *(Mini-3iX)(?: Build|\) AppleWebKit)'
2447
+ - regex: '; {0,2}(Mini-3iX)(?: Build|\) AppleWebKit)'
2241
2448
  device_replacement: 'Dell $1'
2242
2449
  brand_replacement: 'Dell'
2243
2450
  model_replacement: '$1'
2244
- - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2451
+ - regex: '; {0,2}(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.{0,200}?|Streak[ _]Pro)(?: Build|\) AppleWebKit)'
2245
2452
  device_replacement: 'Dell $1'
2246
2453
  brand_replacement: 'Dell'
2247
2454
  model_replacement: '$1'
2248
- - regex: '; *Dell[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2455
+ - regex: '; {0,2}Dell[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2249
2456
  device_replacement: 'Dell $1'
2250
2457
  brand_replacement: 'Dell'
2251
2458
  model_replacement: '$1'
2252
- - regex: '; *Dell ([^;/]+?)(?: Build|\) AppleWebKit)'
2459
+ - regex: '; {0,2}Dell ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2253
2460
  device_replacement: 'Dell $1'
2254
2461
  brand_replacement: 'Dell'
2255
2462
  model_replacement: '$1'
@@ -2258,7 +2465,7 @@ device_parsers:
2258
2465
  # Denver
2259
2466
  # @ref: http://www.denver-electronics.com/tablets1/
2260
2467
  #########
2261
- - regex: '; *(TA[CD]-\d+[^;/]*)(?: Build|\) AppleWebKit)'
2468
+ - regex: '; {0,2}(TA[CD]-\d+[^;/]{0,100})(?: Build|\) AppleWebKit)'
2262
2469
  device_replacement: '$1'
2263
2470
  brand_replacement: 'Denver'
2264
2471
  model_replacement: '$1'
@@ -2267,7 +2474,7 @@ device_parsers:
2267
2474
  # Dex
2268
2475
  # @ref: http://dex.ua/
2269
2476
  #########
2270
- - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2477
+ - regex: '; {0,2}(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?)(?: Build|\) AppleWebKit)'
2271
2478
  device_replacement: '$1'
2272
2479
  brand_replacement: 'Dex'
2273
2480
  model_replacement: '$1'
@@ -2276,7 +2483,7 @@ device_parsers:
2276
2483
  # DNS AirTab
2277
2484
  # @ref: http://www.dns-shop.ru/
2278
2485
  #########
2279
- - regex: '; *(AirTab)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2486
+ - regex: '; {0,2}(AirTab)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2280
2487
  device_replacement: '$1 $2'
2281
2488
  brand_replacement: 'DNS'
2282
2489
  model_replacement: '$1 $2'
@@ -2285,43 +2492,43 @@ device_parsers:
2285
2492
  # Docomo (Operator Branded Device)
2286
2493
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2287
2494
  #########
2288
- - regex: '; *(F\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2495
+ - regex: '; {0,2}(F\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2289
2496
  device_replacement: '$1'
2290
2497
  brand_replacement: 'Fujitsu'
2291
2498
  model_replacement: '$1'
2292
- - regex: '; *(HT-03A)(?: Build|\) AppleWebKit)'
2499
+ - regex: '; {0,2}(HT-03A)(?: Build|\) AppleWebKit)'
2293
2500
  device_replacement: '$1'
2294
2501
  brand_replacement: 'HTC'
2295
2502
  model_replacement: 'Magic'
2296
- - regex: '; *(HT\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2503
+ - regex: '; {0,2}(HT\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2297
2504
  device_replacement: '$1'
2298
2505
  brand_replacement: 'HTC'
2299
2506
  model_replacement: '$1'
2300
- - regex: '; *(L\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2507
+ - regex: '; {0,2}(L\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2301
2508
  device_replacement: '$1'
2302
2509
  brand_replacement: 'LG'
2303
2510
  model_replacement: '$1'
2304
- - regex: '; *(N\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2511
+ - regex: '; {0,2}(N\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2305
2512
  device_replacement: '$1'
2306
2513
  brand_replacement: 'Nec'
2307
2514
  model_replacement: '$1'
2308
- - regex: '; *(P\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2515
+ - regex: '; {0,2}(P\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2309
2516
  device_replacement: '$1'
2310
2517
  brand_replacement: 'Panasonic'
2311
2518
  model_replacement: '$1'
2312
- - regex: '; *(SC\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2519
+ - regex: '; {0,2}(SC\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2313
2520
  device_replacement: '$1'
2314
2521
  brand_replacement: 'Samsung'
2315
2522
  model_replacement: '$1'
2316
- - regex: '; *(SH\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2523
+ - regex: '; {0,2}(SH\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2317
2524
  device_replacement: '$1'
2318
2525
  brand_replacement: 'Sharp'
2319
2526
  model_replacement: '$1'
2320
- - regex: '; *(SO\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
2527
+ - regex: '; {0,2}(SO\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2321
2528
  device_replacement: '$1'
2322
2529
  brand_replacement: 'SonyEricsson'
2323
2530
  model_replacement: '$1'
2324
- - regex: '; *(T\-0[12][^;/]+?)(?: Build|\) AppleWebKit)'
2531
+ - regex: '; {0,2}(T\-0[12][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2325
2532
  device_replacement: '$1'
2326
2533
  brand_replacement: 'Toshiba'
2327
2534
  model_replacement: '$1'
@@ -2330,7 +2537,7 @@ device_parsers:
2330
2537
  # DOOV
2331
2538
  # @ref: http://www.doov.com.cn/
2332
2539
  #########
2333
- - regex: '; *(DOOV)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2540
+ - regex: '; {0,2}(DOOV)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2334
2541
  device_replacement: '$1 $2'
2335
2542
  brand_replacement: 'DOOV'
2336
2543
  model_replacement: '$2'
@@ -2339,7 +2546,7 @@ device_parsers:
2339
2546
  # Enot
2340
2547
  # @ref: http://www.enot.ua/
2341
2548
  #########
2342
- - regex: '; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\) AppleWebKit)'
2549
+ - regex: '; {0,2}(Enot|ENOT)[ -]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2343
2550
  device_replacement: '$1 $2'
2344
2551
  brand_replacement: 'Enot'
2345
2552
  model_replacement: '$2'
@@ -2348,11 +2555,11 @@ device_parsers:
2348
2555
  # Evercoss
2349
2556
  # @ref: http://evercoss.com/android/
2350
2557
  #########
2351
- - regex: '; *[^;/]+ Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2558
+ - regex: '; {0,2}[^;/]{1,100} Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
2352
2559
  device_replacement: 'CROSS $1'
2353
2560
  brand_replacement: 'Evercoss'
2354
2561
  model_replacement: 'Cross $1'
2355
- - regex: '; *(CROSS|Cross)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
2562
+ - regex: '; {0,2}(CROSS|Cross)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2356
2563
  device_replacement: '$1 $2'
2357
2564
  brand_replacement: 'Evercoss'
2358
2565
  model_replacement: 'Cross $2'
@@ -2361,7 +2568,7 @@ device_parsers:
2361
2568
  # Explay
2362
2569
  # @ref: http://explay.ru/
2363
2570
  #########
2364
- - regex: '; *Explay[_ ](.+?)(?:[\)]| Build)'
2571
+ - regex: '; {0,2}Explay[_ ](.{1,200}?)(?:[\)]| Build)'
2365
2572
  device_replacement: '$1'
2366
2573
  brand_replacement: 'Explay'
2367
2574
  model_replacement: '$1'
@@ -2370,11 +2577,11 @@ device_parsers:
2370
2577
  # Fly
2371
2578
  # @ref: http://www.fly-phone.com/
2372
2579
  #########
2373
- - regex: '; *(IQ.*?)(?: Build|\) AppleWebKit)'
2580
+ - regex: '; {0,2}(IQ.{0,200}?)(?: Build|\) AppleWebKit)'
2374
2581
  device_replacement: '$1'
2375
2582
  brand_replacement: 'Fly'
2376
2583
  model_replacement: '$1'
2377
- - regex: '; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\d+[^;]*?);?(?: Build|\) AppleWebKit)'
2584
+ - regex: '; {0,2}(Fly|FLY)[ _](IQ[^;]{1,100}?|F[34]\d+[^;]{0,100}?);?(?: Build|\) AppleWebKit)'
2378
2585
  device_replacement: '$1 $2'
2379
2586
  brand_replacement: 'Fly'
2380
2587
  model_replacement: '$2'
@@ -2383,7 +2590,7 @@ device_parsers:
2383
2590
  # Fujitsu
2384
2591
  # @ref: http://www.fujitsu.com/global/
2385
2592
  #########
2386
- - regex: '; *(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2593
+ - regex: '; {0,2}(M532|Q572|FJL21)(?: Build|\) AppleWebKit)'
2387
2594
  device_replacement: '$1'
2388
2595
  brand_replacement: 'Fujitsu'
2389
2596
  model_replacement: '$1'
@@ -2392,7 +2599,7 @@ device_parsers:
2392
2599
  # Galapad
2393
2600
  # @ref: http://www.galapad.net/product.html
2394
2601
  #########
2395
- - regex: '; *(G1)(?: Build|\) AppleWebKit)'
2602
+ - regex: '; {0,2}(G1)(?: Build|\) AppleWebKit)'
2396
2603
  device_replacement: '$1'
2397
2604
  brand_replacement: 'Galapad'
2398
2605
  model_replacement: '$1'
@@ -2401,7 +2608,7 @@ device_parsers:
2401
2608
  # Geeksphone
2402
2609
  # @ref: http://www.geeksphone.com/
2403
2610
  #########
2404
- - regex: '; *(Geeksphone) ([^;/]+?)(?: Build|\) AppleWebKit)'
2611
+ - regex: '; {0,2}(Geeksphone) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2405
2612
  device_replacement: '$1 $2'
2406
2613
  brand_replacement: '$1'
2407
2614
  model_replacement: '$2'
@@ -2410,8 +2617,7 @@ device_parsers:
2410
2617
  # Gfive
2411
2618
  # @ref: http://www.gfivemobile.com/en
2412
2619
  #########
2413
- #- regex: '; *(G\'?FIVE) ([^;/]+) Build' # there is a problem with python yaml parser here
2414
- - regex: '; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\) AppleWebKit)'
2620
+ - regex: '; {0,2}(G[^F]?FIVE) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2415
2621
  device_replacement: '$1 $2'
2416
2622
  brand_replacement: 'Gfive'
2417
2623
  model_replacement: '$2'
@@ -2420,16 +2626,16 @@ device_parsers:
2420
2626
  # Gionee
2421
2627
  # @ref: http://www.gionee.com/
2422
2628
  #########
2423
- - regex: '; *(Gionee)[ _\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\) AppleWebKit)'
2629
+ - regex: '; {0,2}(Gionee)[ _\-]([^;/]{1,100}?)(?:/[^;/]{1,100}|)(?: Build|\) AppleWebKit)'
2424
2630
  regex_flag: 'i'
2425
2631
  device_replacement: '$1 $2'
2426
2632
  brand_replacement: 'Gionee'
2427
2633
  model_replacement: '$2'
2428
- - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2634
+ - regex: '; {0,2}(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\) AppleWebKit)'
2429
2635
  device_replacement: 'Gionee $1'
2430
2636
  brand_replacement: 'Gionee'
2431
2637
  model_replacement: '$1'
2432
- - regex: '; *(E3) Build/JOP40D'
2638
+ - regex: '; {0,2}(E3) Build/JOP40D'
2433
2639
  device_replacement: 'Gionee $1'
2434
2640
  brand_replacement: 'Gionee'
2435
2641
  model_replacement: '$1'
@@ -2443,11 +2649,11 @@ device_parsers:
2443
2649
  # GoClever
2444
2650
  # @ref: http://www.goclever.com
2445
2651
  #########
2446
- - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB)(?: Build|\) AppleWebKit)'
2652
+ - regex: '; {0,2}((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]{0,100}|PLAYTAB)(?: Build|\) AppleWebKit)'
2447
2653
  device_replacement: 'GoClever $1'
2448
2654
  brand_replacement: 'GoClever'
2449
2655
  model_replacement: '$1'
2450
- - regex: '; *GOCLEVER ([^;/]+?)(?: Build|\) AppleWebKit)'
2656
+ - regex: '; {0,2}GOCLEVER ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2451
2657
  device_replacement: 'GoClever $1'
2452
2658
  brand_replacement: 'GoClever'
2453
2659
  model_replacement: '$1'
@@ -2456,11 +2662,11 @@ device_parsers:
2456
2662
  # Google
2457
2663
  # @ref: http://www.google.de/glass/start/
2458
2664
  #########
2459
- - regex: '; *(Glass \d+)(?: Build|\) AppleWebKit)'
2665
+ - regex: '; {0,2}(Glass \d+)(?: Build|\) AppleWebKit)'
2460
2666
  device_replacement: '$1'
2461
2667
  brand_replacement: 'Google'
2462
2668
  model_replacement: '$1'
2463
- - regex: '; *(Pixel.*?)(?: Build|\) AppleWebKit)'
2669
+ - regex: '; {0,2}(Pixel.{0,200}?)(?: Build|\) AppleWebKit)'
2464
2670
  device_replacement: '$1'
2465
2671
  brand_replacement: 'Google'
2466
2672
  model_replacement: '$1'
@@ -2469,7 +2675,7 @@ device_parsers:
2469
2675
  # Gigabyte
2470
2676
  # @ref: http://gsmart.gigabytecm.com/en/
2471
2677
  #########
2472
- - regex: '; *(GSmart)[ -]([^/]+)(?: Build|\) AppleWebKit)'
2678
+ - regex: '; {0,2}(GSmart)[ -]([^/]{1,50})(?: Build|\) AppleWebKit)'
2473
2679
  device_replacement: '$1 $2'
2474
2680
  brand_replacement: 'Gigabyte'
2475
2681
  model_replacement: '$1 $2'
@@ -2478,7 +2684,7 @@ device_parsers:
2478
2684
  # Freescale development boards
2479
2685
  # @ref: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX53QSB
2480
2686
  #########
2481
- - regex: '; *(imx5[13]_[^/]+)(?: Build|\) AppleWebKit)'
2687
+ - regex: '; {0,2}(imx5[13]_[^/]{1,50})(?: Build|\) AppleWebKit)'
2482
2688
  device_replacement: 'Freescale $1'
2483
2689
  brand_replacement: 'Freescale'
2484
2690
  model_replacement: '$1'
@@ -2488,11 +2694,11 @@ device_parsers:
2488
2694
  # @ref: http://www.haier.com/
2489
2695
  # @ref: http://www.haier.com/de/produkte/tablet/
2490
2696
  #########
2491
- - regex: '; *Haier[ _\-]([^/]+)(?: Build|\) AppleWebKit)'
2697
+ - regex: '; {0,2}Haier[ _\-]([^/]{1,50})(?: Build|\) AppleWebKit)'
2492
2698
  device_replacement: 'Haier $1'
2493
2699
  brand_replacement: 'Haier'
2494
2700
  model_replacement: '$1'
2495
- - regex: '; *(PAD1016)(?: Build|\) AppleWebKit)'
2701
+ - regex: '; {0,2}(PAD1016)(?: Build|\) AppleWebKit)'
2496
2702
  device_replacement: 'Haipad $1'
2497
2703
  brand_replacement: 'Haipad'
2498
2704
  model_replacement: '$1'
@@ -2502,7 +2708,7 @@ device_parsers:
2502
2708
  # @ref: http://www.haipad.net/
2503
2709
  # @models: V7P|M7SM7S|M9XM9X|M7XM7X|M9|M8|M7-M|M1002|M7|M701
2504
2710
  #########
2505
- - regex: '; *(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2711
+ - regex: '; {0,2}(M701|M7|M8|M9)(?: Build|\) AppleWebKit)'
2506
2712
  device_replacement: 'Haipad $1'
2507
2713
  brand_replacement: 'Haipad'
2508
2714
  model_replacement: '$1'
@@ -2512,7 +2718,7 @@ device_parsers:
2512
2718
  # @ref: http://www.hannspree.eu/
2513
2719
  # @models: SN10T1|SN10T2|SN70T31B|SN70T32W
2514
2720
  #########
2515
- - regex: '; *(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2721
+ - regex: '; {0,2}(SN\d+T[^;\)/]*)(?: Build|[;\)])'
2516
2722
  device_replacement: 'Hannspree $1'
2517
2723
  brand_replacement: 'Hannspree'
2518
2724
  model_replacement: '$1'
@@ -2521,11 +2727,11 @@ device_parsers:
2521
2727
  # HCLme
2522
2728
  # @ref: http://www.hclmetablet.com/india/
2523
2729
  #########
2524
- - regex: 'Build/HCL ME Tablet ([^;\)]+)[\);]'
2730
+ - regex: 'Build/HCL ME Tablet ([^;\)]{1,3})[\);]'
2525
2731
  device_replacement: 'HCLme $1'
2526
2732
  brand_replacement: 'HCLme'
2527
2733
  model_replacement: '$1'
2528
- - regex: '; *([^;\/]+) Build/HCL'
2734
+ - regex: '; {0,2}([^;\/]+) Build/HCL'
2529
2735
  device_replacement: 'HCLme $1'
2530
2736
  brand_replacement: 'HCLme'
2531
2737
  model_replacement: '$1'
@@ -2534,7 +2740,7 @@ device_parsers:
2534
2740
  # Hena
2535
2741
  # @ref: http://www.henadigital.com/en/product/index.asp?id=6
2536
2742
  #########
2537
- - regex: '; *(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2743
+ - regex: '; {0,2}(MID-?\d{4}C[EM])(?: Build|\) AppleWebKit)'
2538
2744
  device_replacement: 'Hena $1'
2539
2745
  brand_replacement: 'Hena'
2540
2746
  model_replacement: '$1'
@@ -2543,11 +2749,11 @@ device_parsers:
2543
2749
  # Hisense
2544
2750
  # @ref: http://www.hisense.com/
2545
2751
  #########
2546
- - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\) AppleWebKit)'
2752
+ - regex: '; {0,2}(EG\d{2,}|HS-[^;/]{1,100}|MIRA[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2547
2753
  device_replacement: 'Hisense $1'
2548
2754
  brand_replacement: 'Hisense'
2549
2755
  model_replacement: '$1'
2550
- - regex: '; *(andromax[^;/]+?)(?: Build|\) AppleWebKit)'
2756
+ - regex: '; {0,2}(andromax[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2551
2757
  regex_flag: 'i'
2552
2758
  device_replacement: 'Hisense $1'
2553
2759
  brand_replacement: 'Hisense'
@@ -2557,7 +2763,7 @@ device_parsers:
2557
2763
  # hitech
2558
2764
  # @ref: http://www.hitech-mobiles.com/
2559
2765
  #########
2560
- - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2766
+ - regex: '; {0,2}(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE)(?: Build|\) AppleWebKit)'
2561
2767
  device_replacement: 'AMAZE $1$2'
2562
2768
  brand_replacement: 'hitech'
2563
2769
  model_replacement: 'AMAZE $1$2'
@@ -2566,15 +2772,15 @@ device_parsers:
2566
2772
  # HP
2567
2773
  # @ref: http://www.hp.com/
2568
2774
  #########
2569
- - regex: '; *(PlayBook)(?: Build|\) AppleWebKit)'
2775
+ - regex: '; {0,2}(PlayBook)(?: Build|\) AppleWebKit)'
2570
2776
  device_replacement: 'HP $1'
2571
2777
  brand_replacement: 'HP'
2572
2778
  model_replacement: '$1'
2573
- - regex: '; *HP ([^/]+)(?: Build|\) AppleWebKit)'
2779
+ - regex: '; {0,2}HP ([^/]{1,50})(?: Build|\) AppleWebKit)'
2574
2780
  device_replacement: 'HP $1'
2575
2781
  brand_replacement: 'HP'
2576
2782
  model_replacement: '$1'
2577
- - regex: '; *([^/]+_tenderloin)(?: Build|\) AppleWebKit)'
2783
+ - regex: '; {0,2}([^/]{1,30}_tenderloin)(?: Build|\) AppleWebKit)'
2578
2784
  device_replacement: 'HP TouchPad'
2579
2785
  brand_replacement: 'HP'
2580
2786
  model_replacement: 'TouchPad'
@@ -2584,62 +2790,66 @@ device_parsers:
2584
2790
  # @ref: http://www.huaweidevice.com
2585
2791
  # @note: Needs to be before HTC due to Desire HD Build on U8815
2586
2792
  #########
2587
- - regex: '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2793
+ - regex: '; {0,2}(HUAWEI |Huawei-|)([UY][^;/]{1,100}) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
2588
2794
  device_replacement: '$1$2'
2589
2795
  brand_replacement: 'Huawei'
2590
2796
  model_replacement: '$2'
2591
- - regex: '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)[^\);]*\)'
2797
+ - regex: '; {0,2}([^;/]{1,100}) Build[/ ]Huawei(MT1-U06|[A-Z]{1,50}\d+[^\);]{1,50})\)'
2592
2798
  device_replacement: '$1'
2593
2799
  brand_replacement: 'Huawei'
2594
2800
  model_replacement: '$2'
2595
- - regex: '; *(S7|M860) Build'
2801
+ - regex: '; {0,2}(S7|M860) Build'
2596
2802
  device_replacement: '$1'
2597
2803
  brand_replacement: 'Huawei'
2598
2804
  model_replacement: '$1'
2599
- - regex: '; *((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2805
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
2600
2806
  device_replacement: '$1$2'
2601
2807
  brand_replacement: 'Huawei'
2602
2808
  model_replacement: '$2'
2603
- - regex: '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build'
2809
+ - regex: '; {0,2}((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]{1,100}) Build'
2604
2810
  device_replacement: '$1$2'
2605
2811
  brand_replacement: 'Huawei'
2606
2812
  model_replacement: '$2'
2607
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]+) Build'
2813
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]{1,100}) Build'
2608
2814
  device_replacement: '$1$2'
2609
2815
  brand_replacement: 'Huawei'
2610
2816
  model_replacement: '$2'
2611
- - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)([^;/]+) Build'
2817
+ - regex: '; {0,2}((?:HUAWEI|Huawei)[ _\-]?)([^;/]{1,100}) Build'
2612
2818
  device_replacement: '$1$2'
2613
2819
  brand_replacement: 'Huawei'
2614
2820
  model_replacement: '$2'
2615
- - regex: '; *(MediaPad[^;]+|SpringBoard) Build/Huawei'
2821
+ - regex: '; {0,2}(MediaPad[^;]{1,200}|SpringBoard) Build/Huawei'
2616
2822
  device_replacement: '$1'
2617
2823
  brand_replacement: 'Huawei'
2618
2824
  model_replacement: '$1'
2619
- - regex: '; *([^;]+) Build/(?:Huawei|HUAWEI)'
2825
+ - regex: '; {0,2}([^;]{1,200}) Build/(?:Huawei|HUAWEI)'
2620
2826
  device_replacement: '$1'
2621
2827
  brand_replacement: 'Huawei'
2622
2828
  model_replacement: '$1'
2623
- - regex: '; *([Uu])([89]\d{3}) Build'
2829
+ - regex: '; {0,2}([Uu])([89]\d{3}) Build'
2624
2830
  device_replacement: '$1$2'
2625
2831
  brand_replacement: 'Huawei'
2626
2832
  model_replacement: 'U$2'
2627
- - regex: '; *(?:Ideos |IDEOS )(S7) Build'
2833
+ - regex: '; {0,2}(?:Ideos |IDEOS )(S7) Build'
2628
2834
  device_replacement: 'Huawei Ideos$1'
2629
2835
  brand_replacement: 'Huawei'
2630
2836
  model_replacement: 'Ideos$1'
2631
- - regex: '; *(?:Ideos |IDEOS )([^;/]+\s*|\s*)Build'
2837
+ - regex: '; {0,2}(?:Ideos |IDEOS )([^;/]{1,50}\s{0,5}|\s{0,5})Build'
2632
2838
  device_replacement: 'Huawei Ideos$1'
2633
2839
  brand_replacement: 'Huawei'
2634
2840
  model_replacement: 'Ideos$1'
2635
- - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]'
2841
+ - regex: '; {0,2}(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.{1,200}?) Build[/ ]'
2636
2842
  device_replacement: 'Huawei $1'
2637
2843
  brand_replacement: 'Huawei'
2638
2844
  model_replacement: '$1'
2639
- - regex: '; *((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2845
+ - regex: '; {0,2}((?:[A-Z]{3})\-L[A-Za0-9]{2})[\)]'
2640
2846
  device_replacement: 'Huawei $1'
2641
2847
  brand_replacement: 'Huawei'
2642
2848
  model_replacement: '$1'
2849
+ - regex: '; {0,2}([^;]{1,200}) Build/(HONOR|Honor)'
2850
+ device_replacement: 'Huawei Honor $1'
2851
+ brand_replacement: 'Huawei'
2852
+ model_replacement: 'Honor $1'
2643
2853
 
2644
2854
  #########
2645
2855
  # HTC
@@ -2647,7 +2857,7 @@ device_parsers:
2647
2857
  # @ref: http://en.wikipedia.org/wiki/List_of_HTC_phones
2648
2858
  #########
2649
2859
 
2650
- - regex: '; *HTC[ _]([^;]+); Windows Phone'
2860
+ - regex: '; {0,2}HTC[ _]([^;]{1,200}); Windows Phone'
2651
2861
  device_replacement: 'HTC $1'
2652
2862
  brand_replacement: 'HTC'
2653
2863
  model_replacement: '$1'
@@ -2655,59 +2865,59 @@ device_parsers:
2655
2865
  # Android HTC with Version Number matcher
2656
2866
  # ; HTC_0P3Z11/1.12.161.3 Build
2657
2867
  # ;HTC_A3335 V2.38.841.1 Build
2658
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2868
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2659
2869
  device_replacement: 'HTC $1'
2660
2870
  brand_replacement: 'HTC'
2661
2871
  model_replacement: '$1'
2662
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2872
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2663
2873
  device_replacement: 'HTC $1 $2'
2664
2874
  brand_replacement: 'HTC'
2665
2875
  model_replacement: '$1 $2'
2666
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2876
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2667
2877
  device_replacement: 'HTC $1 $2 $3'
2668
2878
  brand_replacement: 'HTC'
2669
2879
  model_replacement: '$1 $2 $3'
2670
- - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
2880
+ - regex: '; {0,2}(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: {0,2}Build|\))'
2671
2881
  device_replacement: 'HTC $1 $2 $3 $4'
2672
2882
  brand_replacement: 'HTC'
2673
2883
  model_replacement: '$1 $2 $3 $4'
2674
2884
 
2675
2885
  # Android HTC without Version Number matcher
2676
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
2886
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: {0,2}Build|[;\)]| - )'
2677
2887
  device_replacement: 'HTC $1'
2678
2888
  brand_replacement: 'HTC'
2679
2889
  model_replacement: '$1'
2680
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: *Build|[;\)]| - )'
2890
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+)|)(?: {0,2}Build|[;\)]| - )'
2681
2891
  device_replacement: 'HTC $1 $2'
2682
2892
  brand_replacement: 'HTC'
2683
2893
  model_replacement: '$1 $2'
2684
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: *Build|[;\)]| - )'
2894
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+)|)|)(?: {0,2}Build|[;\)]| - )'
2685
2895
  device_replacement: 'HTC $1 $2 $3'
2686
2896
  brand_replacement: 'HTC'
2687
2897
  model_replacement: '$1 $2 $3'
2688
- - regex: '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\)]| - )'
2898
+ - regex: '; {0,2}(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: {0,2}Build|[;\)]| - )'
2689
2899
  device_replacement: 'HTC $1 $2 $3 $4'
2690
2900
  brand_replacement: 'HTC'
2691
2901
  model_replacement: '$1 $2 $3 $4'
2692
2902
 
2693
2903
  # HTC Streaming Player
2694
- - regex: 'HTC Streaming Player [^\/]*/[^\/]*/ htc_([^/]+) /'
2904
+ - regex: 'HTC Streaming Player [^\/]{0,30}/[^\/]{0,10}/ htc_([^/]{1,10}) /'
2695
2905
  device_replacement: 'HTC $1'
2696
2906
  brand_replacement: 'HTC'
2697
2907
  model_replacement: '$1'
2698
2908
  # general matcher for anything else
2699
- - regex: '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2909
+ - regex: '(?:[;,] {0,2}|^)(?:htccn_chs-|)HTC[ _-]?([^;]{1,200}?)(?: {0,2}Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
2700
2910
  regex_flag: 'i'
2701
2911
  device_replacement: 'HTC $1'
2702
2912
  brand_replacement: 'HTC'
2703
2913
  model_replacement: '$1'
2704
2914
  # Android matchers without HTC
2705
- - regex: '; *(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\+?)\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\(\)])'
2915
+ - regex: '; {0,2}(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\+?)\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\(\)])'
2706
2916
  regex_flag: 'i'
2707
2917
  device_replacement: 'HTC $1'
2708
2918
  brand_replacement: 'HTC'
2709
2919
  model_replacement: '$1'
2710
- - regex: '; *(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.+?)(?:[/;\)]|Build|MIUI|1\.0)'
2920
+ - regex: '; {0,2}(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.{1,200}?)(?:[/;\)]|Build|MIUI|1\.0)'
2711
2921
  regex_flag: 'i'
2712
2922
  device_replacement: 'HTC $1 $2'
2713
2923
  brand_replacement: 'HTC'
@@ -2717,16 +2927,16 @@ device_parsers:
2717
2927
  # Hyundai
2718
2928
  # @ref: http://www.hyundaitechnologies.com
2719
2929
  #########
2720
- - regex: '; *HYUNDAI (T\d[^/]*)(?: Build|\) AppleWebKit)'
2930
+ - regex: '; {0,2}HYUNDAI (T\d[^/]{0,10})(?: Build|\) AppleWebKit)'
2721
2931
  device_replacement: 'Hyundai $1'
2722
2932
  brand_replacement: 'Hyundai'
2723
2933
  model_replacement: '$1'
2724
- - regex: '; *HYUNDAI ([^;/]+?)(?: Build|\) AppleWebKit)'
2934
+ - regex: '; {0,2}HYUNDAI ([^;/]{1,10}?)(?: Build|\) AppleWebKit)'
2725
2935
  device_replacement: 'Hyundai $1'
2726
2936
  brand_replacement: 'Hyundai'
2727
2937
  model_replacement: '$1'
2728
2938
  # X900? http://www.amazon.com/Hyundai-X900-Retina-Android-Bluetooth/dp/B00AO07H3O
2729
- - regex: '; *(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2939
+ - regex: '; {0,2}(X700|Hold X|MB-6900)(?: Build|\) AppleWebKit)'
2730
2940
  device_replacement: 'Hyundai $1'
2731
2941
  brand_replacement: 'Hyundai'
2732
2942
  model_replacement: '$1'
@@ -2735,12 +2945,12 @@ device_parsers:
2735
2945
  # iBall
2736
2946
  # @ref: http://www.iball.co.in/Category/Mobiles/22
2737
2947
  #########
2738
- - regex: '; *(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2948
+ - regex: '; {0,2}(?:iBall[ _\-]|)(Andi)[ _]?(\d[^;/]*)(?: Build|\) AppleWebKit)'
2739
2949
  regex_flag: 'i'
2740
2950
  device_replacement: '$1 $2'
2741
2951
  brand_replacement: 'iBall'
2742
2952
  model_replacement: '$1 $2'
2743
- - regex: '; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\) AppleWebKit)'
2953
+ - regex: '; {0,2}(IBall)(?:[ _]([^;/]{1,100}?)|)(?: Build|\) AppleWebKit)'
2744
2954
  regex_flag: 'i'
2745
2955
  device_replacement: '$1 $2'
2746
2956
  brand_replacement: 'iBall'
@@ -2750,7 +2960,7 @@ device_parsers:
2750
2960
  # IconBIT
2751
2961
  # @ref: http://www.iconbit.com/catalog/tablets/
2752
2962
  #########
2753
- - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\) AppleWebKit)'
2963
+ - regex: '; {0,2}(NT-\d+[^ ;/]{0,50}|Net[Tt]AB [^;/]{1,50}|Mercury [A-Z]{1,50}|iconBIT)(?: S/N:[^;/]{1,50}|)(?: Build|\) AppleWebKit)'
2754
2964
  device_replacement: '$1'
2755
2965
  brand_replacement: 'IconBIT'
2756
2966
  model_replacement: '$1'
@@ -2759,7 +2969,7 @@ device_parsers:
2759
2969
  # IMO
2760
2970
  # @ref: http://www.ponselimo.com/
2761
2971
  #########
2762
- - regex: '; *(IMO)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
2972
+ - regex: '; {0,2}(IMO)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2763
2973
  regex_flag: 'i'
2764
2974
  device_replacement: '$1 $2'
2765
2975
  brand_replacement: 'IMO'
@@ -2769,12 +2979,12 @@ device_parsers:
2769
2979
  # i-mobile
2770
2980
  # @ref: http://www.i-mobilephone.com/
2771
2981
  #########
2772
- - regex: '; *i-?mobile[ _]([^/]+)(?: Build|\) AppleWebKit)'
2982
+ - regex: '; {0,2}i-?mobile[ _]([^/]{1,50})(?: Build|\) AppleWebKit)'
2773
2983
  regex_flag: 'i'
2774
2984
  device_replacement: 'i-mobile $1'
2775
2985
  brand_replacement: 'imobile'
2776
2986
  model_replacement: '$1'
2777
- - regex: '; *(i-(?:style|note)[^/]*)(?: Build|\) AppleWebKit)'
2987
+ - regex: '; {0,2}(i-(?:style|note)[^/]{0,10})(?: Build|\) AppleWebKit)'
2778
2988
  regex_flag: 'i'
2779
2989
  device_replacement: 'i-mobile $1'
2780
2990
  brand_replacement: 'imobile'
@@ -2784,7 +2994,7 @@ device_parsers:
2784
2994
  # Impression
2785
2995
  # @ref: http://impression.ua/planshetnye-kompyutery
2786
2996
  #########
2787
- - regex: '; *(ImPAD) ?(\d+(?:.)*?)(?: Build|\) AppleWebKit)'
2997
+ - regex: '; {0,2}(ImPAD) ?(\d+(?:.){0,100}?)(?: Build|\) AppleWebKit)'
2788
2998
  device_replacement: '$1 $2'
2789
2999
  brand_replacement: 'Impression'
2790
3000
  model_replacement: '$1 $2'
@@ -2793,7 +3003,7 @@ device_parsers:
2793
3003
  # Infinix
2794
3004
  # @ref: http://www.infinixmobility.com/index.html
2795
3005
  #########
2796
- - regex: '; *(Infinix)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3006
+ - regex: '; {0,2}(Infinix)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2797
3007
  device_replacement: '$1 $2'
2798
3008
  brand_replacement: 'Infinix'
2799
3009
  model_replacement: '$2'
@@ -2802,7 +3012,7 @@ device_parsers:
2802
3012
  # Informer
2803
3013
  # @ref: ??
2804
3014
  #########
2805
- - regex: '; *(Informer)[ \-]([^;/]+?)(?: Build|\) AppleWebKit)'
3015
+ - regex: '; {0,2}(Informer)[ \-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2806
3016
  device_replacement: '$1 $2'
2807
3017
  brand_replacement: 'Informer'
2808
3018
  model_replacement: '$2'
@@ -2812,7 +3022,7 @@ device_parsers:
2812
3022
  # @ref: http://www.intenso.de
2813
3023
  # @models: 7":TAB 714,TAB 724;8":TAB 814,TAB 824;10":TAB 1004
2814
3024
  #########
2815
- - regex: '; *(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
3025
+ - regex: '; {0,2}(TAB) ?([78][12]4)(?: Build|\) AppleWebKit)'
2816
3026
  device_replacement: 'Intenso $1'
2817
3027
  brand_replacement: 'Intenso'
2818
3028
  model_replacement: '$1 $2'
@@ -2823,21 +3033,21 @@ device_parsers:
2823
3033
  # @note: Zync also offers a "Cloud Z5" device
2824
3034
  #########
2825
3035
  # smartphones
2826
- - regex: '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]+?) *(?:Build|;)'
3036
+ - regex: '; {0,2}(?:Intex[ _]|)(AQUA|Aqua)([ _\.\-])([^;/]{1,100}?) {0,2}(?:Build|;)'
2827
3037
  device_replacement: '$1$2$3'
2828
3038
  brand_replacement: 'Intex'
2829
3039
  model_replacement: '$1 $3'
2830
3040
  # matches "INTEX CLOUD X1"
2831
- - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) *(?:Build|;)'
3041
+ - regex: '; {0,2}(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+)|) {0,2}(?:Build|;)'
2832
3042
  device_replacement: '$1 $2'
2833
3043
  brand_replacement: 'Intex'
2834
3044
  model_replacement: '$1 $2'
2835
3045
  # tablets
2836
- - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]*) *(?:Build|;)'
3046
+ - regex: '; {0,2}([iI]Buddy)[ _]?(Connect)(?:_|\?_| |)([^;/]{0,50}) {0,2}(?:Build|;)'
2837
3047
  device_replacement: '$1 $2 $3'
2838
3048
  brand_replacement: 'Intex'
2839
3049
  model_replacement: 'iBuddy $2 $3'
2840
- - regex: '; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)'
3050
+ - regex: '; {0,2}(I-Buddy)[ _]([^;/]{1,100}?) {0,2}(?:Build|;)'
2841
3051
  device_replacement: '$1 $2'
2842
3052
  brand_replacement: 'Intex'
2843
3053
  model_replacement: 'iBuddy $2'
@@ -2846,7 +3056,7 @@ device_parsers:
2846
3056
  # iOCEAN
2847
3057
  # @ref: http://www.iocean.cc/
2848
3058
  #########
2849
- - regex: '; *(iOCEAN) ([^/]+)(?: Build|\) AppleWebKit)'
3059
+ - regex: '; {0,2}(iOCEAN) ([^/]{1,50})(?: Build|\) AppleWebKit)'
2850
3060
  regex_flag: 'i'
2851
3061
  device_replacement: '$1 $2'
2852
3062
  brand_replacement: 'iOCEAN'
@@ -2856,7 +3066,7 @@ device_parsers:
2856
3066
  # i.onik
2857
3067
  # @ref: http://www.i-onik.de/
2858
3068
  #########
2859
- - regex: '; *(TP\d+(?:\.\d+|)\-\d[^;/]+?)(?: Build|\) AppleWebKit)'
3069
+ - regex: '; {0,2}(TP\d+(?:\.\d+|)\-\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2860
3070
  device_replacement: 'ionik $1'
2861
3071
  brand_replacement: 'ionik'
2862
3072
  model_replacement: '$1'
@@ -2865,21 +3075,30 @@ device_parsers:
2865
3075
  # IRU.ru
2866
3076
  # @ref: http://www.iru.ru/catalog/soho/planetable/
2867
3077
  #########
2868
- - regex: '; *(M702pro)(?: Build|\) AppleWebKit)'
3078
+ - regex: '; {0,2}(M702pro)(?: Build|\) AppleWebKit)'
2869
3079
  device_replacement: '$1'
2870
3080
  brand_replacement: 'Iru'
2871
3081
  model_replacement: '$1'
2872
3082
 
3083
+ #########
3084
+ # Itel Mobile
3085
+ # @ref: https://www.itel-mobile.com/global/products/
3086
+ #########
3087
+ - regex: '; {0,2}itel ([^;/]*)(?: Build|\) AppleWebKit)'
3088
+ device_replacement: 'Itel $1'
3089
+ brand_replacement: 'Itel'
3090
+ model_replacement: '$1'
3091
+
2873
3092
  #########
2874
3093
  # Ivio
2875
3094
  # @ref: http://www.ivio.com/mobile.php
2876
3095
  # @models: DG80,DG20,DE38,DE88,MD70
2877
3096
  #########
2878
- - regex: '; *(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
3097
+ - regex: '; {0,2}(DE88Plus|MD70)(?: Build|\) AppleWebKit)'
2879
3098
  device_replacement: '$1'
2880
3099
  brand_replacement: 'Ivio'
2881
3100
  model_replacement: '$1'
2882
- - regex: '; *IVIO[_\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3101
+ - regex: '; {0,2}IVIO[_\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2883
3102
  device_replacement: '$1'
2884
3103
  brand_replacement: 'Ivio'
2885
3104
  model_replacement: '$1'
@@ -2888,7 +3107,7 @@ device_parsers:
2888
3107
  # Jaytech
2889
3108
  # @ref: http://www.jay-tech.de/jaytech/servlet/frontend/
2890
3109
  #########
2891
- - regex: '; *(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
3110
+ - regex: '; {0,2}(TPC-\d+|JAY-TECH)(?: Build|\) AppleWebKit)'
2892
3111
  device_replacement: '$1'
2893
3112
  brand_replacement: 'Jaytech'
2894
3113
  model_replacement: '$1'
@@ -2897,7 +3116,7 @@ device_parsers:
2897
3116
  # Jiayu
2898
3117
  # @ref: http://www.ejiayu.com/en/Product.html
2899
3118
  #########
2900
- - regex: '; *(JY-[^;/]+|G[234]S?)(?: Build|\) AppleWebKit)'
3119
+ - regex: '; {0,2}(JY-[^;/]{1,100}|G[234]S?)(?: Build|\) AppleWebKit)'
2901
3120
  device_replacement: '$1'
2902
3121
  brand_replacement: 'Jiayu'
2903
3122
  model_replacement: '$1'
@@ -2906,7 +3125,7 @@ device_parsers:
2906
3125
  # JXD
2907
3126
  # @ref: http://www.jxd.hk/
2908
3127
  #########
2909
- - regex: '; *(JXD)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3128
+ - regex: '; {0,2}(JXD)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
2910
3129
  device_replacement: '$1 $2'
2911
3130
  brand_replacement: 'JXD'
2912
3131
  model_replacement: '$2'
@@ -2915,16 +3134,16 @@ device_parsers:
2915
3134
  # Karbonn
2916
3135
  # @ref: http://www.karbonnmobiles.com/products_tablet.php
2917
3136
  #########
2918
- - regex: '; *Karbonn[ _]?([^;/]+) *(?:Build|;)'
3137
+ - regex: '; {0,2}Karbonn[ _]?([^;/]{1,100}) {0,2}(?:Build|;)'
2919
3138
  regex_flag: 'i'
2920
3139
  device_replacement: '$1'
2921
3140
  brand_replacement: 'Karbonn'
2922
3141
  model_replacement: '$1'
2923
- - regex: '; *([^;]+) Build/Karbonn'
3142
+ - regex: '; {0,2}([^;]{1,200}) Build/Karbonn'
2924
3143
  device_replacement: '$1'
2925
3144
  brand_replacement: 'Karbonn'
2926
3145
  model_replacement: '$1'
2927
- - regex: '; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
3146
+ - regex: '; {0,2}(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
2928
3147
  device_replacement: '$1'
2929
3148
  brand_replacement: 'Karbonn'
2930
3149
  model_replacement: '$1'
@@ -2933,84 +3152,84 @@ device_parsers:
2933
3152
  # KDDI (Operator Branded Device)
2934
3153
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
2935
3154
  #########
2936
- - regex: '; *(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
3155
+ - regex: '; {0,2}(IS01|IS03|IS05|IS\d{2}SH)(?: Build|\) AppleWebKit)'
2937
3156
  device_replacement: '$1'
2938
3157
  brand_replacement: 'Sharp'
2939
3158
  model_replacement: '$1'
2940
- - regex: '; *(IS04)(?: Build|\) AppleWebKit)'
3159
+ - regex: '; {0,2}(IS04)(?: Build|\) AppleWebKit)'
2941
3160
  device_replacement: '$1'
2942
3161
  brand_replacement: 'Regza'
2943
3162
  model_replacement: '$1'
2944
- - regex: '; *(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
3163
+ - regex: '; {0,2}(IS06|IS\d{2}PT)(?: Build|\) AppleWebKit)'
2945
3164
  device_replacement: '$1'
2946
3165
  brand_replacement: 'Pantech'
2947
3166
  model_replacement: '$1'
2948
- - regex: '; *(IS11S)(?: Build|\) AppleWebKit)'
3167
+ - regex: '; {0,2}(IS11S)(?: Build|\) AppleWebKit)'
2949
3168
  device_replacement: '$1'
2950
3169
  brand_replacement: 'SonyEricsson'
2951
3170
  model_replacement: 'Xperia Acro'
2952
- - regex: '; *(IS11CA)(?: Build|\) AppleWebKit)'
3171
+ - regex: '; {0,2}(IS11CA)(?: Build|\) AppleWebKit)'
2953
3172
  device_replacement: '$1'
2954
3173
  brand_replacement: 'Casio'
2955
3174
  model_replacement: 'GzOne $1'
2956
- - regex: '; *(IS11LG)(?: Build|\) AppleWebKit)'
3175
+ - regex: '; {0,2}(IS11LG)(?: Build|\) AppleWebKit)'
2957
3176
  device_replacement: '$1'
2958
3177
  brand_replacement: 'LG'
2959
3178
  model_replacement: 'Optimus X'
2960
- - regex: '; *(IS11N)(?: Build|\) AppleWebKit)'
3179
+ - regex: '; {0,2}(IS11N)(?: Build|\) AppleWebKit)'
2961
3180
  device_replacement: '$1'
2962
3181
  brand_replacement: 'Medias'
2963
3182
  model_replacement: '$1'
2964
- - regex: '; *(IS11PT)(?: Build|\) AppleWebKit)'
3183
+ - regex: '; {0,2}(IS11PT)(?: Build|\) AppleWebKit)'
2965
3184
  device_replacement: '$1'
2966
3185
  brand_replacement: 'Pantech'
2967
3186
  model_replacement: 'MIRACH'
2968
- - regex: '; *(IS12F)(?: Build|\) AppleWebKit)'
3187
+ - regex: '; {0,2}(IS12F)(?: Build|\) AppleWebKit)'
2969
3188
  device_replacement: '$1'
2970
3189
  brand_replacement: 'Fujitsu'
2971
3190
  model_replacement: 'Arrows ES'
2972
3191
  # @ref: https://ja.wikipedia.org/wiki/IS12M
2973
- - regex: '; *(IS12M)(?: Build|\) AppleWebKit)'
3192
+ - regex: '; {0,2}(IS12M)(?: Build|\) AppleWebKit)'
2974
3193
  device_replacement: '$1'
2975
3194
  brand_replacement: 'Motorola'
2976
3195
  model_replacement: 'XT909'
2977
- - regex: '; *(IS12S)(?: Build|\) AppleWebKit)'
3196
+ - regex: '; {0,2}(IS12S)(?: Build|\) AppleWebKit)'
2978
3197
  device_replacement: '$1'
2979
3198
  brand_replacement: 'SonyEricsson'
2980
3199
  model_replacement: 'Xperia Acro HD'
2981
- - regex: '; *(ISW11F)(?: Build|\) AppleWebKit)'
3200
+ - regex: '; {0,2}(ISW11F)(?: Build|\) AppleWebKit)'
2982
3201
  device_replacement: '$1'
2983
3202
  brand_replacement: 'Fujitsu'
2984
3203
  model_replacement: 'Arrowz Z'
2985
- - regex: '; *(ISW11HT)(?: Build|\) AppleWebKit)'
3204
+ - regex: '; {0,2}(ISW11HT)(?: Build|\) AppleWebKit)'
2986
3205
  device_replacement: '$1'
2987
3206
  brand_replacement: 'HTC'
2988
3207
  model_replacement: 'EVO'
2989
- - regex: '; *(ISW11K)(?: Build|\) AppleWebKit)'
3208
+ - regex: '; {0,2}(ISW11K)(?: Build|\) AppleWebKit)'
2990
3209
  device_replacement: '$1'
2991
3210
  brand_replacement: 'Kyocera'
2992
3211
  model_replacement: 'DIGNO'
2993
- - regex: '; *(ISW11M)(?: Build|\) AppleWebKit)'
3212
+ - regex: '; {0,2}(ISW11M)(?: Build|\) AppleWebKit)'
2994
3213
  device_replacement: '$1'
2995
3214
  brand_replacement: 'Motorola'
2996
3215
  model_replacement: 'Photon'
2997
- - regex: '; *(ISW11SC)(?: Build|\) AppleWebKit)'
3216
+ - regex: '; {0,2}(ISW11SC)(?: Build|\) AppleWebKit)'
2998
3217
  device_replacement: '$1'
2999
3218
  brand_replacement: 'Samsung'
3000
3219
  model_replacement: 'GALAXY S II WiMAX'
3001
- - regex: '; *(ISW12HT)(?: Build|\) AppleWebKit)'
3220
+ - regex: '; {0,2}(ISW12HT)(?: Build|\) AppleWebKit)'
3002
3221
  device_replacement: '$1'
3003
3222
  brand_replacement: 'HTC'
3004
3223
  model_replacement: 'EVO 3D'
3005
- - regex: '; *(ISW13HT)(?: Build|\) AppleWebKit)'
3224
+ - regex: '; {0,2}(ISW13HT)(?: Build|\) AppleWebKit)'
3006
3225
  device_replacement: '$1'
3007
3226
  brand_replacement: 'HTC'
3008
3227
  model_replacement: 'J'
3009
- - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
3228
+ - regex: '; {0,2}(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\) AppleWebKit)'
3010
3229
  device_replacement: '$1'
3011
3230
  brand_replacement: 'KDDI'
3012
3231
  model_replacement: '$1'
3013
- - regex: '; *(INFOBAR [^;/]+?)(?: Build|\) AppleWebKit)'
3232
+ - regex: '; {0,2}(INFOBAR [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3014
3233
  device_replacement: '$1'
3015
3234
  brand_replacement: 'KDDI'
3016
3235
  model_replacement: '$1'
@@ -3019,7 +3238,7 @@ device_parsers:
3019
3238
  # Kingcom
3020
3239
  # @ref: http://www.e-kingcom.com
3021
3240
  #########
3022
- - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3241
+ - regex: '; {0,2}(JOYPAD|Joypad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3023
3242
  device_replacement: '$1 $2'
3024
3243
  brand_replacement: 'Kingcom'
3025
3244
  model_replacement: '$1 $2'
@@ -3029,7 +3248,7 @@ device_parsers:
3029
3248
  # @ref: https://en.wikipedia.org/wiki/Kobo_Inc.
3030
3249
  # @ref: http://www.kobo.com/devices#tablets
3031
3250
  #########
3032
- - regex: '; *(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
3251
+ - regex: '; {0,2}(Vox|VOX|Arc|K080)(?: Build|\) AppleWebKit)'
3033
3252
  regex_flag: 'i'
3034
3253
  device_replacement: '$1'
3035
3254
  brand_replacement: 'Kobo'
@@ -3043,7 +3262,7 @@ device_parsers:
3043
3262
  # K-Touch
3044
3263
  # @ref: ??
3045
3264
  #########
3046
- - regex: '; *(K-Touch)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3265
+ - regex: '; {0,2}(K-Touch)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3047
3266
  regex_flag: 'i'
3048
3267
  device_replacement: '$1 $2'
3049
3268
  brand_replacement: 'Ktouch'
@@ -3053,7 +3272,7 @@ device_parsers:
3053
3272
  # KT Tech
3054
3273
  # @ref: http://www.kttech.co.kr
3055
3274
  #########
3056
- - regex: '; *((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3275
+ - regex: '; {0,2}((?:EV|KM)-S\d+[A-Z]?)(?: Build|\) AppleWebKit)'
3057
3276
  regex_flag: 'i'
3058
3277
  device_replacement: '$1'
3059
3278
  brand_replacement: 'KTtech'
@@ -3063,7 +3282,7 @@ device_parsers:
3063
3282
  # Kyocera
3064
3283
  # @ref: http://www.android.com/devices/?country=all&m=kyocera
3065
3284
  #########
3066
- - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3285
+ - regex: '; {0,2}(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2})(?: Build|\) AppleWebKit)'
3067
3286
  device_replacement: '$1'
3068
3287
  brand_replacement: 'Kyocera'
3069
3288
  model_replacement: '$1'
@@ -3072,12 +3291,12 @@ device_parsers:
3072
3291
  # Lava
3073
3292
  # @ref: http://www.lavamobiles.com/
3074
3293
  #########
3075
- - regex: '; *(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
3294
+ - regex: '; {0,2}(?:LAVA[ _]|)IRIS[ _\-]?([^/;\)]+) {0,2}(?:;|\)|Build)'
3076
3295
  regex_flag: 'i'
3077
3296
  device_replacement: 'Iris $1'
3078
3297
  brand_replacement: 'Lava'
3079
3298
  model_replacement: 'Iris $1'
3080
- - regex: '; *LAVA[ _]([^;/]+) Build'
3299
+ - regex: '; {0,2}LAVA[ _]([^;/]{1,100}) Build'
3081
3300
  device_replacement: '$1'
3082
3301
  brand_replacement: 'Lava'
3083
3302
  model_replacement: '$1'
@@ -3086,7 +3305,7 @@ device_parsers:
3086
3305
  # Lemon
3087
3306
  # @ref: http://www.lemonmobiles.com/products.php?type=1
3088
3307
  #########
3089
- - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\) AppleWebKit)'
3308
+ - regex: '; {0,2}(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]{1,100}))_?(?: Build|\) AppleWebKit)'
3090
3309
  device_replacement: 'Lemon $1$2'
3091
3310
  brand_replacement: 'Lemon'
3092
3311
  model_replacement: '$1$2'
@@ -3095,11 +3314,11 @@ device_parsers:
3095
3314
  # Lenco
3096
3315
  # @ref: http://www.lenco.com/c/tablets/
3097
3316
  #########
3098
- - regex: '; *(TAB-1012)(?: Build|\) AppleWebKit)'
3317
+ - regex: '; {0,2}(TAB-1012)(?: Build|\) AppleWebKit)'
3099
3318
  device_replacement: 'Lenco $1'
3100
3319
  brand_replacement: 'Lenco'
3101
3320
  model_replacement: '$1'
3102
- - regex: '; Lenco ([^;/]+?)(?: Build|\) AppleWebKit)'
3321
+ - regex: '; Lenco ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3103
3322
  device_replacement: 'Lenco $1'
3104
3323
  brand_replacement: 'Lenco'
3105
3324
  model_replacement: '$1'
@@ -3108,23 +3327,23 @@ device_parsers:
3108
3327
  # Lenovo
3109
3328
  # @ref: http://support.lenovo.com/en_GB/downloads/default.page?#
3110
3329
  #########
3111
- - regex: '; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3330
+ - regex: '; {0,2}(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
3112
3331
  device_replacement: '$1'
3113
3332
  brand_replacement: 'Lenovo'
3114
3333
  model_replacement: '$1'
3115
- - regex: '; *(Idea[Tp]ab)[ _]([^;/]+);? Build'
3334
+ - regex: '; {0,2}(Idea[Tp]ab)[ _]([^;/]{1,100});? Build'
3116
3335
  device_replacement: 'Lenovo $1 $2'
3117
3336
  brand_replacement: 'Lenovo'
3118
3337
  model_replacement: '$1 $2'
3119
- - regex: '; *(Idea(?:Tab|pad)) ?([^;/]+) Build'
3338
+ - regex: '; {0,2}(Idea(?:Tab|pad)) ?([^;/]{1,100}) Build'
3120
3339
  device_replacement: 'Lenovo $1 $2'
3121
3340
  brand_replacement: 'Lenovo'
3122
3341
  model_replacement: '$1 $2'
3123
- - regex: '; *(ThinkPad) ?(Tablet) Build/'
3342
+ - regex: '; {0,2}(ThinkPad) ?(Tablet) Build/'
3124
3343
  device_replacement: 'Lenovo $1 $2'
3125
3344
  brand_replacement: 'Lenovo'
3126
3345
  model_replacement: '$1 $2'
3127
- - regex: '; *(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.+?)(?:Build|[;/\)])'
3346
+ - regex: '; {0,2}(?:LNV-|)(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])(.{1,200}?)(?:Build|[;/\)])'
3128
3347
  device_replacement: 'Lenovo $1'
3129
3348
  brand_replacement: 'Lenovo'
3130
3349
  model_replacement: '$1'
@@ -3132,11 +3351,11 @@ device_parsers:
3132
3351
  device_replacement: 'Lenovo $1 $2 $3'
3133
3352
  brand_replacement: 'Lenovo'
3134
3353
  model_replacement: '$1 $2 $3'
3135
- - regex: '; *(?:Ideapad |)K1 Build/'
3354
+ - regex: '; {0,2}(?:Ideapad |)K1 Build/'
3136
3355
  device_replacement: 'Lenovo Ideapad K1'
3137
3356
  brand_replacement: 'Lenovo'
3138
3357
  model_replacement: 'Ideapad K1'
3139
- - regex: '; *(3GC101|3GW10[01]|A390) Build/'
3358
+ - regex: '; {0,2}(3GC101|3GW10[01]|A390) Build/'
3140
3359
  device_replacement: '$1'
3141
3360
  brand_replacement: 'Lenovo'
3142
3361
  model_replacement: '$1'
@@ -3149,7 +3368,7 @@ device_parsers:
3149
3368
  # Lexibook
3150
3369
  # @ref: http://www.lexibook.com/fr
3151
3370
  #########
3152
- - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3371
+ - regex: '; {0,2}(MFC\d+)[A-Z]{2}([^;,/]*),?(?: Build|\) AppleWebKit)'
3153
3372
  device_replacement: '$1$2'
3154
3373
  brand_replacement: 'Lexibook'
3155
3374
  model_replacement: '$1$2'
@@ -3158,23 +3377,23 @@ device_parsers:
3158
3377
  # LG
3159
3378
  # @ref: http://www.lg.com/uk/mobile
3160
3379
  #########
3161
- - regex: '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)'
3380
+ - regex: '; {0,2}(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]{1,30}|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) {0,2}(?:Build|;)'
3162
3381
  device_replacement: '$1'
3163
3382
  brand_replacement: 'LG'
3164
3383
  model_replacement: '$1'
3165
- - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) *(?:Build|[;\)])'
3384
+ - regex: '[;:] {0,2}(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+|) {0,2}(?:Build|[;\)])'
3166
3385
  device_replacement: '$1'
3167
3386
  brand_replacement: 'LG'
3168
3387
  model_replacement: '$1'
3169
- - regex: '; *(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3388
+ - regex: '; {0,2}(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
3170
3389
  device_replacement: '$1$2'
3171
3390
  brand_replacement: 'LG'
3172
3391
  model_replacement: '$2'
3173
- - regex: '; *(LG[ \-]|LG)([^;/]+)[;/]? Build'
3392
+ - regex: '; {0,2}(LG[ \-]|LG)([^;/]{1,100})[;/]? Build'
3174
3393
  device_replacement: '$1$2'
3175
3394
  brand_replacement: 'LG'
3176
3395
  model_replacement: '$2'
3177
- - regex: '^(LG)-([^;/]+)/ Mozilla/.*; Android'
3396
+ - regex: '^(LG)-([^;/]{1,100})/ Mozilla/.{0,200}; Android'
3178
3397
  device_replacement: '$1 $2'
3179
3398
  brand_replacement: 'LG'
3180
3399
  model_replacement: '$2'
@@ -3187,11 +3406,11 @@ device_parsers:
3187
3406
  # Malata
3188
3407
  # @ref: http://www.malata.com/en/products.aspx?classid=680
3189
3408
  #########
3190
- - regex: '; *((?:SMB|smb)[^;/]+?)(?: Build|\) AppleWebKit)'
3409
+ - regex: '; {0,2}((?:SMB|smb)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3191
3410
  device_replacement: '$1'
3192
3411
  brand_replacement: 'Malata'
3193
3412
  model_replacement: '$1'
3194
- - regex: '; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\) AppleWebKit)'
3413
+ - regex: '; {0,2}(?:Malata|MALATA) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3195
3414
  device_replacement: '$1'
3196
3415
  brand_replacement: 'Malata'
3197
3416
  model_replacement: '$1'
@@ -3200,7 +3419,7 @@ device_parsers:
3200
3419
  # Manta
3201
3420
  # @ref: http://www.manta.com.pl/en
3202
3421
  #########
3203
- - regex: '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\) AppleWebKit)'
3422
+ - regex: '; {0,2}(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\) AppleWebKit)'
3204
3423
  device_replacement: '$1'
3205
3424
  brand_replacement: 'Manta'
3206
3425
  model_replacement: '$1'
@@ -3209,7 +3428,7 @@ device_parsers:
3209
3428
  # Match
3210
3429
  # @ref: http://www.match.net.cn/products.asp
3211
3430
  #########
3212
- - regex: '; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\) AppleWebKit)'
3431
+ - regex: '; {0,2}(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\) AppleWebKit)'
3213
3432
  device_replacement: '$1'
3214
3433
  brand_replacement: 'Match'
3215
3434
  model_replacement: '$1'
@@ -3223,7 +3442,7 @@ device_parsers:
3223
3442
  # Maxx MT150, Maxx MQ601, Maxx M2020, Maxx Sleek MX463neo, Maxx MX525, Maxx MX192-Tune, Maxx Genx Droid 7 AX353,
3224
3443
  # @note: Need more User-Agents!!!
3225
3444
  #########
3226
- - regex: '; *(GenxDroid7|MSD7.*?|AX\d.*?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3445
+ - regex: '; {0,2}(GenxDroid7|MSD7.{0,200}?|AX\d.{0,200}?|Tab 701|Tab 722)(?: Build|\) AppleWebKit)'
3227
3446
  device_replacement: 'Maxx $1'
3228
3447
  brand_replacement: 'Maxx'
3229
3448
  model_replacement: '$1'
@@ -3232,11 +3451,11 @@ device_parsers:
3232
3451
  # Mediacom
3233
3452
  # @ref: http://www.mediacomeurope.it/
3234
3453
  #########
3235
- - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3454
+ - regex: '; {0,2}(M-PP[^;/]{1,30}|PhonePad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3236
3455
  device_replacement: 'Mediacom $1'
3237
3456
  brand_replacement: 'Mediacom'
3238
3457
  model_replacement: '$1'
3239
- - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+?)(?: Build|\) AppleWebKit)'
3458
+ - regex: '; {0,2}(M-MP[^;/]{1,30}|SmartPad ?\d{2,}[^;/]{1,30}?)(?: Build|\) AppleWebKit)'
3240
3459
  device_replacement: 'Mediacom $1'
3241
3460
  brand_replacement: 'Mediacom'
3242
3461
  model_replacement: '$1'
@@ -3245,12 +3464,12 @@ device_parsers:
3245
3464
  # Medion
3246
3465
  # @ref: http://www.medion.com/en/
3247
3466
  #########
3248
- - regex: '; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3467
+ - regex: '; {0,2}(?:MD_|)LIFETAB[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3249
3468
  regex_flag: 'i'
3250
3469
  device_replacement: 'Medion Lifetab $1'
3251
3470
  brand_replacement: 'Medion'
3252
3471
  model_replacement: 'Lifetab $1'
3253
- - regex: '; *MEDION ([^;/]+?)(?: Build|\) AppleWebKit)'
3472
+ - regex: '; {0,2}MEDION ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3254
3473
  device_replacement: 'Medion $1'
3255
3474
  brand_replacement: 'Medion'
3256
3475
  model_replacement: '$1'
@@ -3259,11 +3478,11 @@ device_parsers:
3259
3478
  # Meizu
3260
3479
  # @ref: http://www.meizu.com
3261
3480
  #########
3262
- - regex: '; *(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3481
+ - regex: '; {0,2}(M030|M031|M035|M040|M065|m9)(?: Build|\) AppleWebKit)'
3263
3482
  device_replacement: 'Meizu $1'
3264
3483
  brand_replacement: 'Meizu'
3265
3484
  model_replacement: '$1'
3266
- - regex: '; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\)])'
3485
+ - regex: '; {0,2}(?:meizu_|MEIZU )(.{1,200}?) {0,2}(?:Build|[;\)])'
3267
3486
  device_replacement: 'Meizu $1'
3268
3487
  brand_replacement: 'Meizu'
3269
3488
  model_replacement: '$1'
@@ -3272,28 +3491,28 @@ device_parsers:
3272
3491
  # Micromax
3273
3492
  # @ref: http://www.micromaxinfo.com
3274
3493
  #########
3275
- - regex: '; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3494
+ - regex: '; {0,2}(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
3276
3495
  regex_flag: 'i'
3277
3496
  device_replacement: 'Micromax $1$2'
3278
3497
  brand_replacement: 'Micromax'
3279
3498
  model_replacement: '$1$2'
3280
- - regex: '; *Micromax[ _](A\d{2,3}[^;/]*) Build'
3499
+ - regex: '; {0,2}Micromax[ _](A\d{2,3}[^;/]*) Build'
3281
3500
  regex_flag: 'i'
3282
3501
  device_replacement: 'Micromax $1'
3283
3502
  brand_replacement: 'Micromax'
3284
3503
  model_replacement: '$1'
3285
3504
  # be carefull here with Acer e.g. A500
3286
- - regex: '; *(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3505
+ - regex: '; {0,2}(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
3287
3506
  regex_flag: 'i'
3288
3507
  device_replacement: 'Micromax $1'
3289
3508
  brand_replacement: 'Micromax'
3290
3509
  model_replacement: '$1'
3291
- - regex: '; *Micromax[ _](P\d{3}[^;/]*) Build'
3510
+ - regex: '; {0,2}Micromax[ _](P\d{3}[^;/]*) Build'
3292
3511
  regex_flag: 'i'
3293
3512
  device_replacement: 'Micromax $1'
3294
3513
  brand_replacement: 'Micromax'
3295
3514
  model_replacement: '$1'
3296
- - regex: '; *(P\d{3}|P\d{3}\(Funbook\)) Build'
3515
+ - regex: '; {0,2}(P\d{3}|P\d{3}\(Funbook\)) Build'
3297
3516
  regex_flag: 'i'
3298
3517
  device_replacement: 'Micromax $1'
3299
3518
  brand_replacement: 'Micromax'
@@ -3303,7 +3522,7 @@ device_parsers:
3303
3522
  # Mito
3304
3523
  # @ref: http://new.mitomobile.com/
3305
3524
  #########
3306
- - regex: '; *(MITO)[ _\-]?([^;/]+?)(?: Build|\) AppleWebKit)'
3525
+ - regex: '; {0,2}(MITO)[ _\-]?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3307
3526
  regex_flag: 'i'
3308
3527
  device_replacement: '$1 $2'
3309
3528
  brand_replacement: 'Mito'
@@ -3313,7 +3532,7 @@ device_parsers:
3313
3532
  # Mobistel
3314
3533
  # @ref: http://www.mobistel.com/
3315
3534
  #########
3316
- - regex: '; *(Cynus)[ _](F5|T\d|.+?) *(?:Build|[;/\)])'
3535
+ - regex: '; {0,2}(Cynus)[ _](F5|T\d|.{1,200}?) {0,2}(?:Build|[;/\)])'
3317
3536
  regex_flag: 'i'
3318
3537
  device_replacement: '$1 $2'
3319
3538
  brand_replacement: 'Mobistel'
@@ -3323,12 +3542,12 @@ device_parsers:
3323
3542
  # Modecom
3324
3543
  # @ref: http://www.modecom.eu/tablets/portal/
3325
3544
  #########
3326
- - regex: '; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\) AppleWebKit)'
3545
+ - regex: '; {0,2}(MODECOM |)(FreeTab) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3327
3546
  regex_flag: 'i'
3328
3547
  device_replacement: '$1$2 $3'
3329
3548
  brand_replacement: 'Modecom'
3330
3549
  model_replacement: '$2 $3'
3331
- - regex: '; *(MODECOM )([^;/]+?)(?: Build|\) AppleWebKit)'
3550
+ - regex: '; {0,2}(MODECOM )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3332
3551
  regex_flag: 'i'
3333
3552
  device_replacement: '$1 $2'
3334
3553
  brand_replacement: 'Modecom'
@@ -3338,32 +3557,32 @@ device_parsers:
3338
3557
  # Motorola
3339
3558
  # @ref: http://www.motorola.com/us/shop-all-mobile-phones/
3340
3559
  #########
3341
- - regex: '; *(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3560
+ - regex: '; {0,2}(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
3342
3561
  device_replacement: 'Motorola $1'
3343
3562
  brand_replacement: 'Motorola'
3344
3563
  model_replacement: '$1'
3345
- - regex: '; *(Milestone )(XT[^;/]*) Build'
3564
+ - regex: '; {0,2}(Milestone )(XT[^;/]*) Build'
3346
3565
  device_replacement: 'Motorola $1$2'
3347
3566
  brand_replacement: 'Motorola'
3348
3567
  model_replacement: '$2'
3349
- - regex: '; *(Motoroi ?x|Droid X|DROIDX) Build'
3568
+ - regex: '; {0,2}(Motoroi ?x|Droid X|DROIDX) Build'
3350
3569
  regex_flag: 'i'
3351
3570
  device_replacement: 'Motorola $1'
3352
3571
  brand_replacement: 'Motorola'
3353
3572
  model_replacement: 'DROID X'
3354
- - regex: '; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3573
+ - regex: '; {0,2}(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
3355
3574
  device_replacement: 'Motorola $1'
3356
3575
  brand_replacement: 'Motorola'
3357
3576
  model_replacement: '$1'
3358
- - regex: '; *(A555|A85[34][^;/]*|A95[356]|ME[58]\d{2}\+?|ME600|ME632|ME722|MB\d{3}\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\d{3,4}[A-Z\+]*|CL[iI]Q|CL[iI]Q XT) Build'
3577
+ - regex: '; {0,2}(A555|A85[34][^;/]*|A95[356]|ME[58]\d{2}\+?|ME600|ME632|ME722|MB\d{3}\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\d{3,4}[A-Z\+]*|CL[iI]Q|CL[iI]Q XT) Build'
3359
3578
  device_replacement: '$1'
3360
3579
  brand_replacement: 'Motorola'
3361
3580
  model_replacement: '$1'
3362
- - regex: '; *(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]+) Build'
3581
+ - regex: '; {0,2}(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]{1,100}) Build'
3363
3582
  device_replacement: '$1$2'
3364
3583
  brand_replacement: 'Motorola'
3365
3584
  model_replacement: '$2'
3366
- - regex: '; *(Moto[_ ]?|MOT\-)([^;/]+) Build'
3585
+ - regex: '; {0,2}(Moto[_ ]?|MOT\-)([^;/]{1,100}) Build'
3367
3586
  device_replacement: '$1$2'
3368
3587
  brand_replacement: 'Motorola'
3369
3588
  model_replacement: '$2'
@@ -3372,7 +3591,7 @@ device_parsers:
3372
3591
  # MpMan
3373
3592
  # @ref: http://www.mpmaneurope.com
3374
3593
  #########
3375
- - regex: '; *((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\) AppleWebKit)'
3594
+ - regex: '; {0,2}((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\) AppleWebKit)'
3376
3595
  device_replacement: '$1'
3377
3596
  brand_replacement: 'Mpman'
3378
3597
  model_replacement: '$1'
@@ -3381,7 +3600,7 @@ device_parsers:
3381
3600
  # MSI
3382
3601
  # @ref: http://www.msi.com/product/windpad/
3383
3602
  #########
3384
- - regex: '; *(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
3603
+ - regex: '; {0,2}(?:MSI[ _]|)(Primo\d+|Enjoy[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3385
3604
  regex_flag: 'i'
3386
3605
  device_replacement: '$1'
3387
3606
  brand_replacement: 'Msi'
@@ -3391,7 +3610,7 @@ device_parsers:
3391
3610
  # Multilaser
3392
3611
  # http://www.multilaser.com.br/listagem_produtos.php?cat=5
3393
3612
  #########
3394
- - regex: '; *Multilaser[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3613
+ - regex: '; {0,2}Multilaser[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3395
3614
  device_replacement: '$1'
3396
3615
  brand_replacement: 'Multilaser'
3397
3616
  model_replacement: '$1'
@@ -3400,15 +3619,15 @@ device_parsers:
3400
3619
  # MyPhone
3401
3620
  # @ref: http://myphone.com.ph/
3402
3621
  #########
3403
- - regex: '; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3622
+ - regex: '; {0,2}(My)[_]?(Pad)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3404
3623
  device_replacement: '$1$2 $3'
3405
3624
  brand_replacement: 'MyPhone'
3406
3625
  model_replacement: '$1$2 $3'
3407
- - regex: '; *(My)\|?(Phone)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3626
+ - regex: '; {0,2}(My)\|?(Phone)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3408
3627
  device_replacement: '$1$2 $3'
3409
3628
  brand_replacement: 'MyPhone'
3410
3629
  model_replacement: '$3'
3411
- - regex: '; *(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3630
+ - regex: '; {0,2}(A\d+)[ _](Duo|)(?: Build|\) AppleWebKit)'
3412
3631
  regex_flag: 'i'
3413
3632
  device_replacement: '$1 $2'
3414
3633
  brand_replacement: 'MyPhone'
@@ -3418,7 +3637,7 @@ device_parsers:
3418
3637
  # Mytab
3419
3638
  # @ref: http://www.mytab.eu/en/category/mytab-products/
3420
3639
  #########
3421
- - regex: '; *(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3640
+ - regex: '; {0,2}(myTab[^;/]*)(?: Build|\) AppleWebKit)'
3422
3641
  device_replacement: '$1'
3423
3642
  brand_replacement: 'Mytab'
3424
3643
  model_replacement: '$1'
@@ -3427,7 +3646,7 @@ device_parsers:
3427
3646
  # Nabi
3428
3647
  # @ref: https://www.nabitablet.com
3429
3648
  #########
3430
- - regex: '; *(NABI2?-)([^;/]+?)(?: Build|\) AppleWebKit)'
3649
+ - regex: '; {0,2}(NABI2?-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3431
3650
  device_replacement: '$1$2'
3432
3651
  brand_replacement: 'Nabi'
3433
3652
  model_replacement: '$2'
@@ -3436,15 +3655,15 @@ device_parsers:
3436
3655
  # Nec Medias
3437
3656
  # @ref: http://www.n-keitai.com/
3438
3657
  #########
3439
- - regex: '; *(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3658
+ - regex: '; {0,2}(N-\d+[CDE])(?: Build|\) AppleWebKit)'
3440
3659
  device_replacement: '$1'
3441
3660
  brand_replacement: 'Nec'
3442
3661
  model_replacement: '$1'
3443
- - regex: '; ?(NEC-)(.*?)(?: Build|\) AppleWebKit)'
3662
+ - regex: '; ?(NEC-)(.{0,200}?)(?: Build|\) AppleWebKit)'
3444
3663
  device_replacement: '$1$2'
3445
3664
  brand_replacement: 'Nec'
3446
3665
  model_replacement: '$2'
3447
- - regex: '; *(LT-NA7)(?: Build|\) AppleWebKit)'
3666
+ - regex: '; {0,2}(LT-NA7)(?: Build|\) AppleWebKit)'
3448
3667
  device_replacement: '$1'
3449
3668
  brand_replacement: 'Nec'
3450
3669
  model_replacement: 'Lifetouch Note'
@@ -3453,7 +3672,7 @@ device_parsers:
3453
3672
  # Nextbook
3454
3673
  # @ref: http://nextbookusa.com
3455
3674
  #########
3456
- - regex: '; *(NXM\d+[A-Za-z0-9_]*|Next\d[A-Za-z0-9_ \-]*|NEXT\d[A-Za-z0-9_ \-]*|Nextbook [A-Za-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\);])'
3675
+ - regex: '; {0,2}(NXM\d+[A-Za-z0-9_]{0,50}|Next\d[A-Za-z0-9_ \-]{0,50}|NEXT\d[A-Za-z0-9_ \-]{0,50}|Nextbook [A-Za-z0-9_ ]{0,50}|DATAM803HC|M805)(?: Build|[\);])'
3457
3676
  device_replacement: '$1'
3458
3677
  brand_replacement: 'Nextbook'
3459
3678
  model_replacement: '$1'
@@ -3462,22 +3681,26 @@ device_parsers:
3462
3681
  # Nokia
3463
3682
  # @ref: http://www.nokia.com
3464
3683
  #########
3465
- - regex: '; *(Nokia)([ _\-]*)([^;/]*) Build'
3684
+ - regex: '; {0,2}(Nokia)([ _\-]{0,5})([^;/]{0,50}) Build'
3466
3685
  regex_flag: 'i'
3467
3686
  device_replacement: '$1$2$3'
3468
3687
  brand_replacement: 'Nokia'
3469
3688
  model_replacement: '$3'
3689
+ - regex: '; {0,2}(TA\-\d{4})(?: Build|\) AppleWebKit)'
3690
+ device_replacement: 'Nokia $1'
3691
+ brand_replacement: 'Nokia'
3692
+ model_replacement: '$1'
3470
3693
 
3471
3694
  #########
3472
3695
  # Nook
3473
3696
  # @ref:
3474
3697
  # TODO nook browser/1.0
3475
3698
  #########
3476
- - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\) AppleWebKit)'
3699
+ - regex: '; {0,2}(Nook ?|Barnes & Noble Nook |BN )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3477
3700
  device_replacement: '$1$2'
3478
3701
  brand_replacement: 'Nook'
3479
3702
  model_replacement: '$2'
3480
- - regex: '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3703
+ - regex: '; {0,2}(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\) AppleWebKit)'
3481
3704
  device_replacement: '$1$2'
3482
3705
  brand_replacement: 'Nook'
3483
3706
  model_replacement: '$2'
@@ -3490,7 +3713,7 @@ device_parsers:
3490
3713
  # Olivetti
3491
3714
  # @ref: http://www.olivetti.de/EN/Page/t02/view_html?idp=348
3492
3715
  #########
3493
- - regex: '; *(OP110|OliPad[^;/]+?)(?: Build|\) AppleWebKit)'
3716
+ - regex: '; {0,2}(OP110|OliPad[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3494
3717
  device_replacement: 'Olivetti $1'
3495
3718
  brand_replacement: 'Olivetti'
3496
3719
  model_replacement: '$1'
@@ -3501,7 +3724,7 @@ device_parsers:
3501
3724
  # @note: MID tablets might get matched by CobyKyros first
3502
3725
  # @models: (T107|MID(?:700[2-5]|7031|7108|7132|750[02]|8001|8500|9001|971[12])
3503
3726
  #########
3504
- - regex: '; *OMEGA[ _\-](MID[^;/]+?)(?: Build|\) AppleWebKit)'
3727
+ - regex: '; {0,2}OMEGA[ _\-](MID[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3505
3728
  device_replacement: 'Omega $1'
3506
3729
  brand_replacement: 'Omega'
3507
3730
  model_replacement: '$1'
@@ -3514,7 +3737,7 @@ device_parsers:
3514
3737
  # OpenPeak
3515
3738
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
3516
3739
  #########
3517
- - regex: '; *((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3740
+ - regex: '; {0,2}((?:CIUS|cius)[^;/]*)(?: Build|\) AppleWebKit)'
3518
3741
  device_replacement: 'Openpeak $1'
3519
3742
  brand_replacement: 'Openpeak'
3520
3743
  model_replacement: '$1'
@@ -3523,33 +3746,40 @@ device_parsers:
3523
3746
  # Oppo
3524
3747
  # @ref: http://en.oppo.com/products/
3525
3748
  #########
3526
- - regex: '; *(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d{0,1}|U70\d{1,2}T?|X90\d{1,2})(?: Build|\) AppleWebKit)'
3749
+ - regex: '; {0,2}(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d?|U70\d{1,2}T?|X90\d{1,2}|[AFR]\d{1,2}[a-z]{1,2})(?: Build|\) AppleWebKit)'
3527
3750
  device_replacement: 'Oppo $1'
3528
3751
  brand_replacement: 'Oppo'
3529
3752
  model_replacement: '$1'
3530
- - regex: '; *OPPO ?([^;/]+?)(?: Build|\) AppleWebKit)'
3753
+ - regex: '; {0,2}OPPO ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3531
3754
  device_replacement: 'Oppo $1'
3532
3755
  brand_replacement: 'Oppo'
3533
3756
  model_replacement: '$1'
3757
+ - regex: '; {0,2}(CPH\d{1,4}|RMX\d{1,4}|P[A-Z]{3}\d{2})(?: Build|\) AppleWebKit)'
3758
+ device_replacement: 'Oppo $1'
3759
+ brand_replacement: 'Oppo'
3760
+ - regex: '; {0,2}(A1601)(?: Build|\) AppleWebKit)'
3761
+ device_replacement: 'Oppo F1s'
3762
+ brand_replacement: 'Oppo'
3763
+ model_replacement: '$1'
3534
3764
 
3535
3765
  #########
3536
3766
  # Odys
3537
3767
  # @ref: http://odys.de
3538
3768
  #########
3539
- - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+?)(?: Build|\) AppleWebKit)'
3769
+ - regex: '; {0,2}(?:Odys\-|ODYS\-|ODYS )([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3540
3770
  device_replacement: 'Odys $1'
3541
3771
  brand_replacement: 'Odys'
3542
3772
  model_replacement: '$1'
3543
- - regex: '; *(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3773
+ - regex: '; {0,2}(SELECT) ?(7)(?: Build|\) AppleWebKit)'
3544
3774
  device_replacement: 'Odys $1 $2'
3545
3775
  brand_replacement: 'Odys'
3546
3776
  model_replacement: '$1 $2'
3547
- - regex: '; *(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3777
+ - regex: '; {0,2}(PEDI)_(PLUS)_(W)(?: Build|\) AppleWebKit)'
3548
3778
  device_replacement: 'Odys $1 $2 $3'
3549
3779
  brand_replacement: 'Odys'
3550
3780
  model_replacement: '$1 $2 $3'
3551
3781
  # Weltbild - Tablet PC 4 = Cat Phoenix = Odys Tablet PC 4?
3552
- - regex: '; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\) AppleWebKit)'
3782
+ - regex: '; {0,2}(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\) AppleWebKit)'
3553
3783
  device_replacement: 'Odys $1'
3554
3784
  brand_replacement: 'Odys'
3555
3785
  model_replacement: '$1'
@@ -3571,7 +3801,7 @@ device_parsers:
3571
3801
  # Orion
3572
3802
  # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
3573
3803
  #########
3574
- - regex: '; *(TP-\d+)(?: Build|\) AppleWebKit)'
3804
+ - regex: '; {0,2}(TP-\d+)(?: Build|\) AppleWebKit)'
3575
3805
  device_replacement: 'Orion $1'
3576
3806
  brand_replacement: 'Orion'
3577
3807
  model_replacement: '$1'
@@ -3580,7 +3810,7 @@ device_parsers:
3580
3810
  # PackardBell
3581
3811
  # @ref: http://www.packardbell.com/pb/en/AE/content/productgroup/tablets
3582
3812
  #########
3583
- - regex: '; *(G100W?)(?: Build|\) AppleWebKit)'
3813
+ - regex: '; {0,2}(G100W?)(?: Build|\) AppleWebKit)'
3584
3814
  device_replacement: 'PackardBell $1'
3585
3815
  brand_replacement: 'PackardBell'
3586
3816
  model_replacement: '$1'
@@ -3591,17 +3821,17 @@ device_parsers:
3591
3821
  # @models: T11, T21, T31, P11, P51, Eluga Power, Eluga DL1
3592
3822
  # @models: (tab) Toughpad FZ-A1, Toughpad JT-B1
3593
3823
  #########
3594
- - regex: '; *(Panasonic)[_ ]([^;/]+?)(?: Build|\) AppleWebKit)'
3824
+ - regex: '; {0,2}(Panasonic)[_ ]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3595
3825
  device_replacement: '$1 $2'
3596
3826
  brand_replacement: '$1'
3597
3827
  model_replacement: '$2'
3598
3828
  # Toughpad
3599
- - regex: '; *(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3829
+ - regex: '; {0,2}(FZ-A1B|JT-B1)(?: Build|\) AppleWebKit)'
3600
3830
  device_replacement: 'Panasonic $1'
3601
3831
  brand_replacement: 'Panasonic'
3602
3832
  model_replacement: '$1'
3603
3833
  # Eluga Power
3604
- - regex: '; *(dL1|DL1)(?: Build|\) AppleWebKit)'
3834
+ - regex: '; {0,2}(dL1|DL1)(?: Build|\) AppleWebKit)'
3605
3835
  device_replacement: 'Panasonic $1'
3606
3836
  brand_replacement: 'Panasonic'
3607
3837
  model_replacement: '$1'
@@ -3612,15 +3842,15 @@ device_parsers:
3612
3842
  # @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
3613
3843
  # @models: ADR8995, ADR910L, ADR930VW, C790, CDM8992, CDM8999, IS06, IS11PT, P2000, P2020, P2030, P4100, P5000, P6010, P6020, P6030, P7000, P7040, P8000, P8010, P9020, P9050, P9060, P9070, P9090, PT001, PT002, PT003, TXT8040, TXT8045, VEGA PTL21
3614
3844
  #########
3615
- - regex: '; *(SKY[ _]|)(IM\-[AT]\d{3}[^;/]+).* Build/'
3845
+ - regex: '; {0,2}(SKY[ _]|)(IM\-[AT]\d{3}[^;/]{1,100}).{0,30} Build/'
3616
3846
  device_replacement: 'Pantech $1$2'
3617
3847
  brand_replacement: 'Pantech'
3618
3848
  model_replacement: '$1$2'
3619
- - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3849
+ - regex: '; {0,2}((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/'
3620
3850
  device_replacement: '$1'
3621
3851
  brand_replacement: 'Pantech'
3622
3852
  model_replacement: '$1'
3623
- - regex: '; *Pantech([^;/]+).* Build/'
3853
+ - regex: '; {0,2}Pantech([^;/]{1,30}).{0,200}? Build/'
3624
3854
  device_replacement: 'Pantech $1'
3625
3855
  brand_replacement: 'Pantech'
3626
3856
  model_replacement: '$1'
@@ -3629,7 +3859,7 @@ device_parsers:
3629
3859
  # Papayre
3630
3860
  # @ref: http://grammata.es/
3631
3861
  #########
3632
- - regex: '; *(papyre)[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3862
+ - regex: '; {0,2}(papyre)[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3633
3863
  regex_flag: 'i'
3634
3864
  device_replacement: '$1 $2'
3635
3865
  brand_replacement: 'Papyre'
@@ -3639,7 +3869,7 @@ device_parsers:
3639
3869
  # Pearl
3640
3870
  # @ref: http://www.pearl.de/c-1540.shtml
3641
3871
  #########
3642
- - regex: '; *(?:Touchlet )?(X10\.[^;/]+?)(?: Build|\) AppleWebKit)'
3872
+ - regex: '; {0,2}(?:Touchlet )?(X10\.[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3643
3873
  device_replacement: 'Pearl $1'
3644
3874
  brand_replacement: 'Pearl'
3645
3875
  model_replacement: '$1'
@@ -3652,11 +3882,11 @@ device_parsers:
3652
3882
  device_replacement: 'Phicomm $1'
3653
3883
  brand_replacement: 'Phicomm'
3654
3884
  model_replacement: '$1'
3655
- - regex: '; PHICOMM ([^;/]+?)(?: Build|\) AppleWebKit)'
3885
+ - regex: '; PHICOMM ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3656
3886
  device_replacement: 'Phicomm $1'
3657
3887
  brand_replacement: 'Phicomm'
3658
3888
  model_replacement: '$1'
3659
- - regex: '; *(FWS\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
3889
+ - regex: '; {0,2}(FWS\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3660
3890
  device_replacement: 'Phicomm $1'
3661
3891
  brand_replacement: 'Phicomm'
3662
3892
  model_replacement: '$1'
@@ -3668,11 +3898,11 @@ device_parsers:
3668
3898
  # @ref: http://www.support.philips.com/support/catalog/products.jsp?_dyncharset=UTF-8&country=&categoryid=ENTERTAINMENT_TABLETS_SU_CN_CARE&userLanguage=en&navCount=0&groupId=&catalogType=&navAction=push&userCountry=cn&title=Entertainment+Tablets&cateId=TABLETS_CA_CN_CARE
3669
3899
  #########
3670
3900
  # @note: this a best guess according to available philips models. Need more User-Agents
3671
- - regex: '; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\) AppleWebKit)'
3901
+ - regex: '; {0,2}(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\) AppleWebKit)'
3672
3902
  device_replacement: '$1'
3673
3903
  brand_replacement: 'Philips'
3674
3904
  model_replacement: '$1'
3675
- - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
3905
+ - regex: '; {0,2}(?:Philips|PHILIPS)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3676
3906
  device_replacement: 'Philips $1'
3677
3907
  brand_replacement: 'Philips'
3678
3908
  model_replacement: '$1'
@@ -3681,7 +3911,7 @@ device_parsers:
3681
3911
  # Pipo
3682
3912
  # @ref: http://www.pipo.cn/En/
3683
3913
  #########
3684
- - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3914
+ - regex: 'Android 4\..{0,200}; {0,2}(M[12356789]|U[12368]|S[123])\ ?(pro)?(?: Build|\) AppleWebKit)'
3685
3915
  device_replacement: 'Pipo $1$2'
3686
3916
  brand_replacement: 'Pipo'
3687
3917
  model_replacement: '$1$2'
@@ -3690,7 +3920,7 @@ device_parsers:
3690
3920
  # Ployer
3691
3921
  # @ref: http://en.ployer.cn/
3692
3922
  #########
3693
- - regex: '; *(MOMO[^;/]+?)(?: Build|\) AppleWebKit)'
3923
+ - regex: '; {0,2}(MOMO[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3694
3924
  device_replacement: '$1'
3695
3925
  brand_replacement: 'Ployer'
3696
3926
  model_replacement: '$1'
@@ -3699,11 +3929,11 @@ device_parsers:
3699
3929
  # Polaroid/ Acho
3700
3930
  # @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
3701
3931
  #########
3702
- - regex: '; *(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*?)(\/[^;/]*|)(?: Build|\) AppleWebKit)'
3932
+ - regex: '; {0,2}(?:Polaroid[ _]|)((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]{0,30}?)(\/[^;/]{0,30}|)(?: Build|\) AppleWebKit)'
3703
3933
  device_replacement: '$1'
3704
3934
  brand_replacement: 'Polaroid'
3705
3935
  model_replacement: '$1'
3706
- - regex: '; *(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3936
+ - regex: '; {0,2}(?:Polaroid )(Tablet)(?: Build|\) AppleWebKit)'
3707
3937
  device_replacement: '$1'
3708
3938
  brand_replacement: 'Polaroid'
3709
3939
  model_replacement: '$1'
@@ -3713,7 +3943,7 @@ device_parsers:
3713
3943
  # @ref: http://pompmobileshop.com/
3714
3944
  #########
3715
3945
  #~ TODO
3716
- - regex: '; *(POMP)[ _\-](.+?) *(?:Build|[;/\)])'
3946
+ - regex: '; {0,2}(POMP)[ _\-](.{1,200}?) {0,2}(?:Build|[;/\)])'
3717
3947
  device_replacement: '$1 $2'
3718
3948
  brand_replacement: 'Pomp'
3719
3949
  model_replacement: '$2'
@@ -3722,11 +3952,11 @@ device_parsers:
3722
3952
  # Positivo
3723
3953
  # @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
3724
3954
  #########
3725
- - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3955
+ - regex: '; {0,2}(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\) AppleWebKit)'
3726
3956
  device_replacement: '$1'
3727
3957
  brand_replacement: 'Positivo'
3728
3958
  model_replacement: '$1'
3729
- - regex: '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\) AppleWebKit)'
3959
+ - regex: '; {0,2}(?:Positivo |)((?:YPY|Ypy)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3730
3960
  device_replacement: '$1'
3731
3961
  brand_replacement: 'Positivo'
3732
3962
  model_replacement: '$1'
@@ -3736,15 +3966,15 @@ device_parsers:
3736
3966
  # @ref: http://www.pointofview-online.com/default2.php
3737
3967
  # @TODO: Smartphone Models MOB-3515, MOB-5045-B missing
3738
3968
  #########
3739
- - regex: '; *(MOB-[^;/]+?)(?: Build|\) AppleWebKit)'
3969
+ - regex: '; {0,2}(MOB-[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3740
3970
  device_replacement: '$1'
3741
3971
  brand_replacement: 'POV'
3742
3972
  model_replacement: '$1'
3743
- - regex: '; *POV[ _\-]([^;/]+?)(?: Build|\) AppleWebKit)'
3973
+ - regex: '; {0,2}POV[ _\-]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3744
3974
  device_replacement: 'POV $1'
3745
3975
  brand_replacement: 'POV'
3746
3976
  model_replacement: '$1'
3747
- - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3977
+ - regex: '; {0,2}((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*)(?: Build|\) AppleWebKit)'
3748
3978
  device_replacement: 'POV $1'
3749
3979
  brand_replacement: 'POV'
3750
3980
  model_replacement: '$1'
@@ -3754,7 +3984,7 @@ device_parsers:
3754
3984
  # @ref: http://www.prestigio.com/catalogue/MultiPhones
3755
3985
  # @ref: http://www.prestigio.com/catalogue/MultiPads
3756
3986
  #########
3757
- - regex: '; *(?:Prestigio |)((?:PAP|PMP)\d[^;/]+?)(?: Build|\) AppleWebKit)'
3987
+ - regex: '; {0,2}(?:Prestigio |)((?:PAP|PMP)\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3758
3988
  device_replacement: 'Prestigio $1'
3759
3989
  brand_replacement: 'Prestigio'
3760
3990
  model_replacement: '$1'
@@ -3763,7 +3993,7 @@ device_parsers:
3763
3993
  # Proscan
3764
3994
  # @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
3765
3995
  #########
3766
- - regex: '; *(PLT[0-9]{4}.*?)(?: Build|\) AppleWebKit)'
3996
+ - regex: '; {0,2}(PLT[0-9]{4}.{0,200}?)(?: Build|\) AppleWebKit)'
3767
3997
  device_replacement: '$1'
3768
3998
  brand_replacement: 'Proscan'
3769
3999
  model_replacement: '$1'
@@ -3772,15 +4002,15 @@ device_parsers:
3772
4002
  # QMobile
3773
4003
  # @ref: http://www.qmobile.com.pk/
3774
4004
  #########
3775
- - regex: '; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
4005
+ - regex: '; {0,2}(A2|A5|A8|A900)_?(Classic|)(?: Build|\) AppleWebKit)'
3776
4006
  device_replacement: '$1 $2'
3777
4007
  brand_replacement: 'Qmobile'
3778
4008
  model_replacement: '$1 $2'
3779
- - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
4009
+ - regex: '; {0,2}(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\) AppleWebKit)'
3780
4010
  device_replacement: 'Qmobile $2 $3'
3781
4011
  brand_replacement: 'Qmobile'
3782
4012
  model_replacement: '$2 $3'
3783
- - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\) AppleWebKit)'
4013
+ - regex: '; {0,2}(Q\-?[Mm]obile)[_ ](A[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3784
4014
  device_replacement: 'Qmobile $2'
3785
4015
  brand_replacement: 'Qmobile'
3786
4016
  model_replacement: '$2'
@@ -3789,11 +4019,11 @@ device_parsers:
3789
4019
  # Qmobilevn
3790
4020
  # @ref: http://qmobile.vn/san-pham.html
3791
4021
  #########
3792
- - regex: '; *(Q\-Smart)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4022
+ - regex: '; {0,2}(Q\-Smart)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3793
4023
  device_replacement: '$1 $2'
3794
4024
  brand_replacement: 'Qmobilevn'
3795
4025
  model_replacement: '$2'
3796
- - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+?)(?: Build|\) AppleWebKit)'
4026
+ - regex: '; {0,2}(Q\-?[Mm]obile)[ _\-](S[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3797
4027
  device_replacement: '$1 $2'
3798
4028
  brand_replacement: 'Qmobilevn'
3799
4029
  model_replacement: '$2'
@@ -3802,7 +4032,7 @@ device_parsers:
3802
4032
  # Quanta
3803
4033
  # @ref: ?
3804
4034
  #########
3805
- - regex: '; *(TA1013)(?: Build|\) AppleWebKit)'
4035
+ - regex: '; {0,2}(TA1013)(?: Build|\) AppleWebKit)'
3806
4036
  device_replacement: '$1'
3807
4037
  brand_replacement: 'Quanta'
3808
4038
  model_replacement: '$1'
@@ -3825,7 +4055,7 @@ device_parsers:
3825
4055
  # @ref: http://www.rock-chips.com/a/cn/product/index.html
3826
4056
  # @note: manufacturer sells chipsets - I assume that these UAs are dev-boards
3827
4057
  #########
3828
- - regex: '; *(RK\d+),?(?: Build|\) AppleWebKit)'
4058
+ - regex: '; {0,2}(RK\d+),?(?: Build|\) AppleWebKit)'
3829
4059
  device_replacement: '$1'
3830
4060
  brand_replacement: 'Rockchip'
3831
4061
  model_replacement: '$1'
@@ -3838,55 +4068,55 @@ device_parsers:
3838
4068
  # Samsung Android Devices
3839
4069
  # @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
3840
4070
  #########
3841
- - regex: '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
4071
+ - regex: '; {0,2}(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]{0,100})\/?[^;/]{0,50} Build/'
3842
4072
  device_replacement: 'Samsung $1$2'
3843
4073
  brand_replacement: 'Samsung'
3844
4074
  model_replacement: '$2'
3845
- - regex: '; *(Google |)(Nexus [Ss](?: 4G|)) Build/'
4075
+ - regex: '; {0,2}(Google |)(Nexus [Ss](?: 4G|)) Build/'
3846
4076
  device_replacement: 'Samsung $1$2'
3847
4077
  brand_replacement: 'Samsung'
3848
4078
  model_replacement: '$2'
3849
- - regex: '; *(SAMSUNG |Samsung )([^\/]*)\/[^ ]* Build/'
4079
+ - regex: '; {0,2}(SAMSUNG |Samsung )([^\/]{0,50})\/[^ ]{0,50} Build/'
3850
4080
  device_replacement: 'Samsung $2'
3851
4081
  brand_replacement: 'Samsung'
3852
4082
  model_replacement: '$2'
3853
- - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
4083
+ - regex: '; {0,2}(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/'
3854
4084
  device_replacement: 'Samsung $1'
3855
4085
  brand_replacement: 'Samsung'
3856
4086
  model_replacement: '$1'
3857
- - regex: '; *(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]+) Build'
4087
+ - regex: '; {0,2}(SAMSUNG[ _\-]|)(?:SAMSUNG[ _\-])([^;/]{1,100}) Build'
3858
4088
  device_replacement: 'Samsung $2'
3859
4089
  brand_replacement: 'Samsung'
3860
4090
  model_replacement: '$2'
3861
- - regex: '; *(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
4091
+ - regex: '; {0,2}(SAMSUNG-|)(GT\-[BINPS]\d{4}[^\/]{0,50})(\/[^ ]{0,50}) Build'
3862
4092
  device_replacement: 'Samsung $1$2$3'
3863
4093
  brand_replacement: 'Samsung'
3864
4094
  model_replacement: '$2'
3865
- - regex: '(?:; *|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
4095
+ - regex: '(?:; {0,2}|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
3866
4096
  device_replacement: 'Samsung $1'
3867
4097
  brand_replacement: 'Samsung'
3868
4098
  model_replacement: '$1'
3869
- - regex: '; (SAMSUNG-)([A-Za-z0-9\-]+).* Build/'
4099
+ - regex: '; (SAMSUNG-)([A-Za-z0-9\-]{0,50}).{0,200} Build/'
3870
4100
  device_replacement: 'Samsung $1$2'
3871
4101
  brand_replacement: 'Samsung'
3872
4102
  model_replacement: '$2'
3873
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4103
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3874
4104
  device_replacement: 'Samsung $1'
3875
4105
  brand_replacement: 'Samsung'
3876
4106
  model_replacement: '$1'
3877
- - regex: '; *((?:SC)\-[A-Za-z0-9 ]+)(/?[^ ]*|)\)'
4107
+ - regex: '; {0,2}((?:SC)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|)\)'
3878
4108
  device_replacement: 'Samsung $1'
3879
4109
  brand_replacement: 'Samsung'
3880
4110
  model_replacement: '$1'
3881
- - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build'
4111
+ - regex: ' ((?:SCH)\-[A-Za-z0-9 ]{1,50})(/?[^ ]*|) Build'
3882
4112
  device_replacement: 'Samsung $1'
3883
4113
  brand_replacement: 'Samsung'
3884
4114
  model_replacement: '$1'
3885
- - regex: '; *(Behold ?(?:2|II)|YP\-G[^;/]+|EK-GC100|SCL21|I9300) Build'
4115
+ - regex: '; {0,2}(Behold ?(?:2|II)|YP\-G[^;/]{1,100}|EK-GC100|SCL21|I9300) Build'
3886
4116
  device_replacement: 'Samsung $1'
3887
4117
  brand_replacement: 'Samsung'
3888
4118
  model_replacement: '$1'
3889
- - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
4119
+ - regex: '; {0,2}((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9]{5,6})[\)]'
3890
4120
  device_replacement: 'Samsung $1'
3891
4121
  brand_replacement: 'Samsung'
3892
4122
  model_replacement: '$1'
@@ -3896,11 +4126,11 @@ device_parsers:
3896
4126
  # @ref: http://www.sharp-phone.com/en/index.html
3897
4127
  # @ref: http://www.android.com/devices/?country=all&m=sharp
3898
4128
  #########
3899
- - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+?)(?: Build|\) AppleWebKit)'
4129
+ - regex: '; {0,2}(SH\-?\d\d[^;/]{1,100}|SBM\d[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3900
4130
  device_replacement: '$1'
3901
4131
  brand_replacement: 'Sharp'
3902
4132
  model_replacement: '$1'
3903
- - regex: '; *(SHARP[ -])([^;/]+?)(?: Build|\) AppleWebKit)'
4133
+ - regex: '; {0,2}(SHARP[ -])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3904
4134
  device_replacement: '$1$2'
3905
4135
  brand_replacement: 'Sharp'
3906
4136
  model_replacement: '$2'
@@ -3909,15 +4139,15 @@ device_parsers:
3909
4139
  # Simvalley
3910
4140
  # @ref: http://www.simvalley-mobile.de/
3911
4141
  #########
3912
- - regex: '; *(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
4142
+ - regex: '; {0,2}(SPX[_\-]\d[^;/]*)(?: Build|\) AppleWebKit)'
3913
4143
  device_replacement: '$1'
3914
4144
  brand_replacement: 'Simvalley'
3915
4145
  model_replacement: '$1'
3916
- - regex: '; *(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
4146
+ - regex: '; {0,2}(SX7\-PEARL\.GmbH)(?: Build|\) AppleWebKit)'
3917
4147
  device_replacement: '$1'
3918
4148
  brand_replacement: 'Simvalley'
3919
4149
  model_replacement: '$1'
3920
- - regex: '; *(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
4150
+ - regex: '; {0,2}(SP[T]?\-\d{2}[^;/]*)(?: Build|\) AppleWebKit)'
3921
4151
  device_replacement: '$1'
3922
4152
  brand_replacement: 'Simvalley'
3923
4153
  model_replacement: '$1'
@@ -3927,7 +4157,7 @@ device_parsers:
3927
4157
  # @ref: http://www.sk-w.com/phone/phone_list.jsp
3928
4158
  # @ref: http://www.android.com/devices/?country=all&m=sk-telesys
3929
4159
  #########
3930
- - regex: '; *(SK\-.*?)(?: Build|\) AppleWebKit)'
4160
+ - regex: '; {0,2}(SK\-.{0,200}?)(?: Build|\) AppleWebKit)'
3931
4161
  device_replacement: '$1'
3932
4162
  brand_replacement: 'SKtelesys'
3933
4163
  model_replacement: '$1'
@@ -3936,11 +4166,11 @@ device_parsers:
3936
4166
  # Skytex
3937
4167
  # @ref: http://skytex.com/android
3938
4168
  #########
3939
- - regex: '; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\) AppleWebKit)'
4169
+ - regex: '; {0,2}(?:SKYTEX|SX)-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3940
4170
  device_replacement: '$1'
3941
4171
  brand_replacement: 'Skytex'
3942
4172
  model_replacement: '$1'
3943
- - regex: '; *(IMAGINE [^;/]+?)(?: Build|\) AppleWebKit)'
4173
+ - regex: '; {0,2}(IMAGINE [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3944
4174
  device_replacement: '$1'
3945
4175
  brand_replacement: 'Skytex'
3946
4176
  model_replacement: '$1'
@@ -3950,7 +4180,7 @@ device_parsers:
3950
4180
  # @ref: http://en.smartdevices.com.cn/Products/
3951
4181
  # @models: Z8, X7, U7H, U7, T30, T20, Ten3, V5-II, T7-3G, SmartQ5, K7, S7, Q8, T19, Ten2, Ten, R10, T7, R7, V5, V7, SmartQ7
3952
4182
  #########
3953
- - regex: '; *(SmartQ) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4183
+ - regex: '; {0,2}(SmartQ) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3954
4184
  device_replacement: '$1 $2'
3955
4185
  brand_replacement: '$1'
3956
4186
  model_replacement: '$2'
@@ -3960,7 +4190,7 @@ device_parsers:
3960
4190
  # @ref: http://www.smartbitt.com/
3961
4191
  # @missing: SBT Useragents
3962
4192
  #########
3963
- - regex: '; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\) AppleWebKit)'
4193
+ - regex: '; {0,2}(WF7C|WF10C|SBT[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
3964
4194
  device_replacement: '$1'
3965
4195
  brand_replacement: 'Smartbitt'
3966
4196
  model_replacement: '$1'
@@ -3969,15 +4199,15 @@ device_parsers:
3969
4199
  # Softbank (Operator Branded Devices)
3970
4200
  # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
3971
4201
  #########
3972
- - regex: '; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
4202
+ - regex: '; {0,2}(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
3973
4203
  device_replacement: '$1'
3974
4204
  brand_replacement: 'Sharp'
3975
4205
  model_replacement: '$1'
3976
- - regex: '; *(003P|101P|101P11C|102P) Build'
4206
+ - regex: '; {0,2}(003P|101P|101P11C|102P) Build'
3977
4207
  device_replacement: '$1'
3978
4208
  brand_replacement: 'Panasonic'
3979
4209
  model_replacement: '$1'
3980
- - regex: '; *(00\dZ) Build/'
4210
+ - regex: '; {0,2}(00\dZ) Build/'
3981
4211
  device_replacement: '$1'
3982
4212
  brand_replacement: 'ZTE'
3983
4213
  model_replacement: '$1'
@@ -3985,11 +4215,11 @@ device_parsers:
3985
4215
  device_replacement: '$1'
3986
4216
  brand_replacement: 'HTC'
3987
4217
  model_replacement: '$1'
3988
- - regex: '; *(001HT|X06HT) Build'
4218
+ - regex: '; {0,2}(001HT|X06HT) Build'
3989
4219
  device_replacement: '$1'
3990
4220
  brand_replacement: 'HTC'
3991
4221
  model_replacement: '$1'
3992
- - regex: '; *(201M) Build'
4222
+ - regex: '; {0,2}(201M) Build'
3993
4223
  device_replacement: '$1'
3994
4224
  brand_replacement: 'Motorola'
3995
4225
  model_replacement: 'XT902'
@@ -3999,11 +4229,11 @@ device_parsers:
3999
4229
  # @ref: http://www.trekstor.co.uk/surftabs-en.html
4000
4230
  # @note: Must come before SonyEricsson
4001
4231
  #########
4002
- - regex: '; *(ST\d{4}.*)Build/ST'
4232
+ - regex: '; {0,2}(ST\d{4}.{0,200})Build/ST'
4003
4233
  device_replacement: 'Trekstor $1'
4004
4234
  brand_replacement: 'Trekstor'
4005
4235
  model_replacement: '$1'
4006
- - regex: '; *(ST\d{4}.*?)(?: Build|\) AppleWebKit)'
4236
+ - regex: '; {0,2}(ST\d{4}.{0,200}?)(?: Build|\) AppleWebKit)'
4007
4237
  device_replacement: 'Trekstor $1'
4008
4238
  brand_replacement: 'Trekstor'
4009
4239
  model_replacement: '$1'
@@ -4015,16 +4245,16 @@ device_parsers:
4015
4245
  # @TODO: type!
4016
4246
  #########
4017
4247
  # android matchers
4018
- - regex: '; *(Sony ?Ericsson ?)([^;/]+) Build'
4248
+ - regex: '; {0,2}(Sony ?Ericsson ?)([^;/]{1,100}) Build'
4019
4249
  device_replacement: '$1$2'
4020
4250
  brand_replacement: 'SonyEricsson'
4021
4251
  model_replacement: '$2'
4022
- - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
4252
+ - regex: '; {0,2}((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build'
4023
4253
  device_replacement: '$1'
4024
4254
  brand_replacement: 'SonyEricsson'
4025
4255
  model_replacement: '$1'
4026
4256
  # TODO X\d+ is wrong
4027
- - regex: '; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]*) Build'
4257
+ - regex: '; {0,2}(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]{0,50}) Build'
4028
4258
  regex_flag: 'i'
4029
4259
  device_replacement: '$1'
4030
4260
  brand_replacement: 'SonyEricsson'
@@ -4036,31 +4266,31 @@ device_parsers:
4036
4266
  # @ref: http://www.sonymobile.com/global-en/products/phones/
4037
4267
  # @ref: http://www.sony.jp/tablet/
4038
4268
  #########
4039
- - regex: '; Sony (Tablet[^;/]+?)(?: Build|\) AppleWebKit)'
4269
+ - regex: '; Sony (Tablet[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4040
4270
  device_replacement: 'Sony $1'
4041
4271
  brand_replacement: 'Sony'
4042
4272
  model_replacement: '$1'
4043
- - regex: '; Sony ([^;/]+?)(?: Build|\) AppleWebKit)'
4273
+ - regex: '; Sony ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4044
4274
  device_replacement: 'Sony $1'
4045
4275
  brand_replacement: 'Sony'
4046
4276
  model_replacement: '$1'
4047
- - regex: '; *(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
4277
+ - regex: '; {0,2}(Sony)([A-Za-z0-9\-]+)(?: Build|\) AppleWebKit)'
4048
4278
  device_replacement: '$1 $2'
4049
4279
  brand_replacement: '$1'
4050
4280
  model_replacement: '$2'
4051
- - regex: '; *(Xperia [^;/]+?)(?: Build|\) AppleWebKit)'
4281
+ - regex: '; {0,2}(Xperia [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4052
4282
  device_replacement: '$1'
4053
4283
  brand_replacement: 'Sony'
4054
4284
  model_replacement: '$1'
4055
- - regex: '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2})(?: Build|\) AppleWebKit)'
4285
+ - regex: '; {0,2}(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2})(?: Build|\) AppleWebKit)'
4056
4286
  device_replacement: '$1'
4057
4287
  brand_replacement: 'Sony'
4058
4288
  model_replacement: '$1'
4059
- - regex: '; *(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4289
+ - regex: '; {0,2}(SGP\d{3}|SGPT\d{2})(?: Build|\) AppleWebKit)'
4060
4290
  device_replacement: '$1'
4061
4291
  brand_replacement: 'Sony'
4062
4292
  model_replacement: '$1'
4063
- - regex: '; *(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4293
+ - regex: '; {0,2}(NW-Z1000Series)(?: Build|\) AppleWebKit)'
4064
4294
  device_replacement: '$1'
4065
4295
  brand_replacement: 'Sony'
4066
4296
  model_replacement: '$1'
@@ -4083,7 +4313,7 @@ device_parsers:
4083
4313
  # Spice
4084
4314
  # @ref: http://www.spicemobilephones.co.in/
4085
4315
  #########
4086
- - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4316
+ - regex: '; {0,2}((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?|)([Mm][Ii])([ _\-]|)(\d{3}[^;/]*)(?: Build|\) AppleWebKit)'
4087
4317
  device_replacement: '$1$2$3$4'
4088
4318
  brand_replacement: 'Spice'
4089
4319
  model_replacement: 'Mi$4'
@@ -4092,7 +4322,7 @@ device_parsers:
4092
4322
  # Sprint (Operator Branded Devices)
4093
4323
  # @ref:
4094
4324
  #########
4095
- - regex: '; *(Sprint )(.+?) *(?:Build|[;/])'
4325
+ - regex: '; {0,2}(Sprint )(.{1,200}?) {0,2}(?:Build|[;/])'
4096
4326
  device_replacement: '$1$2'
4097
4327
  brand_replacement: 'Sprint'
4098
4328
  model_replacement: '$2'
@@ -4105,7 +4335,7 @@ device_parsers:
4105
4335
  # Tagi
4106
4336
  # @ref: ??
4107
4337
  #########
4108
- - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\) AppleWebKit)'
4338
+ - regex: '; {0,2}(TAGI[ ]?)(MID) ?([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4109
4339
  device_replacement: '$1$2$3'
4110
4340
  brand_replacement: 'Tagi'
4111
4341
  model_replacement: '$2$3'
@@ -4114,7 +4344,7 @@ device_parsers:
4114
4344
  # Tecmobile
4115
4345
  # @ref: http://www.tecmobile.com/
4116
4346
  #########
4117
- - regex: '; *(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4347
+ - regex: '; {0,2}(Oyster500|Opal 800)(?: Build|\) AppleWebKit)'
4118
4348
  device_replacement: 'Tecmobile $1'
4119
4349
  brand_replacement: 'Tecmobile'
4120
4350
  model_replacement: '$1'
@@ -4123,7 +4353,7 @@ device_parsers:
4123
4353
  # Tecno
4124
4354
  # @ref: www.tecno-mobile.com/‎
4125
4355
  #########
4126
- - regex: '; *(TECNO[ _])([^;/]+?)(?: Build|\) AppleWebKit)'
4356
+ - regex: '; {0,2}(TECNO[ _])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4127
4357
  device_replacement: '$1$2'
4128
4358
  brand_replacement: 'Tecno'
4129
4359
  model_replacement: '$2'
@@ -4132,7 +4362,7 @@ device_parsers:
4132
4362
  # Telechips, Techvision evaluation boards
4133
4363
  # @ref:
4134
4364
  #########
4135
- - regex: '; *Android for (Telechips|Techvision) ([^ ]+) '
4365
+ - regex: '; {0,2}Android for (Telechips|Techvision) ([^ ]+) '
4136
4366
  regex_flag: 'i'
4137
4367
  device_replacement: '$1 $2'
4138
4368
  brand_replacement: '$1'
@@ -4143,7 +4373,7 @@ device_parsers:
4143
4373
  # @ref: http://www.telstra.com.au/home-phone/thub-2/
4144
4374
  # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
4145
4375
  #########
4146
- - regex: '; *(T-Hub2)(?: Build|\) AppleWebKit)'
4376
+ - regex: '; {0,2}(T-Hub2)(?: Build|\) AppleWebKit)'
4147
4377
  device_replacement: '$1'
4148
4378
  brand_replacement: 'Telstra'
4149
4379
  model_replacement: '$1'
@@ -4152,7 +4382,7 @@ device_parsers:
4152
4382
  # Terra
4153
4383
  # @ref: http://www.wortmann.de/
4154
4384
  #########
4155
- - regex: '; *(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4385
+ - regex: '; {0,2}(PAD) ?(100[12])(?: Build|\) AppleWebKit)'
4156
4386
  device_replacement: 'Terra $1$2'
4157
4387
  brand_replacement: 'Terra'
4158
4388
  model_replacement: '$1$2'
@@ -4161,7 +4391,7 @@ device_parsers:
4161
4391
  # Texet
4162
4392
  # @ref: http://www.texet.ru/tablet/
4163
4393
  #########
4164
- - regex: '; *(T[BM]-\d{3}[^;/]+?)(?: Build|\) AppleWebKit)'
4394
+ - regex: '; {0,2}(T[BM]-\d{3}[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4165
4395
  device_replacement: '$1'
4166
4396
  brand_replacement: 'Texet'
4167
4397
  model_replacement: '$1'
@@ -4170,11 +4400,11 @@ device_parsers:
4170
4400
  # Thalia
4171
4401
  # @ref: http://www.thalia.de/shop/tolino-shine-ereader/show/
4172
4402
  #########
4173
- - regex: '; *(tolino [^;/]+?)(?: Build|\) AppleWebKit)'
4403
+ - regex: '; {0,2}(tolino [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4174
4404
  device_replacement: '$1'
4175
4405
  brand_replacement: 'Thalia'
4176
4406
  model_replacement: '$1'
4177
- - regex: '; *Build/.* (TOLINO_BROWSER)'
4407
+ - regex: '; {0,2}Build/.{0,200} (TOLINO_BROWSER)'
4178
4408
  device_replacement: '$1'
4179
4409
  brand_replacement: 'Thalia'
4180
4410
  model_replacement: 'Tolino Shine'
@@ -4184,11 +4414,11 @@ device_parsers:
4184
4414
  # @ref: http://en.thl.com.cn/Mobile
4185
4415
  # @ref: http://thlmobilestore.com
4186
4416
  #########
4187
- - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\) AppleWebKit)'
4417
+ - regex: '; {0,2}(?:CJ[ -])?(ThL|THL)[ -]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4188
4418
  device_replacement: '$1 $2'
4189
4419
  brand_replacement: 'Thl'
4190
4420
  model_replacement: '$2'
4191
- - regex: '; *(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4421
+ - regex: '; {0,2}(T100|T200|T5|W100|W200|W8s)(?: Build|\) AppleWebKit)'
4192
4422
  device_replacement: '$1'
4193
4423
  brand_replacement: 'Thl'
4194
4424
  model_replacement: '$1'
@@ -4197,28 +4427,28 @@ device_parsers:
4197
4427
  # T-Mobile (Operator Branded Devices)
4198
4428
  #########
4199
4429
  # @ref: https://en.wikipedia.org/wiki/HTC_Hero
4200
- - regex: '; *(T-Mobile[ _]G2[ _]Touch) Build'
4430
+ - regex: '; {0,2}(T-Mobile[ _]G2[ _]Touch) Build'
4201
4431
  device_replacement: '$1'
4202
4432
  brand_replacement: 'HTC'
4203
4433
  model_replacement: 'Hero'
4204
4434
  # @ref: https://en.wikipedia.org/wiki/HTC_Desire_Z
4205
- - regex: '; *(T-Mobile[ _]G2) Build'
4435
+ - regex: '; {0,2}(T-Mobile[ _]G2) Build'
4206
4436
  device_replacement: '$1'
4207
4437
  brand_replacement: 'HTC'
4208
4438
  model_replacement: 'Desire Z'
4209
- - regex: '; *(T-Mobile myTouch Q) Build'
4439
+ - regex: '; {0,2}(T-Mobile myTouch Q) Build'
4210
4440
  device_replacement: '$1'
4211
4441
  brand_replacement: 'Huawei'
4212
4442
  model_replacement: 'U8730'
4213
- - regex: '; *(T-Mobile myTouch) Build'
4443
+ - regex: '; {0,2}(T-Mobile myTouch) Build'
4214
4444
  device_replacement: '$1'
4215
4445
  brand_replacement: 'Huawei'
4216
4446
  model_replacement: 'U8680'
4217
- - regex: '; *(T-Mobile_Espresso) Build'
4447
+ - regex: '; {0,2}(T-Mobile_Espresso) Build'
4218
4448
  device_replacement: '$1'
4219
4449
  brand_replacement: 'HTC'
4220
4450
  model_replacement: 'Espresso'
4221
- - regex: '; *(T-Mobile G1) Build'
4451
+ - regex: '; {0,2}(T-Mobile G1) Build'
4222
4452
  device_replacement: '$1'
4223
4453
  brand_replacement: 'HTC'
4224
4454
  model_replacement: 'Dream'
@@ -4226,11 +4456,11 @@ device_parsers:
4226
4456
  device_replacement: '$1$2 $3 $4'
4227
4457
  brand_replacement: 'HTC'
4228
4458
  model_replacement: '$2 $3 $4'
4229
- - regex: '\b(T-Mobile)_([^_]+)_(.*) Build'
4459
+ - regex: '\b(T-Mobile)_([^_]+)_(.{0,200}) Build'
4230
4460
  device_replacement: '$1 $2 $3'
4231
4461
  brand_replacement: 'Tmobile'
4232
4462
  model_replacement: '$2 $3'
4233
- - regex: '\b(T-Mobile)[_ ]?(.*?)Build'
4463
+ - regex: '\b(T-Mobile)[_ ]?(.{0,200}?)Build'
4234
4464
  device_replacement: '$1 $2'
4235
4465
  brand_replacement: 'Tmobile'
4236
4466
  model_replacement: '$2'
@@ -4248,7 +4478,7 @@ device_parsers:
4248
4478
  # Tooky
4249
4479
  # @ref: http://www.tookymobile.com/
4250
4480
  #########
4251
- - regex: ' *(TOOKY)[ _\-]([^;/]+?) ?(?:Build|;)'
4481
+ - regex: ' ?(TOOKY)[ _\-]([^;/]{1,100}) ?(?:Build|;)'
4252
4482
  regex_flag: 'i'
4253
4483
  device_replacement: '$1 $2'
4254
4484
  brand_replacement: 'Tooky'
@@ -4263,11 +4493,11 @@ device_parsers:
4263
4493
  device_replacement: '$1'
4264
4494
  brand_replacement: 'Toshiba'
4265
4495
  model_replacement: 'Folio 100'
4266
- - regex: '; *([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4496
+ - regex: '; {0,2}([Ff]olio ?100)(?: Build|\) AppleWebKit)'
4267
4497
  device_replacement: '$1'
4268
4498
  brand_replacement: 'Toshiba'
4269
4499
  model_replacement: 'Folio 100'
4270
- - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
4500
+ - regex: '; {0,2}(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]{1,100}|THRiVE|Thrive)(?: Build|\) AppleWebKit)'
4271
4501
  device_replacement: 'Toshiba $1'
4272
4502
  brand_replacement: 'Toshiba'
4273
4503
  model_replacement: '$1'
@@ -4276,12 +4506,12 @@ device_parsers:
4276
4506
  # Touchmate
4277
4507
  # @ref: http://touchmatepc.com/new/
4278
4508
  #########
4279
- - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4509
+ - regex: '; {0,2}(TM-MID\d+[^;/]{1,50}|TOUCHMATE|MID-750)(?: Build|\) AppleWebKit)'
4280
4510
  device_replacement: '$1'
4281
4511
  brand_replacement: 'Touchmate'
4282
4512
  model_replacement: '$1'
4283
4513
  # @todo: needs verification user-agents missing
4284
- - regex: '; *(TM-SM\d+[^;/]+?)(?: Build|\) AppleWebKit)'
4514
+ - regex: '; {0,2}(TM-SM\d+[^;/]{1,50}?)(?: Build|\) AppleWebKit)'
4285
4515
  device_replacement: '$1'
4286
4516
  brand_replacement: 'Touchmate'
4287
4517
  model_replacement: '$1'
@@ -4290,11 +4520,11 @@ device_parsers:
4290
4520
  # Treq
4291
4521
  # @ref: http://www.treq.co.id/product
4292
4522
  #########
4293
- - regex: '; *(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4523
+ - regex: '; {0,2}(A10 [Bb]asic2?)(?: Build|\) AppleWebKit)'
4294
4524
  device_replacement: '$1'
4295
4525
  brand_replacement: 'Treq'
4296
4526
  model_replacement: '$1'
4297
- - regex: '; *(TREQ[ _\-])([^;/]+?)(?: Build|\) AppleWebKit)'
4527
+ - regex: '; {0,2}(TREQ[ _\-])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4298
4528
  regex_flag: 'i'
4299
4529
  device_replacement: '$1$2'
4300
4530
  brand_replacement: 'Treq'
@@ -4306,21 +4536,40 @@ device_parsers:
4306
4536
  # @models: A936|A603|X-5|X-3
4307
4537
  #########
4308
4538
  # @todo: guessed markers
4309
- - regex: '; *(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4539
+ - regex: '; {0,2}(X-?5|X-?3)(?: Build|\) AppleWebKit)'
4310
4540
  device_replacement: '$1'
4311
4541
  brand_replacement: 'Umeox'
4312
4542
  model_replacement: '$1'
4313
4543
  # @todo: guessed markers
4314
- - regex: '; *(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4544
+ - regex: '; {0,2}(A502\+?|A936|A603|X1|X2)(?: Build|\) AppleWebKit)'
4315
4545
  device_replacement: '$1'
4316
4546
  brand_replacement: 'Umeox'
4317
4547
  model_replacement: '$1'
4318
4548
 
4549
+ #########
4550
+ # Vernee
4551
+ # @ref: http://vernee.cc/
4552
+ # @models: Thor - Thor E
4553
+ #########
4554
+ - regex: '; thor Build/'
4555
+ device_replacement: 'Thor'
4556
+ brand_replacement: 'Vernee'
4557
+ model_replacement: 'Thor'
4558
+ # Regex to modidy for Thor Plus (don't find example UA)
4559
+ - regex: '; Thor (E)? Build/'
4560
+ device_replacement: 'Thor $1'
4561
+ brand_replacement: 'Vernee'
4562
+ model_replacement: 'Thor'
4563
+ - regex: '; Apollo Lite Build/'
4564
+ device_replacement: 'Apollo Lite'
4565
+ brand_replacement: 'Vernee'
4566
+ model_replacement: 'Apollo'
4567
+
4319
4568
  #########
4320
4569
  # Versus
4321
4570
  # @ref: http://versusuk.com/support.html
4322
4571
  #########
4323
- - regex: '(TOUCH(?:TAB|PAD).+?)(?: Build|\) AppleWebKit)'
4572
+ - regex: '(TOUCH(?:TAB|PAD).{1,200}?)(?: Build|\) AppleWebKit)'
4324
4573
  regex_flag: 'i'
4325
4574
  device_replacement: 'Versus $1'
4326
4575
  brand_replacement: 'Versus'
@@ -4330,7 +4579,7 @@ device_parsers:
4330
4579
  # Vertu
4331
4580
  # @ref: http://www.vertu.com/
4332
4581
  #########
4333
- - regex: '(VERTU) ([^;/]+?)(?: Build|\) AppleWebKit)'
4582
+ - regex: '(VERTU) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4334
4583
  device_replacement: '$1 $2'
4335
4584
  brand_replacement: 'Vertu'
4336
4585
  model_replacement: '$2'
@@ -4339,7 +4588,7 @@ device_parsers:
4339
4588
  # Videocon
4340
4589
  # @ref: http://www.videoconmobiles.com
4341
4590
  #########
4342
- - regex: '; *(Videocon)[ _\-]([^;/]+?) *(?:Build|;)'
4591
+ - regex: '; {0,2}(Videocon)[ _\-]([^;/]{1,100}?) {0,2}(?:Build|;)'
4343
4592
  device_replacement: '$1 $2'
4344
4593
  brand_replacement: 'Videocon'
4345
4594
  model_replacement: '$2'
@@ -4352,15 +4601,15 @@ device_parsers:
4352
4601
  # Viewsonic
4353
4602
  # @ref: http://viewsonic.com
4354
4603
  #########
4355
- - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\) AppleWebKit)'
4604
+ - regex: '; {0,2}((?:ViewPad|ViewPhone|VSD)[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4356
4605
  device_replacement: '$1'
4357
4606
  brand_replacement: 'Viewsonic'
4358
4607
  model_replacement: '$1'
4359
- - regex: '; *(ViewSonic-)([^;/]+?)(?: Build|\) AppleWebKit)'
4608
+ - regex: '; {0,2}(ViewSonic-)([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4360
4609
  device_replacement: '$1$2'
4361
4610
  brand_replacement: 'Viewsonic'
4362
4611
  model_replacement: '$2'
4363
- - regex: '; *(GTablet.*?)(?: Build|\) AppleWebKit)'
4612
+ - regex: '; {0,2}(GTablet.{0,200}?)(?: Build|\) AppleWebKit)'
4364
4613
  device_replacement: '$1'
4365
4614
  brand_replacement: 'Viewsonic'
4366
4615
  model_replacement: '$1'
@@ -4369,7 +4618,7 @@ device_parsers:
4369
4618
  # vivo
4370
4619
  # @ref: http://vivo.cn/
4371
4620
  #########
4372
- - regex: '; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4621
+ - regex: '; {0,2}([Vv]ivo)[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4373
4622
  device_replacement: '$1 $2'
4374
4623
  brand_replacement: 'vivo'
4375
4624
  model_replacement: '$2'
@@ -4378,7 +4627,7 @@ device_parsers:
4378
4627
  # Vodafone (Operator Branded Devices)
4379
4628
  # @ref: ??
4380
4629
  #########
4381
- - regex: '(Vodafone) (.*?)(?: Build|\) AppleWebKit)'
4630
+ - regex: '(Vodafone) (.{0,200}?)(?: Build|\) AppleWebKit)'
4382
4631
  device_replacement: '$1 $2'
4383
4632
  brand_replacement: '$1'
4384
4633
  model_replacement: '$2'
@@ -4387,7 +4636,7 @@ device_parsers:
4387
4636
  # Walton
4388
4637
  # @ref: http://www.waltonbd.com/
4389
4638
  #########
4390
- - regex: '; *(?:Walton[ _\-]|)(Primo[ _\-][^;/]+?)(?: Build|\) AppleWebKit)'
4639
+ - regex: '; {0,2}(?:Walton[ _\-]|)(Primo[ _\-][^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4391
4640
  regex_flag: 'i'
4392
4641
  device_replacement: 'Walton $1'
4393
4642
  brand_replacement: 'Walton'
@@ -4397,7 +4646,7 @@ device_parsers:
4397
4646
  # Wiko
4398
4647
  # @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
4399
4648
  #########
4400
- - regex: '; *(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\) AppleWebKit)'
4649
+ - regex: '; {0,2}(?:WIKO[ \-]|)(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4401
4650
  regex_flag: 'i'
4402
4651
  device_replacement: 'Wiko $1'
4403
4652
  brand_replacement: 'Wiko'
@@ -4407,7 +4656,7 @@ device_parsers:
4407
4656
  # WellcoM
4408
4657
  # @ref: ??
4409
4658
  #########
4410
- - regex: '; *WellcoM-([^;/]+?)(?: Build|\) AppleWebKit)'
4659
+ - regex: '; {0,2}WellcoM-([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4411
4660
  device_replacement: 'Wellcom $1'
4412
4661
  brand_replacement: 'Wellcom'
4413
4662
  model_replacement: '$1'
@@ -4425,7 +4674,7 @@ device_parsers:
4425
4674
  # Wolfgang
4426
4675
  # @ref: http://wolfgangmobile.com/
4427
4676
  #########
4428
- - regex: '; *(AT-AS[^;/]+?)(?: Build|\) AppleWebKit)'
4677
+ - regex: '; {0,2}(AT-AS[^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4429
4678
  device_replacement: 'Wolfgang $1'
4430
4679
  brand_replacement: 'Wolfgang'
4431
4680
  model_replacement: '$1'
@@ -4434,7 +4683,7 @@ device_parsers:
4434
4683
  # Woxter
4435
4684
  # @ref: http://www.woxter.es/es-es/categories/index
4436
4685
  #########
4437
- - regex: '; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\) AppleWebKit)'
4686
+ - regex: '; {0,2}(?:Woxter|Wxt) ([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4438
4687
  device_replacement: 'Woxter $1'
4439
4688
  brand_replacement: 'Woxter'
4440
4689
  model_replacement: '$1'
@@ -4443,7 +4692,7 @@ device_parsers:
4443
4692
  # Yarvik Zania
4444
4693
  # @ref: http://yarvik.com
4445
4694
  #########
4446
- - regex: '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3})(?: Build|\) AppleWebKit)'
4695
+ - regex: '; {0,2}(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3})(?: Build|\) AppleWebKit)'
4447
4696
  device_replacement: 'Yarvik $1'
4448
4697
  brand_replacement: 'Yarvik'
4449
4698
  model_replacement: '$1'
@@ -4457,7 +4706,7 @@ device_parsers:
4457
4706
  # M778, M7000, M7000AD, M7000NBD, M7001, M7002, M7002KBD, M777, M767,
4458
4707
  # M789, M799, M769, M757, M755, M753, M752, M739, M729, M723, M712, M727
4459
4708
  #########
4460
- - regex: '; *([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4709
+ - regex: '; {0,2}([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
4461
4710
  device_replacement: 'Yifang $1$2$3'
4462
4711
  brand_replacement: 'Yifang'
4463
4712
  model_replacement: '$2'
@@ -4466,19 +4715,19 @@ device_parsers:
4466
4715
  # XiaoMi
4467
4716
  # @ref: http://www.xiaomi.com/event/buyphone
4468
4717
  #########
4469
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4718
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/'
4470
4719
  device_replacement: 'XiaoMi $1'
4471
4720
  brand_replacement: 'XiaoMi'
4472
4721
  model_replacement: '$1'
4473
- - regex: '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4722
+ - regex: '; {0,2}((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\)]*)'
4474
4723
  device_replacement: 'XiaoMi $1'
4475
4724
  brand_replacement: 'XiaoMi'
4476
4725
  model_replacement: '$1'
4477
- - regex: '; *(MIX) (Build|MIUI)/'
4726
+ - regex: '; {0,2}(MIX) (Build|MIUI)/'
4478
4727
  device_replacement: 'XiaoMi $1'
4479
4728
  brand_replacement: 'XiaoMi'
4480
4729
  model_replacement: '$1'
4481
- - regex: '; *((MIX) ([^;/]*)) (Build|MIUI)/'
4730
+ - regex: '; {0,2}((MIX) ([^;/]*)) (Build|MIUI)/'
4482
4731
  device_replacement: 'XiaoMi $1'
4483
4732
  brand_replacement: 'XiaoMi'
4484
4733
  model_replacement: '$1'
@@ -4487,17 +4736,17 @@ device_parsers:
4487
4736
  # Xolo
4488
4737
  # @ref: http://www.xolo.in/
4489
4738
  #########
4490
- - regex: '; *XOLO[ _]([^;/]*tab.*)(?: Build|\) AppleWebKit)'
4739
+ - regex: '; {0,2}XOLO[ _]([^;/]{0,30}tab.{0,30})(?: Build|\) AppleWebKit)'
4491
4740
  regex_flag: 'i'
4492
4741
  device_replacement: 'Xolo $1'
4493
4742
  brand_replacement: 'Xolo'
4494
4743
  model_replacement: '$1'
4495
- - regex: '; *XOLO[ _]([^;/]+?)(?: Build|\) AppleWebKit)'
4744
+ - regex: '; {0,2}XOLO[ _]([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4496
4745
  regex_flag: 'i'
4497
4746
  device_replacement: 'Xolo $1'
4498
4747
  brand_replacement: 'Xolo'
4499
4748
  model_replacement: '$1'
4500
- - regex: '; *(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4749
+ - regex: '; {0,2}(q\d0{2,3}[a-z]?)(?: Build|\) AppleWebKit)'
4501
4750
  regex_flag: 'i'
4502
4751
  device_replacement: 'Xolo $1'
4503
4752
  brand_replacement: 'Xolo'
@@ -4507,7 +4756,7 @@ device_parsers:
4507
4756
  # Xoro
4508
4757
  # @ref: http://www.xoro.de/produkte/
4509
4758
  #########
4510
- - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4759
+ - regex: '; {0,2}(PAD ?[79]\d+[^;/]{0,50}|TelePAD\d+[^;/])(?: Build|\) AppleWebKit)'
4511
4760
  device_replacement: 'Xoro $1'
4512
4761
  brand_replacement: 'Xoro'
4513
4762
  model_replacement: '$1'
@@ -4516,7 +4765,7 @@ device_parsers:
4516
4765
  # Zopo
4517
4766
  # @ref: http://www.zopomobiles.com/products.html
4518
4767
  #########
4519
- - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4768
+ - regex: '; {0,2}(?:(?:ZOPO|Zopo)[ _]([^;/]{1,100}?)|(ZP ?(?:\d{2}[^;/]{1,100}|C2))|(C[2379]))(?: Build|\) AppleWebKit)'
4520
4769
  device_replacement: '$1$2$3'
4521
4770
  brand_replacement: 'Zopo'
4522
4771
  model_replacement: '$1$2$3'
@@ -4525,11 +4774,11 @@ device_parsers:
4525
4774
  # ZiiLabs
4526
4775
  # @ref: http://www.ziilabs.com/products/platforms/androidreferencetablets.php
4527
4776
  #########
4528
- - regex: '; *(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4777
+ - regex: '; {0,2}(ZiiLABS) (Zii[^;/]*)(?: Build|\) AppleWebKit)'
4529
4778
  device_replacement: '$1 $2'
4530
4779
  brand_replacement: 'ZiiLabs'
4531
4780
  model_replacement: '$2'
4532
- - regex: '; *(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4781
+ - regex: '; {0,2}(Zii)_([^;/]*)(?: Build|\) AppleWebKit)'
4533
4782
  device_replacement: '$1 $2'
4534
4783
  brand_replacement: 'ZiiLabs'
4535
4784
  model_replacement: '$2'
@@ -4538,36 +4787,36 @@ device_parsers:
4538
4787
  # ZTE
4539
4788
  # @ref: http://www.ztedevices.com/
4540
4789
  #########
4541
- - regex: '; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*?|Era|Memo[^;]*?)|JOE|(?:Kis|KIS)\b[^;]*?|Libra|Light [^;]*?|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*?|RacerII|RACERII|San Francisco[^;]*?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\) AppleWebKit)'
4790
+ - regex: '; {0,2}(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]{0,200}?|Era|Memo[^;]{0,200}?)|JOE|(?:Kis|KIS)\b[^;]{0,200}?|Libra|Light [^;]{0,200}?|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]{0,200}?|RacerII|RACERII|San Francisco[^;]{0,200}?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\) AppleWebKit)'
4542
4791
  device_replacement: '$1'
4543
4792
  brand_replacement: 'ZTE'
4544
4793
  model_replacement: '$1'
4545
- - regex: '; *([A-Z]\d+)_USA_[^;]*(?: Build|\) AppleWebKit)'
4794
+ - regex: '; {0,2}([A-Z]\d+)_USA_[^;]{0,200}(?: Build|\) AppleWebKit)'
4546
4795
  device_replacement: '$1'
4547
4796
  brand_replacement: 'ZTE'
4548
4797
  model_replacement: '$1'
4549
- - regex: '; *(SmartTab\d+)[^;]*(?: Build|\) AppleWebKit)'
4798
+ - regex: '; {0,2}(SmartTab\d+)[^;]{0,50}(?: Build|\) AppleWebKit)'
4550
4799
  device_replacement: '$1'
4551
4800
  brand_replacement: 'ZTE'
4552
4801
  model_replacement: '$1'
4553
- - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4802
+ - regex: '; {0,2}(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\) AppleWebKit)'
4554
4803
  device_replacement: 'ZTE Blade$1'
4555
4804
  brand_replacement: 'ZTE'
4556
4805
  model_replacement: 'Blade$1'
4557
- - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4806
+ - regex: '; {0,2}(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\) AppleWebKit)'
4558
4807
  device_replacement: 'ZTE Skate$1'
4559
4808
  brand_replacement: 'ZTE'
4560
4809
  model_replacement: 'Skate$1'
4561
- - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4810
+ - regex: '; {0,2}(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\) AppleWebKit)'
4562
4811
  device_replacement: '$1$2'
4563
4812
  brand_replacement: 'ZTE'
4564
4813
  model_replacement: '$1$2'
4565
- - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\) AppleWebKit)'
4814
+ - regex: '; {0,2}(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]{1,100}?)(?: Build|\) AppleWebKit)'
4566
4815
  device_replacement: 'ZTE $1'
4567
4816
  brand_replacement: 'ZTE'
4568
4817
  model_replacement: '$1'
4569
4818
  # operator specific
4570
- - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\) AppleWebKit)'
4819
+ - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]{0,200}?)(?: Build|\) AppleWebKit)'
4571
4820
  device_replacement: '$1 $2'
4572
4821
  brand_replacement: 'ZTE'
4573
4822
  model_replacement: '$1 $2'
@@ -4576,7 +4825,7 @@ device_parsers:
4576
4825
  device_replacement: '$1'
4577
4826
  brand_replacement: 'ZTE'
4578
4827
  model_replacement: '$1'
4579
- - regex: '; *(vp9plus)\)'
4828
+ - regex: '; {0,2}(vp9plus)\)'
4580
4829
  device_replacement: '$1'
4581
4830
  brand_replacement: 'ZTE'
4582
4831
  model_replacement: '$1'
@@ -4636,7 +4885,7 @@ device_parsers:
4636
4885
  device_replacement: 'Kindle Fire HDX 8.9" 4G'
4637
4886
  brand_replacement: 'Amazon'
4638
4887
  model_replacement: 'Kindle Fire HDX 8.9" 4G'
4639
- - regex: '; ?Amazon ([^;/]+) Build\b'
4888
+ - regex: '; ?Amazon ([^;/]{1,100}) Build\b'
4640
4889
  device_replacement: '$1'
4641
4890
  brand_replacement: 'Amazon'
4642
4891
  model_replacement: '$1'
@@ -4659,22 +4908,22 @@ device_parsers:
4659
4908
 
4660
4909
  #########
4661
4910
  # Devices from chinese manufacturer(s)
4662
- # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.*
4911
+ # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.{0,200}
4663
4912
  #########
4664
- - regex: '(sprd)\-([^/]+)/'
4913
+ - regex: '(sprd)\-([^/]{1,50})/'
4665
4914
  device_replacement: '$1 $2'
4666
4915
  brand_replacement: '$1'
4667
4916
  model_replacement: '$2'
4668
4917
  # @ref: http://eshinechina.en.alibaba.com/
4669
- - regex: '; *(H\d{2}00\+?) Build'
4918
+ - regex: '; {0,2}(H\d{2}00\+?) Build'
4670
4919
  device_replacement: '$1'
4671
4920
  brand_replacement: 'Hero'
4672
4921
  model_replacement: '$1'
4673
- - regex: '; *(iphone|iPhone5) Build/'
4922
+ - regex: '; {0,2}(iphone|iPhone5) Build/'
4674
4923
  device_replacement: 'Xianghe $1'
4675
4924
  brand_replacement: 'Xianghe'
4676
4925
  model_replacement: '$1'
4677
- - regex: '; *(e\d{4}[a-z]?_?v\d+|v89_[^;/]+)[^;/]+ Build/'
4926
+ - regex: '; {0,2}(e\d{4}[a-z]?_?v\d+|v89_[^;/]{1,100})[^;/]{1,30} Build/'
4678
4927
  device_replacement: 'Xianghe $1'
4679
4928
  brand_replacement: 'Xianghe'
4680
4929
  model_replacement: '$1'
@@ -4696,7 +4945,7 @@ device_parsers:
4696
4945
  #########
4697
4946
  # Alcatel Windows Phones
4698
4947
  #########
4699
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\)]+)'
4948
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]{0,200}; {0,2}([^;,\)]+)'
4700
4949
  device_replacement: 'Alcatel $1'
4701
4950
  brand_replacement: 'Alcatel'
4702
4951
  model_replacement: '$1'
@@ -4704,8 +4953,7 @@ device_parsers:
4704
4953
  #########
4705
4954
  # Asus Windows Phones
4706
4955
  #########
4707
- #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4708
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
4956
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]{0,200}; {0,2}([^;,\)]+)'
4709
4957
  device_replacement: 'Asus $1'
4710
4958
  brand_replacement: 'Asus'
4711
4959
  model_replacement: '$1'
@@ -4713,7 +4961,7 @@ device_parsers:
4713
4961
  #########
4714
4962
  # Dell Windows Phones
4715
4963
  #########
4716
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\)]+)'
4964
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]{0,200}; {0,2}([^;,\)]+)'
4717
4965
  device_replacement: 'Dell $1'
4718
4966
  brand_replacement: 'Dell'
4719
4967
  model_replacement: '$1'
@@ -4721,7 +4969,7 @@ device_parsers:
4721
4969
  #########
4722
4970
  # HTC Windows Phones
4723
4971
  #########
4724
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\)]+)'
4972
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]{0,200})[^;]{0,200}; {0,2}(?:HTC|)([^;,\)]+)'
4725
4973
  device_replacement: 'HTC $1'
4726
4974
  brand_replacement: 'HTC'
4727
4975
  model_replacement: '$1'
@@ -4729,7 +4977,7 @@ device_parsers:
4729
4977
  #########
4730
4978
  # Huawei Windows Phones
4731
4979
  #########
4732
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\)]+)'
4980
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]{0,200}; {0,2}(?:HUAWEI |)([^;,\)]+)'
4733
4981
  device_replacement: 'Huawei $1'
4734
4982
  brand_replacement: 'Huawei'
4735
4983
  model_replacement: '$1'
@@ -4737,7 +4985,7 @@ device_parsers:
4737
4985
  #########
4738
4986
  # LG Windows Phones
4739
4987
  #########
4740
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \-]|)([^;,\)]+)'
4988
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]{0,200}; {0,2}(?:LG[ \-]|)([^;,\)]+)'
4741
4989
  device_replacement: 'LG $1'
4742
4990
  brand_replacement: 'LG'
4743
4991
  model_replacement: '$1'
@@ -4745,15 +4993,15 @@ device_parsers:
4745
4993
  #########
4746
4994
  # Noka Windows Phones
4747
4995
  #########
4748
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
4996
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\d{3,10}[^;\)]*)'
4749
4997
  device_replacement: 'Lumia $1'
4750
4998
  brand_replacement: 'Nokia'
4751
4999
  model_replacement: 'Lumia $1'
4752
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
5000
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(RM-\d{3,})'
4753
5001
  device_replacement: 'Nokia $1'
4754
5002
  brand_replacement: 'Nokia'
4755
5003
  model_replacement: '$1'
4756
- - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
5004
+ - regex: '(?:Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]{0,200}; {0,2}(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\)]+)'
4757
5005
  device_replacement: 'Nokia $1'
4758
5006
  brand_replacement: 'Nokia'
4759
5007
  model_replacement: '$1'
@@ -4761,7 +5009,7 @@ device_parsers:
4761
5009
  #########
4762
5010
  # Microsoft Windows Phones
4763
5011
  #########
4764
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\)]+)'
5012
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]{0,200}; {0,2}([^;,\)]+)'
4765
5013
  device_replacement: 'Microsoft $1'
4766
5014
  brand_replacement: 'Microsoft'
4767
5015
  model_replacement: '$1'
@@ -4769,7 +5017,7 @@ device_parsers:
4769
5017
  #########
4770
5018
  # Samsung Windows Phones
4771
5019
  #########
4772
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\.\)]+)'
5020
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]{0,200}; {0,2}(?:SAMSUNG |)([^;,\.\)]+)'
4773
5021
  device_replacement: 'Samsung $1'
4774
5022
  brand_replacement: 'Samsung'
4775
5023
  model_replacement: '$1'
@@ -4777,7 +5025,7 @@ device_parsers:
4777
5025
  #########
4778
5026
  # Toshiba Windows Phones
4779
5027
  #########
4780
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)'
5028
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]{0,200}; {0,2}([^;,\)]+)'
4781
5029
  device_replacement: 'Toshiba $1'
4782
5030
  brand_replacement: 'Toshiba'
4783
5031
  model_replacement: '$1'
@@ -4785,7 +5033,7 @@ device_parsers:
4785
5033
  #########
4786
5034
  # Generic Windows Phones
4787
5035
  #########
4788
- - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\)]+)'
5036
+ - regex: 'Windows Phone [^;]{1,30}; .{0,100}?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]{1,200}); {0,2}([^;,\)]+)'
4789
5037
  device_replacement: '$1 $2'
4790
5038
  brand_replacement: '$1'
4791
5039
  model_replacement: '$2'
@@ -4797,7 +5045,7 @@ device_parsers:
4797
5045
  #########
4798
5046
  # Samsung Bada Phones
4799
5047
  #########
4800
- - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]+).* Bada/'
5048
+ - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]{1,50}).{0,200} Bada/'
4801
5049
  device_replacement: 'Samsung $1'
4802
5050
  brand_replacement: 'Samsung'
4803
5051
  model_replacement: '$1'
@@ -4805,11 +5053,11 @@ device_parsers:
4805
5053
  #########
4806
5054
  # Firefox OS
4807
5055
  #########
4808
- - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+?)(?:/[^;]+|); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5056
+ - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]{1,100}?)(?:/[^;]{1,200}|); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4809
5057
  device_replacement: 'Alcatel $1 $2 $3'
4810
5058
  brand_replacement: 'Alcatel'
4811
5059
  model_replacement: 'One Touch $3'
4812
- - regex: '\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
5060
+ - regex: '\(Mobile; (?:ZTE([^;]{1,200})|(OpenC)); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/'
4813
5061
  device_replacement: 'ZTE $1$2'
4814
5062
  brand_replacement: 'ZTE'
4815
5063
  model_replacement: '$1$2'
@@ -4817,15 +5065,15 @@ device_parsers:
4817
5065
  #########
4818
5066
  # KaiOS
4819
5067
  #########
4820
- - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KaiOS/'
5068
+ - regex: '\(Mobile; ALCATEL([A-Za-z0-9\-]+); rv:[^\)]{1,200}\) Gecko/[^\/]{1,200} Firefox/[^\/]{1,200} KaiOS/'
4821
5069
  device_replacement: 'Alcatel $1'
4822
5070
  brand_replacement: 'Alcatel'
4823
5071
  model_replacement: '$1'
4824
- - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]+)\/.+;.+rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
5072
+ - regex: '\(Mobile; LYF\/([A-Za-z0-9\-]{1,100})\/.{0,100};.{0,100}rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
4825
5073
  device_replacement: 'LYF $1'
4826
5074
  brand_replacement: 'LYF'
4827
5075
  model_replacement: '$1'
4828
- - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]+)_.+; rv:[^\)]+\) Gecko/[^\/]+ Firefox/[^\/]+ KAIOS/'
5076
+ - regex: '\(Mobile; Nokia_([A-Za-z0-9\-]{1,100})_.{1,100}; rv:[^\)]{1,100}\) Gecko/[^\/]{1,100} Firefox/[^\/]{1,100} KAIOS/'
4829
5077
  device_replacement: 'Nokia $1'
4830
5078
  brand_replacement: 'Nokia'
4831
5079
  model_replacement: '$1'
@@ -4838,7 +5086,7 @@ device_parsers:
4838
5086
  device_replacement: 'Nokia $1'
4839
5087
  brand_replacement: 'Nokia'
4840
5088
  model_replacement: '$1$2'
4841
- - regex: '(?:NOKIA|Nokia)(?:\-| *)(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
5089
+ - regex: '(?:NOKIA|Nokia)(?:\-| {0,2})(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
4842
5090
  device_replacement: 'Nokia $1$2$3'
4843
5091
  brand_replacement: 'Nokia'
4844
5092
  model_replacement: '$1$2$3'
@@ -4847,12 +5095,12 @@ device_parsers:
4847
5095
  brand_replacement: 'Nokia'
4848
5096
  model_replacement: 'Lumia $1'
4849
5097
  # UCWEB Browser on Symbian
4850
- - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+?)\)'
5098
+ - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]{1,100}?)\)'
4851
5099
  device_replacement: '$1 $2'
4852
5100
  brand_replacement: '$1'
4853
5101
  model_replacement: '$2'
4854
5102
  # Nokia Symbian
4855
- - regex: '\(Symbian(?:/3|); U; ([^;]+);'
5103
+ - regex: '\(Symbian(?:/3|); U; ([^;]{1,200});'
4856
5104
  device_replacement: 'Nokia $1'
4857
5105
  brand_replacement: 'Nokia'
4858
5106
  model_replacement: '$1'
@@ -4865,7 +5113,7 @@ device_parsers:
4865
5113
  device_replacement: 'BlackBerry $1'
4866
5114
  brand_replacement: 'BlackBerry'
4867
5115
  model_replacement: '$1'
4868
- - regex: 'Play[Bb]ook.+RIM Tablet OS'
5116
+ - regex: 'Play[Bb]ook.{1,200}RIM Tablet OS'
4869
5117
  device_replacement: 'BlackBerry Playbook'
4870
5118
  brand_replacement: 'BlackBerry'
4871
5119
  model_replacement: 'Playbook'
@@ -4897,7 +5145,7 @@ device_parsers:
4897
5145
  device_replacement: 'Palm Treo $1'
4898
5146
  brand_replacement: 'Palm'
4899
5147
  model_replacement: 'Treo $1'
4900
- - regex: 'webOS.*(P160U(?:NA|))/(\d+).(\d+)'
5148
+ - regex: 'webOS.{0,200}(P160U(?:NA|))/(\d+).(\d+)'
4901
5149
  device_replacement: 'HP Veer'
4902
5150
  brand_replacement: 'HP'
4903
5151
  model_replacement: 'Veer'
@@ -4905,7 +5153,7 @@ device_parsers:
4905
5153
  device_replacement: 'HP TouchPad'
4906
5154
  brand_replacement: 'HP'
4907
5155
  model_replacement: 'TouchPad'
4908
- - regex: 'HPiPAQ([A-Za-z0-9]+)/\d+.\d+'
5156
+ - regex: 'HPiPAQ([A-Za-z0-9]{1,20})/\d+\.\d+'
4909
5157
  device_replacement: 'HP iPAQ $1'
4910
5158
  brand_replacement: 'HP'
4911
5159
  model_replacement: 'iPAQ $1'
@@ -4959,7 +5207,7 @@ device_parsers:
4959
5207
  - regex: '(Watch)(\d+,\d+)'
4960
5208
  device_replacement: 'Apple $1'
4961
5209
  brand_replacement: 'Apple'
4962
- model_replacement: 'Apple $1 $2'
5210
+ model_replacement: '$1$2'
4963
5211
  - regex: '(Apple Watch)(?:;| Simulator;)'
4964
5212
  device_replacement: '$1'
4965
5213
  brand_replacement: 'Apple'
@@ -4973,18 +5221,18 @@ device_parsers:
4973
5221
  brand_replacement: 'Apple'
4974
5222
  model_replacement: 'iPhone'
4975
5223
  # @note: desktop applications show device info
4976
- - regex: 'CFNetwork/.* Darwin/\d.*\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
5224
+ - regex: 'CFNetwork/.{0,100} Darwin/\d.{0,100}\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
4977
5225
  device_replacement: '$1$2,$3'
4978
5226
  brand_replacement: 'Apple'
4979
5227
  model_replacement: '$1$2,$3'
4980
5228
  # @note: newer desktop applications don't show device info
4981
5229
  # This is here so as to not have them recorded as iOS-Device
4982
- - regex: 'CFNetwork/.* Darwin/\d+\.\d+\.\d+ \(x86_64\)'
5230
+ - regex: 'CFNetwork/.{0,100} Darwin/\d+\.\d+\.\d+ \(x86_64\)'
4983
5231
  device_replacement: 'Mac'
4984
5232
  brand_replacement: 'Apple'
4985
5233
  model_replacement: 'Mac'
4986
5234
  # @note: iOS applications do not show device info
4987
- - regex: 'CFNetwork/.* Darwin/\d'
5235
+ - regex: 'CFNetwork/.{0,100} Darwin/\d'
4988
5236
  device_replacement: 'iOS-Device'
4989
5237
  brand_replacement: 'Apple'
4990
5238
  model_replacement: 'iOS-Device'
@@ -5028,7 +5276,7 @@ device_parsers:
5028
5276
  device_replacement: 'Asus $1'
5029
5277
  brand_replacement: 'Asus'
5030
5278
  model_replacement: '$1'
5031
- - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
5279
+ - regex: '(?:asus.{0,200}?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)'
5032
5280
  device_replacement: 'Asus $1'
5033
5281
  brand_replacement: 'Asus'
5034
5282
  model_replacement: '$1'
@@ -5061,11 +5309,11 @@ device_parsers:
5061
5309
  device_replacement: 'DoCoMo $1'
5062
5310
  brand_replacement: 'DoCoMo'
5063
5311
  model_replacement: '$1'
5064
- - regex: '([A-Za-z0-9]+)_W;FOMA'
5312
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30})_W;FOMA'
5065
5313
  device_replacement: 'DoCoMo $1'
5066
5314
  brand_replacement: 'DoCoMo'
5067
5315
  model_replacement: '$1'
5068
- - regex: '([A-Za-z0-9]+);FOMA'
5316
+ - regex: '^.{0,50}?([A-Za-z0-9]{1,30});FOMA'
5069
5317
  device_replacement: 'DoCoMo $1'
5070
5318
  brand_replacement: 'DoCoMo'
5071
5319
  model_replacement: '$1'
@@ -5073,7 +5321,7 @@ device_parsers:
5073
5321
  ##########
5074
5322
  # htc
5075
5323
  ##########
5076
- - regex: '\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5324
+ - regex: '\b(?:HTC/|HTC/[a-z0-9]{1,20}/|)HTC[ _\-;]? {0,2}(.{0,200}?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
5077
5325
  device_replacement: 'HTC $1'
5078
5326
  brand_replacement: 'HTC'
5079
5327
  model_replacement: '$1'
@@ -5130,22 +5378,22 @@ device_parsers:
5130
5378
  # HbbTV (European and Australian standard)
5131
5379
  # written before the LG regexes, as LG is making HbbTV too
5132
5380
  ##########
5133
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]*; *(LG)E *; *([^;]*) *;[^;]*;[^;]*;\)'
5381
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \( ?;(LG)E ?;([^;]{0,30})'
5134
5382
  device_replacement: '$1'
5135
5383
  brand_replacement: '$2'
5136
5384
  model_replacement: '$3'
5137
- - regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/|)(THOM[^;]*?)[;\s].{0,30}(LF[^;]+);?'
5385
+ - regex: '(HbbTV)/1\.1\.1.{0,200}CE-HTML/1\.\d;(Vendor/|)(THOM[^;]{0,200}?)[;\s].{0,30}(LF[^;]{1,200});?'
5138
5386
  device_replacement: '$1'
5139
5387
  brand_replacement: 'Thomson'
5140
5388
  model_replacement: '$4'
5141
- - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); *CE-HTML(?:/1\.\d|); *([^ ]+) ([^;]+);'
5389
+ - regex: '(HbbTV)(?:/1\.1\.1|) ?(?: \(;;;;;\)|); {0,2}CE-HTML(?:/1\.\d|); {0,2}([^ ]{1,30}) ([^;]{1,200});'
5142
5390
  device_replacement: '$1'
5143
5391
  brand_replacement: '$2'
5144
5392
  model_replacement: '$3'
5145
5393
  - regex: '(HbbTV)/1\.1\.1 \(;;;;;\) Maple_2011'
5146
5394
  device_replacement: '$1'
5147
5395
  brand_replacement: 'Samsung'
5148
- - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]*; *(?:CUS:([^;]*)|([^;]+)) *; *([^;]*) *;.*;'
5396
+ - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]{0,30}; ?(?:CUS:([^;]{0,200})|([^;]{1,200})) ?; ?([^;]{0,30})'
5149
5397
  device_replacement: '$1'
5150
5398
  brand_replacement: '$2$3'
5151
5399
  model_replacement: '$4'
@@ -5155,7 +5403,7 @@ device_parsers:
5155
5403
  ##########
5156
5404
  # LGE NetCast TV
5157
5405
  ##########
5158
- - regex: 'LGE; (?:Media\/|)([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5406
+ - regex: 'LGE; (?:Media\/|)([^;]{0,200});[^;]{0,200};[^;]{0,200};?\); "?LG NetCast(\.TV|\.Media|)-\d+'
5159
5407
  device_replacement: 'NetCast$2'
5160
5408
  brand_replacement: 'LG'
5161
5409
  model_replacement: '$1'
@@ -5163,11 +5411,11 @@ device_parsers:
5163
5411
  ##########
5164
5412
  # InettvBrowser
5165
5413
  ##########
5166
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;(Sony)([^;]*);[^;]*;[^\)]*\)'
5414
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};(Sony)([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5167
5415
  device_replacement: 'Inettv'
5168
5416
  brand_replacement: '$1'
5169
5417
  model_replacement: '$2'
5170
- - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;([^;]*);[^;]*;[^\)]*\)'
5418
+ - regex: 'InettvBrowser/[0-9]{1,30}\.[0-9A-Z]{1,30} \([^;]{0,200};([^;]{0,200});[^;]{0,200};[^\)]{0,10}\)'
5171
5419
  device_replacement: 'Inettv'
5172
5420
  brand_replacement: 'Generic_Inettv'
5173
5421
  model_replacement: '$1'
@@ -5204,7 +5452,7 @@ device_parsers:
5204
5452
  device_replacement: 'Microsoft $1'
5205
5453
  brand_replacement: 'Microsoft'
5206
5454
  model_replacement: '$1'
5207
- - regex: '(?:MSIE|XBMC).*\b(Xbox)\b'
5455
+ - regex: '(?:MSIE|XBMC).{0,200}\b(Xbox)\b'
5208
5456
  device_replacement: '$1'
5209
5457
  brand_replacement: 'Microsoft'
5210
5458
  model_replacement: '$1'
@@ -5265,12 +5513,12 @@ device_parsers:
5265
5513
  # Samsung
5266
5514
  ##########
5267
5515
  # Samsung Smart-TV
5268
- - regex: '(SMART-TV); .* Tizen '
5516
+ - regex: '(SMART-TV); .{0,200} Tizen '
5269
5517
  device_replacement: 'Samsung $1'
5270
5518
  brand_replacement: 'Samsung'
5271
5519
  model_replacement: '$1'
5272
5520
  # Samsung Symbian Devices
5273
- - regex: 'SymbianOS/9\.\d.* Samsung[/\-]([A-Za-z0-9 \-]+)'
5521
+ - regex: 'SymbianOS/9\.\d.{0,200} Samsung[/\-]([A-Za-z0-9 \-]+)'
5274
5522
  device_replacement: 'Samsung $1'
5275
5523
  brand_replacement: 'Samsung'
5276
5524
  model_replacement: '$1'
@@ -5278,7 +5526,7 @@ device_parsers:
5278
5526
  device_replacement: '$1 $2$3'
5279
5527
  brand_replacement: '$1'
5280
5528
  model_replacement: '$2-$3'
5281
- - regex: 'SAMSUNG-ANDROID-MMS/([^;/]+)'
5529
+ - regex: 'SAMSUNG-ANDROID-MMS/([^;/]{1,100})'
5282
5530
  device_replacement: '$1'
5283
5531
  brand_replacement: 'Samsung'
5284
5532
  model_replacement: '$1'
@@ -5325,7 +5573,7 @@ device_parsers:
5325
5573
  ##########
5326
5574
  # Sony
5327
5575
  ##########
5328
- - regex: 'Android [^;]+; ([^ ]+) (Sony)/'
5576
+ - regex: 'Android [^;]{1,200}; ([^ ]+) (Sony)/'
5329
5577
  device_replacement: '$2 $1'
5330
5578
  brand_replacement: '$2'
5331
5579
  model_replacement: '$1'
@@ -5359,33 +5607,33 @@ device_parsers:
5359
5607
  #########
5360
5608
  # Android General Device Matching (far from perfect)
5361
5609
  #########
5362
- - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\))'
5610
+ - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.{1,200})( Build[/ ]|\))'
5363
5611
  brand_replacement: 'Generic_Android'
5364
5612
  model_replacement: '$1'
5365
- - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\))'
5613
+ - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5366
5614
  brand_replacement: 'Generic_Android'
5367
5615
  model_replacement: '$1'
5368
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?)( Build[/ ]|\))'
5616
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5369
5617
  brand_replacement: 'Generic_Android'
5370
5618
  model_replacement: '$1'
5371
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[A-Za-z]{0,2}\- *; *(.+?)( Build[/ ]|\))'
5619
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[A-Za-z]{0,2}\- {0,2}; {0,2}(.{1,200}?)( Build[/ ]|\))'
5372
5620
  brand_replacement: 'Generic_Android'
5373
5621
  model_replacement: '$1'
5374
5622
  # No build info at all - "Build" follows locale immediately
5375
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5623
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,2}[a-z]{0,2}[_\-]?[A-Za-z]{0,2};?( Build[/ ]|\))'
5376
5624
  device_replacement: 'Generic Smartphone'
5377
5625
  brand_replacement: 'Generic'
5378
5626
  model_replacement: 'Smartphone'
5379
- - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); *\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\))'
5627
+ - regex: 'Android[\- ][\d]+(?:\.[\d]+)(?:\.[\d]+|); {0,3}\-?[A-Za-z]{2}; {0,2}(.{1,50}?)( Build[/ ]|\))'
5380
5628
  brand_replacement: 'Generic_Android'
5381
5629
  model_replacement: '$1'
5382
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Mobile Safari'
5630
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Mobile Safari'
5383
5631
  brand_replacement: 'Generic_Android'
5384
5632
  model_replacement: '$1'
5385
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\) AppleWebKit).+? Safari'
5633
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\) AppleWebKit).{1,200}? Safari'
5386
5634
  brand_replacement: 'Generic_Android_Tablet'
5387
5635
  model_replacement: '$1'
5388
- - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]+?)(?: Build|\))'
5636
+ - regex: 'Android \d+?(?:\.\d+|)(?:\.\d+|); ([^;]{1,100}?)(?: Build|\))'
5389
5637
  brand_replacement: 'Generic_Android'
5390
5638
  model_replacement: '$1'
5391
5639
 
@@ -5410,7 +5658,7 @@ device_parsers:
5410
5658
  ##########
5411
5659
  # Generic Tablet
5412
5660
  ##########
5413
- - regex: '(Android 3\.\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))'
5661
+ - regex: '(Android 3\.\d|Opera Tablet|Tablet; .{1,100}Firefox/|Android.{0,100}(?:Tab|Pad))'
5414
5662
  regex_flag: 'i'
5415
5663
  device_replacement: 'Generic Tablet'
5416
5664
  brand_replacement: 'Generic'
@@ -5419,7 +5667,7 @@ device_parsers:
5419
5667
  ##########
5420
5668
  # Generic Smart Phone
5421
5669
  ##########
5422
- - regex: '(Symbian|\bS60(Version|V\d)|\bS60\b|\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .+Firefox/|iPhone OS|Android|MobileSafari|Windows *Phone|\(webOS/|PalmOS)'
5670
+ - regex: '(Symbian|\bS60(Version|V\d)|\bS60\b|\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .{1,200}Firefox/|iPhone OS|Android|MobileSafari|Windows {0,2}Phone|\(webOS/|PalmOS)'
5423
5671
  device_replacement: 'Generic Smartphone'
5424
5672
  brand_replacement: 'Generic'
5425
5673
  model_replacement: 'Smartphone'
@@ -5432,7 +5680,7 @@ device_parsers:
5432
5680
  ##########
5433
5681
  # Spiders (this is a hack...)
5434
5682
  ##########
5435
- - regex: '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)'
5683
+ - regex: '^.{0,100}(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.{0,200}/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)'
5436
5684
  regex_flag: 'i'
5437
5685
  device_replacement: 'Spider'
5438
5686
  brand_replacement: 'Spider'
@@ -5471,3 +5719,14 @@ device_parsers:
5471
5719
  device_replacement: 'Generic Feature Phone'
5472
5720
  brand_replacement: 'Generic'
5473
5721
  model_replacement: 'Feature Phone'
5722
+
5723
+ #########
5724
+ # Apple
5725
+ # @ref: https://www.apple.com/mac/
5726
+ # @note: lookup Mac OS, but exclude iPad, Apple TV, a HTC phone, Kindle, LG
5727
+ # @note: put this at the end, since it is hard to implement contains foo, but not contain bar1, bar 2, bar 3 in go's re2
5728
+ #########
5729
+ - regex: 'Mac OS'
5730
+ device_replacement: 'Mac'
5731
+ brand_replacement: 'Apple'
5732
+ model_replacement: 'Mac'