diff --git a/Dockerfile b/Dockerfile
index c1c8fa72027261d165ce4d36acd0663772440d0f..bfd6f7eda72e8096f81714b323384d751e7f6970 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -41,6 +41,8 @@ RUN npm run deploy --prefix ./assets && \
     npm run deploy --prefix ./tracker && \
     mix phx.digest priv/static && \
     mix download_country_database && \
+    mix ref_inspector.download -f && \
+    mix ua_inspector.download -f && \
 # https://hexdocs.pm/sentry/Sentry.Sources.html#module-source-code-storage
     mix sentry_recompile
 
diff --git a/mix.exs b/mix.exs
index 6ba5e37fe058bd62164b88995047f62fdf692730..825a53b939006c46a0baa279511e2bcfdde3791c 100644
--- a/mix.exs
+++ b/mix.exs
@@ -68,7 +68,7 @@ defmodule Plausible.MixProject do
       {:poison, "~> 3.1"},
       {:ref_inspector, "~> 1.3"},
       {:timex, "~> 3.6"},
-      {:ua_inspector, "~> 0.18"},
+      {:ua_inspector, "~> 2.2"},
       {:bamboo, "~> 2.0"},
       {:hackney, "~> 1.8"},
       {:bamboo_phoenix, "~> 1.0.0"},
diff --git a/mix.lock b/mix.lock
index a98f902aab8bd06fe73d9f64f0cc111c12ef410f..7aef3546a26c15475df215de21bcd6978f8afb81 100644
--- a/mix.lock
+++ b/mix.lock
@@ -86,7 +86,7 @@
   "telemetry": {:hex, :telemetry, "0.4.3", "a06428a514bdbc63293cd9a6263aad00ddeb66f608163bdec7c8995784080818", [:rebar3], [], "hexpm", "eb72b8365ffda5bed68a620d1da88525e326cb82a75ee61354fc24b844768041"},
   "timex": {:hex, :timex, "3.6.3", "58ce6c9eda8ed47fc80c24dde09d481465838d3bcfc230949287fc1b0b0041c1", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5 or ~> 1.0.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "6d69f4f95fcf5684102a9cb3cf92c5ba6545bd60ed8d8a6a93cd2a4a4fb0d9ec"},
   "tzdata": {:hex, :tzdata, "1.0.5", "69f1ee029a49afa04ad77801febaf69385f3d3e3d1e4b56b9469025677b89a28", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "55519aa2a99e5d2095c1e61cc74c9be69688f8ab75c27da724eb8279ff402a5a"},
-  "ua_inspector": {:hex, :ua_inspector, "0.20.0", "01939baf5706f7d6c2dc0affbbd7f5e14309ba43ebf8967aa6479ee2204f23bc", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.0", [hex: :poolboy, repo: "hexpm", optional: false]}, {:yamerl, "~> 0.7", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "30e8623b9f55e7d58be12fc2afd50be8792ec14192c289701d3cc93ad6027f26"},
+  "ua_inspector": {:hex, :ua_inspector, "2.2.0", "7b737d7668a10c6a380c949e3d93acc992df51f77cc2659a6352dafc8b6fb09c", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:yamerl, "~> 0.7", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "1701dcfd81c00d5ec1322a0f609b93260f5de85317ed1afb2e11917a52748958"},
   "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
   "unsafe": {:hex, :unsafe, "1.0.1", "a27e1874f72ee49312e0a9ec2e0b27924214a05e3ddac90e91727bc76f8613d8", [:mix], [], "hexpm", "6c7729a2d214806450d29766abc2afaa7a2cbecf415be64f36a6691afebb50e5"},
   "yamerl": {:hex, :yamerl, "0.8.1", "07da13ffa1d8e13948943789665c62ccd679dfa7b324a4a2ed3149df17f453a4", [:rebar3], [], "hexpm", "96cb30f9d64344fed0ef8a92e9f16f207de6c04dfff4f366752ca79f5bceb23f"},
diff --git a/priv/ref_inspector/ref_inspector.readme.md b/priv/ref_inspector/ref_inspector.readme.md
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0f0dbee3ce5eadc281cde2d6a55bb426424c68ff 100644
--- a/priv/ref_inspector/ref_inspector.readme.md
+++ b/priv/ref_inspector/ref_inspector.readme.md
@@ -0,0 +1,5 @@
+# RefInspector Parser Database
+
+The file in this directory is taken from the
+[snowplow-referer-parser](https://github.com/snowplow-referer-parser/referer-parser)
+project. See there for detailed license information about the data contained.
diff --git a/priv/ref_inspector/referers.yml b/priv/ref_inspector/referers.yml
index 35577b65d02010acb504eb97c23a79e6215ef6bd..a6f88f3c7085668e1222baca78a4321667c252fa 100644
--- a/priv/ref_inspector/referers.yml
+++ b/priv/ref_inspector/referers.yml
@@ -51,7 +51,15 @@ unknown:
       - omg.yahoo.com
       - match.yahoo.net
 
-
+  Yandex Maps:
+    parameters:
+      - text
+    domains:
+      - maps.yandex.ru
+      - maps.yandex.ua
+      - maps.yandex.com
+      - maps.yandex.by
+      - n.maps.yandex.ru
 
 # #######################################################################################################
 #
@@ -79,6 +87,10 @@ email:
     domains:
       - mail.aol.com
 
+  Beeline:
+    domains:
+      - post.ru
+
   Bigpond:
     domains:
       - webmail.bigpond.com
@@ -99,6 +111,10 @@ email:
     domains:
       - webmail.dodo.com.au
 
+  E1.ru:
+    domains:
+      - mail.e1.ru
+
   Freenet:
     domains:
       - webmail.freenet.de
@@ -121,6 +137,16 @@ email:
     domains:
       - webmail.iprimus.com.au
 
+  Mail.ru:
+    domains:
+      - e.mail.ru
+      - touch.mail.ru
+
+  Mastermail:
+    domains:
+      - mastermail.ru
+      - m.mastermail.ru
+
   Mynet Mail:
     domains:
       - mail.mynet.com
@@ -147,14 +173,31 @@ email:
       - mail.live.com
       - outlook.live.com
 
+  QIP:
+    domains:
+      - mail.qip.ru
+
   QQ Mail:
     domains:
-      - mail.qq.com  
+      - mail.qq.com
+      - exmail.qq.com
+
+  Rambler:
+    domains:
+      - mail.rambler.ru 
 
   Seznam Mail:
     domains:
       - email.seznam.cz
 
+  Sibmail:
+    domains:
+      - sibmail.com
+
+  Ukr.net:
+    domains:
+      - mail.ukr.net
+
   Virgin:
     domains:
       - webmail.virginbroadband.com.au
@@ -167,6 +210,14 @@ email:
     domains:
       - webmail.westnet.com.au
 
+  Yandex:
+    domains:
+      - mail.yandex.ru
+      - mail.yandex.com
+      - mail.yandex.kz
+      - mail.yandex.ua
+      - mail.yandex.by
+
   Yahoo! Mail:
     domains:
       - mail.yahoo.net
@@ -208,6 +259,7 @@ social:
   Instagram:
     domains:
       - instagram.com
+      - l.instagram.com
 
   Youtube:
     domains:
@@ -237,7 +289,9 @@ social:
 
   Vkontakte:
     domains:
+      - m.vk.com
       - vk.com
+      - away.vk.com
       - vkontakte.ru
 
   Tagged:
@@ -300,6 +354,7 @@ social:
   Odnoklassniki:
     domains:
       - odnoklassniki.ru
+      - ok.ru
 
   Viadeo:
     domains:
@@ -470,7 +525,7 @@ social:
   Pocket:
     domains:
       - getpocket.com
-      
+
   ITU Sozluk:
     domains:
       - itusozluk.com
@@ -501,7 +556,7 @@ social:
 
   Donanimhaber:
     domains:
-      - donanimhaber.com 
+      - donanimhaber.com
 
   Disqus:
     domains:
@@ -513,9 +568,17 @@ social:
     domains:
       - quora.com
 
-    Whirlpool:
-      domains:
-        - forums.whirlpool.net.au
+  Skype:
+    domains:
+      - web.skype.com
+
+  WhatsApp:
+    domains:
+      - web.whatsapp.com
+
+  Whirlpool:
+    domains:
+      - forums.whirlpool.net.au
 
 # #######################################################################################################
 #
@@ -543,6 +606,13 @@ search:
     domains:
       - search.1und1.de
 
+  2gis:
+    domains:
+      - 2gis.ru
+      - www.2gis.ru
+      - link.2gis.ru
+      - www.link.2gis.ru
+
   360.cn:
     parameters:
       - q
@@ -2969,6 +3039,12 @@ search:
       - www.toile.com
       - web.toile.com
 
+  Liveinternet:
+    parameters:
+      - q
+    domains:
+      - liveinternet.ru
+
   Looksmart:
     parameters:
       - key
@@ -2999,6 +3075,8 @@ search:
     parameters:
       - q
     domains:
+      - mail.ru
+      - m.mail.ru
       - go.mail.ru
 
   Mamma:
@@ -3085,6 +3163,7 @@ search:
       - searchfor
       - searchFor
     domains:
+      - mysearch.com
       - www.mysearch.com
       - ms114.mysearch.com
       - ms146.mysearch.com
@@ -3167,7 +3246,7 @@ search:
     domains:
       - busca.orange.es
       - search.orange.co.uk
-      - lemoteur.orange.fr   
+      - lemoteur.orange.fr
 
   Paperball:
     parameters:
@@ -3220,6 +3299,13 @@ search:
       - www.qualigo.de
       - www.qualigo.nl
 
+  Qwant:
+    parameters:
+      - q
+    domains:
+      - www.qwant.com
+      - lite.qwant.com
+
   Rakuten:
     parameters:
       - qt
@@ -3338,6 +3424,18 @@ search:
       - sosodesktop.com
       - search.sosodesktop.com
 
+  Shenma:
+    parameters:
+      - q
+    domains:
+      - so.m.sm.cn
+      - yz.m.sm.cn
+      - m.sm.cn
+      - quark.sm.cn
+      - m.sp.sm.cn
+      - m.yz2.sm.cn
+      - m.yz.sm.cn
+
   Snapdo:
     parameters:
       - q
@@ -3598,6 +3696,8 @@ search:
       - au.yahoo.com
       - br.search.yahoo.com
       - br.yahoo.com
+      - ca.search.yahoo.com
+      - ca.yahoo.com
       - cade.searchde.yahoo.com
       - cade.yahoo.com
       - chinese.searchinese.yahoo.com
@@ -3614,8 +3714,12 @@ search:
       - espanol.yahoo.com
       - fr.search.yahoo.com
       - fr.yahoo.com
+      - hk.search.yahoo.com
+      - hk.yahoo.com
       - ie.search.yahoo.com
       - ie.yahoo.com
+      - in.search.yahoo.com
+      - in.yahoo.com
       - it.search.yahoo.com
       - it.yahoo.com
       - kr.search.yahoo.com
@@ -3630,11 +3734,17 @@ search:
       - one.searchn.yahoo.com
       - qc.search.yahoo.com
       - qc.yahoo.com
+      - ru.search.yahoo.com
+      - ru.yahoo.com
       - se.search.yahoo.com
       - se.yahoo.com
       - search.searcharch.yahoo.com
+      - tw.search.yahoo.com
+      - tw.yahoo.com
       - uk.search.yahoo.com
       - uk.yahoo.com
+      - us.search.yahoo.com
+      - us.yahoo.com
       - www.yahoo.co.jp
       - search.yahoo.co.jp
       # powered by Yahoo
@@ -3668,6 +3778,10 @@ search:
       - www.yandex.ua
       - www.yandex.com
       - www.yandex.by
+      - clck.yandex.ru
+      - clck.yandex.ua
+      - clck.yandex.com
+      - clck.yandex.by
 
   Yandex Images:
     parameters:
@@ -3676,6 +3790,7 @@ search:
       - images.yandex.ru
       - images.yandex.ua
       - images.yandex.com
+      - images.yandex.by
 
   Yasni:
     parameters:
@@ -3759,10 +3874,31 @@ paid:
     domains:
       - adform.net
 
+  ADFOX:
+    domains:
+      - adfox.ru
+      - www.adfox.ru
+      - ads.adfox.ru
+      - www.ads.adfox.ru
+
+  Adition:
+    domains:
+      - adition.com
+
+  AdNET:
+    domains:
+      - adnet.de
+
   AdRoll:
     domains:
       - adroll.com
 
+  AdSpirit:
+    domains:
+      - adspirit.de
+      - rtbcity.com
+      - plusperformance.com
+
   AppNexus:
     domains:
       - ib.adnxs.com
@@ -3821,6 +3957,12 @@ paid:
     domains:
       - lfstmedia.com
 
+  LowerMyBills:
+    parameters:
+      - leadid
+    domains:
+      - lowermybills.com
+
   Jivox:
     domains:
       - jivox.com
@@ -3861,6 +4003,11 @@ paid:
     domains:
       - farm.plista.com
 
+  Price.ru:
+    domains:
+      - price.ru
+      - v.price.ru
+
   PubMatic:
     domains:
       - sshowads.pubmatic.com
@@ -3900,6 +4047,10 @@ paid:
       - api.taboola.com
       - taboola.com
 
+  Torg.Mail.ru:
+    domains:
+      - torg.mail.ru
+
   Tribal Fusion:
     domains:
       - cdnx.tribalfusion.com
@@ -3909,6 +4060,19 @@ paid:
       - www.whitepages.com.au
       - mobile.whitepages.com.au
 
+  Yandex.Direct:
+    domains:
+      - an.yandex.ru
+      - yabs.yandex.ru
+      - yabs.yandex.ua
+      - yabs.yandex.com
+      - yabs.yandex.by
+
+  Yandex.Market:
+    domains:
+      - market.yandex.ru
+      - m.market.yandex.ru
+
   Yieldmo:
     domains:
       - yieldmo.com
diff --git a/priv/ua_inspector/device.mobiles.yml b/priv/ua_inspector/device.mobiles.yml
index f8d1939b118961bd95a9ed02fd28055dd2574e4d..a0a964e4ba6dd14baf3bc8e398eec6c9a05d28d8 100644
--- a/priv/ua_inspector/device.mobiles.yml
+++ b/priv/ua_inspector/device.mobiles.yml
@@ -16,7 +16,7 @@ Ace:
       model: 'Buzz 1 Plus'
 
 'Tunisie Telecom':
-  regex: 'StarTrail TT[);/ ]'
+  regex: 'StarTrail TT(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'StarTrail by TT'
 
@@ -25,37 +25,37 @@ SFR:
   regex: 'StarShine|StarTrail|STARADDICT|StarText|StarNaute|StarXtrem|StarTab'
   device: 'smartphone'
   models:
-    - regex: 'StarXtrem[);/ ]'
+    - regex: 'StarXtrem(?:[);/ ]|$)'
       model: 'StarXtrem' # ZTE
-    - regex: 'StarTrail ?4[);/ ]'
+    - regex: 'StarTrail ?4(?:[);/ ]|$)'
       model: 'StarTrail 4' # ZTE Blade Q
-    - regex: 'StarTrail III[);/ ]'
+    - regex: 'StarTrail III(?:[);/ ]|$)'
       model: 'StarTrail 3' # ZTE
-    - regex: 'StarTrail II[);/ ]'
+    - regex: 'StarTrail II(?:[);/ ]|$)'
       model: 'StarTrail 2' # Huawei Ascend Y200
-    - regex: 'StarTrail[);/ ]'
+    - regex: 'StarTrail(?:[);/ ]|$)'
       model: 'StarTrail' # ZTE
-    - regex: 'StarShine II[);/ ]'
+    - regex: 'StarShine II(?:[);/ ]|$)'
       model: 'StarShine 2' # ZTE
-    - regex: 'StarShine[);/ ]'
+    - regex: 'StarShine(?:[);/ ]|$)'
       model: 'StarShine' # Huawei U8180
-    - regex: 'STARADDICT 4[);/ ]'
+    - regex: 'STARADDICT 4(?:[);/ ]|$)'
       model: 'Staraddict 4'
-    - regex: 'STARADDICT III[);/ ]'
+    - regex: 'STARADDICT III(?:[);/ ]|$)'
       model: 'Staraddict 3' # Coolpad 8861U
-    - regex: 'STARADDICT II Plus[);/ ]'
+    - regex: 'STARADDICT II Plus(?:[);/ ]|$)'
       model: 'Staraddict 2 Plus' # ZTE Grand X
-    - regex: 'STARADDICT II[);/ ]'
+    - regex: 'STARADDICT II(?:[);/ ]|$)'
       model: 'Staraddict 2' # Alcatel One Touch 995
-    - regex: 'STARADDICT[);/ ]'
+    - regex: 'STARADDICT(?:[);/ ]|$)'
       model: 'Staraddict' # ZTE
-    - regex: 'StarText II[);/ ]'
+    - regex: 'StarText II(?:[);/ ]|$)'
       model: 'StarText 2' # ZTE
-    - regex: 'StarText[);/ ]'
+    - regex: 'StarText(?:[);/ ]|$)'
       model: 'StarText' # ZTE
-    - regex: 'StarNaute II[);/ ]'
+    - regex: 'StarNaute II(?:[);/ ]|$)'
       model: 'StarNaute 2' # ZTE
-    - regex: 'StarNaute[);/ ]'
+    - regex: 'StarNaute(?:[);/ ]|$)'
       model: 'StarNaute' # ZTE Amigo
     - regex: 'StarTab'
       model: 'StarTab'
@@ -66,33 +66,35 @@ SFR:
 
 # HTC
 HTC:
-  regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G[);/ ]|(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/)]+)(?: Build|\))|(Amaze[ _]4G|One ?[XELSV\+]+)[);/ ]|SPV E6[05]0|(One M8|X525a|PG86100|PC36100|XV6975|PJ83100|2PYB2|2PZC5|0PJA10|0PJA2|HTV33|0PM92|0PCV1|601HT|0PAJ5|HTL2[23]|HTV32|2PQ93)[);/ ]'
+  regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G(?:[);/ ]|$)|(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/)]+)(?: Build|\))|(Amaze[ _]4G|One ?[XELSV\+]+)(?:[);/ ]|$)|SPV E6[05]0|(One M8|X525a|PG86100|PC36100|XV6975|PJ83100|2PYB2|2PZC5|0PJA10|0PJA2|HTV33|0PM92|0PCV1|601HT|0PAJ5|HTL2[23]|HTV32|2PQ93|X2-HT)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit smartphone models
-    - regex: '2PZC5[);/ ]'
+    - regex: '2PZC5(?:[);/ ]|$)'
       model: 'U11'
-    - regex: 'XV6975[);/ ]'
+    - regex: 'XV6975(?:[);/ ]|$)'
       model: 'Imagio'
-    - regex: 'PG86100[);/ ]'
+    - regex: 'PG86100(?:[);/ ]|$)'
       model: 'Evo 3G'
-    - regex: 'PC36100[);/ ]'
+    - regex: 'PC36100(?:[);/ ]|$)'
       model: 'Evo 4G'
-    - regex: '(?:HTV33|601HT)[);/ ]'
+    - regex: '(?:HTV33|601HT)(?:[);/ ]|$)'
       model: 'U11'
     - regex: '(?:801e|802[wdt])'
       model: 'One'
-    - regex: 'PJ83100[);/ ]'
+    - regex: 'PJ83100(?:[);/ ]|$)'
       model: 'One X'
-    - regex: 'HTL22[);/ ]'
+    - regex: 'X2-HT(?:[);/ ]|$)'
+      model: 'One X2'
+    - regex: 'HTL22(?:[);/ ]|$)'
       model: 'J One'
-    - regex: 'HTL23[);/ ]'
+    - regex: 'HTL23(?:[);/ ]|$)'
       model: 'J Butterfly'
-    - regex: '(?:0PJA2|0PJA10)[);/ ]'
+    - regex: '(?:0PJA2|0PJA10)(?:[);/ ]|$)'
       model: 'One M9'
-    - regex: 'X525a[);/ ]'
+    - regex: 'X525a(?:[);/ ]|$)'
       model: 'One X+'
-    - regex: '2PQ93[);/ ]'
+    - regex: '2PQ93(?:[);/ ]|$)'
       model: 'One A9'
     - regex: 'ADR6300'
       model: 'Droid Incredible'
@@ -106,11 +108,11 @@ HTC:
       model: 'Vox'
     - regex: '2PYB2'
       model: 'Bolt'
-    - regex: '0PM92[);/ ]'
+    - regex: '0PM92(?:[);/ ]|$)'
       model: 'Desire 626S'
-    - regex: '0PCV1[);/ ]'
+    - regex: '0PCV1(?:[);/ ]|$)'
       model: 'Desire 510'
-    - regex: '608t[);/ ]'
+    - regex: '608t(?:[);/ ]|$)'
       model: 'Desire 608t'
 
     - regex: 'NexusHD2' # custom rom for hd2
@@ -124,7 +126,7 @@ HTC:
     - regex: 'HTC[ _\-]Flyer[ _\-]([\w]{1,5})'
       device: 'tablet'
       model: 'Flyer $1'
-    - regex: 'HTC[ _\-]One[ _\-]max[);/ ]'
+    - regex: 'HTC[ _\-]One[ _\-]max(?:[);/ ]|$)'
       device: 'phablet'
       model: 'One max'
     - regex: 'HTC[ _]([^/;]+) [0-9]+(?:\.[0-9]+)+ Build'
@@ -154,9 +156,9 @@ HTC:
       model: '$1'
     - regex: '(One M8)'
       model: '$1'
-    - regex: '0PAJ5[);/ ]'
+    - regex: '0PAJ5(?:[);/ ]|$)'
       model: 'One E8'
-    - regex: 'HTV32[);/ ]'
+    - regex: 'HTV32(?:[);/ ]|$)'
       model: '10'
 
 # microsoft
@@ -203,7 +205,7 @@ Microsoft:
     - regex: 'Lumia 1530'
       model: 'Lumia 1530'
 
-    - regex: 'Microsoft; Lumia ([^;/)]+)[;/)]'
+    - regex: 'Microsoft; Lumia ([^;/)]+)(?:[;/)]|$)'
       model: 'Lumia $1'
 
 # NOKIA
@@ -660,14 +662,14 @@ Apple:
 
 # micromax
 MicroMax:
-  regex: '(?:MicroMax[ \-\_]?[a-z0-9]+|Q327)|4560MMX|P70221 Build|(?:YU(?:5040|5530)|AQ5001 Canvas Power)[);/ ]'
+  regex: '(?:MicroMax[ \-\_]?[a-z0-9]+|Q327)|4560MMX|P70221 Build|(?:YU(?:5040|5530)|AQ5001 Canvas Power)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'AQ5001 Canvas Power'
       model: 'Canvas Power'
     - regex: 'AQ5001'
       model: 'Canvas Juice 2'
-    - regex: '4560MMX[);/ ]'
+    - regex: '4560MMX(?:[);/ ]|$)'
       model: '4560MMX'
     - regex: 'E481'
       model: 'Canvas 5'
@@ -680,9 +682,9 @@ MicroMax:
       model: 'Canvas Mega'
     - regex: 'Q402\+'
       model: 'Bolt Pace'
-    - regex: 'YU5040[);/ ]'
+    - regex: 'YU5040(?:[);/ ]|$)'
       model: 'YU Yureka YU5040'
-    - regex: 'YU5530[);/ ]'
+    - regex: 'YU5530(?:[);/ ]|$)'
       model: 'YU Yureka S YU5530'
     - regex: 'Q424'
       model: 'Bolt Selfie'
@@ -744,7 +746,7 @@ Alba:
 
 # AllCall
 AllCall:
-  regex: 'AllCall_|Heat[34]|Hot ?[125][^;/]+ Build'
+  regex: 'AllCall_|Heat[34]|Rio_X(?:[);/ ]|$)|Hot ?[125][^;/]+ Build'
   device: 'smartphone'
   models:
     - regex: 'AllCall_(Alpha|Atom|Bro|Madrid)'
@@ -761,6 +763,8 @@ AllCall:
       model: 'Rio'
     - regex: 'Heat([34])'
       model: 'Heat $1'
+    - regex: 'Rio_X(?:[);/ ]|$)'
+      model: 'Rio X'
     - regex: 'Hot ?([125][^;/]+) Build'
       model: 'Hot $1'
 
@@ -838,17 +842,17 @@ Bravis:
 
 # Acer
 Acer:
-  regex: 'acer|(?<!Satellite |ZTE BLADE |ImSmart |ERGO |X-Style Tab )a(?:101|110|2[10]0|211|50[10]|51[10]|70[10])[);/ ]|Android.*V3[67]0[);/ ]|Android.*Z1[23456]0 Build|Android.*Z5\d{2} Build|Android.*T0[234678] Build|Android.*S55[);/ ]|(?:A1-(713(HD)?|7[23]4|830|841|840FHD|81[01])|A3-A[1234][01]|B1-(7[1235-8][01](HD)?|7[23]3|7A0|8[1235]0|A71|860A)|B3-(A[125]0|A3[02]|A40FHD)|E39)[);/ ]|S5[12]0 Build|(DA[0-9]+HQ?L|Aspire V5-121|Predator G9-793|GT-810|B1-870|B3-A4[02])[);/ ]'
+  regex: 'acer|(?<!Satellite |ZTE BLADE |ImSmart |ERGO |X-Style Tab )a(?:101|110|2[10]0|211|50[10]|51[10]|70[10])(?:[);/ ]|$)|Android.*V3[67]0(?:[);/ ]|$)|Android.*Z1[23456]0 Build|Android.*Z5\d{2} Build|Android.*T0[234678] Build|Android.*S55(?:[);/ ]|$)|(?:A1-(713(HD)?|7[23]4|830|841|840FHD|81[01])|A3-A[1234][01]|B1-(7[1235-8][01](HD)?|7[23]3|7A0|8[1235]0|A71|860A)|B3-(A[125]0|A3[02]|A40FHD)|E39)(?:[);/ ]|$)|S5[12]0 Build|(DA[0-9]+HQ?L|Aspire V5-121|Chromebook 14 \(CB3-431\)|Predator G9-793|GT-810|B1-870|B3-A4[02])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # smart displays
-    - regex: 'DA220HQL[);/ ]'
+    - regex: 'DA220HQL(?:[);/ ]|$)'
       model: 'DA220HQL'
       device: 'smart display'
-    - regex: 'DA241HL[);/ ]'
+    - regex: 'DA241HL(?:[);/ ]|$)'
       model: 'DA241HL'
       device: 'smart display'
-    - regex: '(DA[0-9]+HQ?L)[);/ ]'
+    - regex: '(DA[0-9]+HQ?L)(?:[);/ ]|$)'
       model: '$1'
       device: 'smart display'
 
@@ -906,61 +910,61 @@ Acer:
       device: 'tablet'
 
     # explicit smartphone models
-    - regex: 'E39[);/ ]'
+    - regex: 'E39(?:[);/ ]|$)'
       model: 'Liquid E700'
-    - regex: 'E310[);/ ]'
+    - regex: 'E310(?:[);/ ]|$)'
       model: 'Liquid Mini'
-    - regex: 'E320(?:-orange)?[);/ ]'
+    - regex: 'E320(?:-orange)?(?:[);/ ]|$)'
       model: 'Liquid Express'
-    - regex: 'E310[);/ ]'
+    - regex: 'E310(?:[);/ ]|$)'
       model: 'beTouch E210'
-    - regex: 'Android.*V360[);/ ]'
+    - regex: 'Android.*V360(?:[);/ ]|$)'
       model: 'Liquid E1 Duo'
-    - regex: 'Android.*V370[);/ ]'
+    - regex: 'Android.*V370(?:[);/ ]|$)'
       model: 'Liquid E2 Duo'
-    - regex: 'S510[);/ ]'
+    - regex: 'S510(?:[);/ ]|$)'
       model: 'Liquid S1'
-    - regex: 'S520[);/ ]'
+    - regex: 'S520(?:[);/ ]|$)'
       model: 'Liquid S2'
-    - regex: '(?:Acer_)?P400[);/ ]'
+    - regex: '(?:Acer_)?P400(?:[);/ ]|$)'
       model: 'neoTouch P400'
-    - regex: '(?:Acer_)?P300[);/ ]'
+    - regex: '(?:Acer_)?P300(?:[);/ ]|$)'
       model: 'neoTouch P300'
-    - regex: '(?:Acer_)?S200[);/ ]'
+    - regex: '(?:Acer_)?S200(?:[);/ ]|$)'
       model: 'neoTouch S200'
-    - regex: '(?:Acer_)?E100[);/ ]'
+    - regex: '(?:Acer_)?E100(?:[);/ ]|$)'
       model: 'beTouch E100'
-    - regex: 'Android.*Z1([234])0[);/ ]'
+    - regex: 'Android.*Z1([234])0(?:[);/ ]|$)'
       model: 'Liquid Z$1'
-    - regex: 'Android.*Z110[);/ ]'
+    - regex: 'Android.*Z110(?:[);/ ]|$)'
       model: 'Liquid Z110'
-    - regex: 'Android.*Z150[);/ ]'
+    - regex: 'Android.*Z150(?:[);/ ]|$)'
       model: 'Liquid Z5 Duo'
-    - regex: 'Android.*Z160[);/ ]'
+    - regex: 'Android.*Z160(?:[);/ ]|$)'
       model: 'Liquid Z4 Duo'
-    - regex: 'Android.*Z(5\d{2})[);/ ]'
+    - regex: 'Android.*Z(5\d{2})(?:[);/ ]|$)'
       model: 'Liquid Z$1'
-    - regex: 'Android.*S57[);/ ]'
+    - regex: 'Android.*S57(?:[);/ ]|$)'
       model: 'Liquid Jade Z'
-    - regex: 'Android.*T02[);/ ]'
+    - regex: 'Android.*T02(?:[);/ ]|$)'
       model: 'Liquid Z530'
-    - regex: 'Android.*T03[);/ ]'
+    - regex: 'Android.*T03(?:[);/ ]|$)'
       model: 'Liquid Z630'
-    - regex: 'Android.*T04[);/ ]'
+    - regex: 'Android.*T04(?:[);/ ]|$)'
       model: 'Liquid Z630S'
-    - regex: 'Android.*T06[);/ ]'
+    - regex: 'Android.*T06(?:[);/ ]|$)'
       model: 'Liquid Zest'
-    - regex: 'Android.*T07[);/ ]'
+    - regex: 'Android.*T07(?:[);/ ]|$)'
       model: 'Liquid Zest 4G'
-    - regex: 'Android.*T08[);/ ]'
+    - regex: 'Android.*T08(?:[);/ ]|$)'
       model: 'Liquid Zest Plus'
-    - regex: 'TM01[);/ ]'
+    - regex: 'TM01(?:[);/ ]|$)'
       model: 'Liquid M330'
-    - regex: 'M220[);/ ]'
+    - regex: 'M220(?:[);/ ]|$)'
       model: 'Liquid M220'
     - regex: 'AcerTD600'
       model: 'TD600'
-    - regex: 'Android.*S55[);/ ]'
+    - regex: 'Android.*S55(?:[);/ ]|$)'
       model: 'Liquid Jade'
 
     # desktop models
@@ -983,13 +987,13 @@ Acer:
       model: '$1'
     - regex: 'acer[\-_]([a-z0-9]+)'
       model: '$1'
-    - regex: 'a(101|110|2[10]0|211|50[10]|51[10]|70[10])[);/ ]'
+    - regex: 'a(101|110|2[10]0|211|50[10]|51[10]|70[10])(?:[);/ ]|$)'
       model: 'Iconia Tab A$1'
       device: 'tablet'
 
 # Advan
 Advan:
-  regex: '(?:ADVAN (?:M4|S40)|i7U|S45E|50[46]1|5059|S50H|I7D|i55[KD]|i4U|S7D|S4Z|i5[KE]|S5E[ _]NXT|S5J\+)[);/ ]'
+  regex: '(?:ADVAN (?:M4|S40)|i7U|S45E|50[46]1|5059|S50H|I7D|i55[KD]|i4U|S7D|S4Z|i5[KE]|S5E[ _]NXT|S5J\+)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'ADVAN M4'
@@ -1004,7 +1008,7 @@ Advan:
       model: 'I$1'
     - regex: 'i4U'
       model: 'I4U'
-    - regex: '(S45E|50[46]1|5059|S50H|I7D|S7D|S4Z|S5J\+)[);/ ]'
+    - regex: '(S45E|50[46]1|5059|S50H|I7D|S7D|S4Z|S5J\+)(?:[);/ ]|$)'
       model: '$1'
 
 # Advance
@@ -1034,16 +1038,16 @@ Airness:
 
 # Aiwa
 Aiwa:
-  regex: '(?:AW790|M300|AWM533|AW500)[);/ ]'
+  regex: '(?:AW790|M300|AWM533|AW500)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'AW790[);/ ]'
+    - regex: 'AW790(?:[);/ ]|$)'
       model: 'AW790'
-    - regex: 'AW500[);/ ]'
+    - regex: 'AW500(?:[);/ ]|$)'
       model: 'AW500'
-    - regex: 'AWM533[);/ ]'
+    - regex: 'AWM533(?:[);/ ]|$)'
       model: 'AWM533'
-    - regex: 'M300[);/ ]'
+    - regex: 'M300(?:[);/ ]|$)'
       model: 'M300'
       device: 'phablet'
 
@@ -1067,7 +1071,7 @@ Akai:
       model: 'Eco E2'
     - regex: 'Akai[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'Akai[ _-]([^;/]+)[;/)]'
+    - regex: 'Akai[ _-]([^;/]+)(?:[;/)]|$)'
       model: '$1'
 
 # Arian
@@ -1086,237 +1090,237 @@ Arian Space:
 
 # Alcatel
 Alcatel:
-  regex: 'Alcatel|Alc(?!or )[a-z0-9]+|One[ _]?Touch|idol3|(?:4003[AJ]|4009[ADEFIKMSX]|4013[DEJKMX]|4014[ADEKMX]|4015[ADNTX]|4016[ADX]|4017[ADEFSX]|4018[ADEFMX]|4024[EDX]|4027[ADNX]|4028[AEJS]|4032[ADEX]|4034L_EEA|4034[ADEFGX]|4035[ADXY]|4045[ADEX]|4047[ADFGNX]|4049[DEGMX]|4060[SW]|A466BG|A621BL|4114E|5001[ADJTU](?:_EEA|_RU)?|5003[ADG](?:_(?:EEA|RU))?|5007A|5008[DUY](?:_(?:EEA|RU))?|5009[AD](?:_RU|_EEA)?|5010[DEGSUX]|5011A|5012[DFG]|5015[ADEX]|5016[AXJ]|5017[ABDEOX]|5019D|5022[EDX]|5023[EF]|5024[ADJ](?:_RU|_EEA)?|5025[DEG]|5026[ADJ]|5027B|5028A|5029E|5032W|5033[AEFXDJGMOTXY](?:_(?:EEA|RU))?|5034D(_RU)?|5036D|5038[ADEX]|5039[D](?:_EEA|_RU)?|5041[CD]|5042[ADEFGWX]|5044[ADGIKOPSTY]|5045[ADFGIJTXY]|5046[ADGIJSTUY]|5047[DIUY]|5048[AYU](?:_RU|_EEA)?|5049[EGSWZ]|5050[ASXY]|5051[ADEJMTWX]|5052[ADY](_RU)?|5053[AKY](?:_EEA|_RU)?|5054[ADNSTWX]|5056[ADEGIJMNTUWX]|5057M|5058[AIY](_RU)?|5059[ADXYZIST](_RU)?|5060D(?:_EEA|_RU)?|5065[ADNWX]|5070D|5080[ADFQUX]|5085[ABCDGHIJNOQY]|5086[ADY]|5090[AIY]|5095[IKY]|5098[OS]|5099[ADYUI](_RU)?|5116J|5145A|6016[ADEX]|6036[AXY]|6037[BKY]|6039[AHJKY]|6043[AD]|6044D|6045[BFIKOYX]|6050[AFY]|6055[ABDHIKPUYZ]|6058[ADX]|6060S|6062W|6070K|7040[ADEFKRT]|7041[DX]|7042A|7043[AEKY]|7044[AX]|7045Y|7048[ASWX]|7053D|7055A|7070X|8030Y|8050[DEGX]|8063|9001[DIX]|9002X|9003[AX]|9024O|9005X|9026X|9007[ATX]|9008[ADIJNTUX]|9010X|9022X|9027[FTWX]|9203A|A570BL|I213|I216X|A50[13]DL|A574BL|A57[17]VL|A464BG|5028Y[_ ]EEA)[);/ ]|TIMXL'
+  regex: 'Alcatel|Alc(?!or )[a-z0-9]+|One[ _]?Touch|idol3|(?:4003[AJ]|4009[ADEFIKMSX]|4013[DEJKMX]|4014[ADEKMX]|4015[ADNTX]|4016[ADX]|4017[ADEFSX]|4018[ADEFMX]|4024[EDX]|4027[ADNX]|4028[AEJS]|4032[ADEX]|4034L_EEA|4034[ADEFGX]|4035[ADXY]|4045[ADEX]|4047[ADFGNX]|4049[DEGMX]|4060[SW]|A466BG|A621BL|4114E|5001[ADJTU](?:_EEA|_RU)?|5003[ADG](?:_(?:EEA|RU))?|5007A|5008[DUY](?:_(?:EEA|RU))?|5009[AD](?:_RU|_EEA)?|5010[DEGSUX]|5011A|5012[DFG]|5015[ADEX]|5016[AXJ]|5017[ABDEOX]|5019D|5022[EDX]|5023[EF]|5024[ADJ](?:_RU|_EEA)?|5025[DEG]|5026[ADJ]|5027B|5028A|5029E|5032W|5033[AEFXDJGMOTXY](?:_(?:EEA|RU))?|5034D(_RU)?|5036D|5038[ADEX]|5039[D](?:_EEA|_RU)?|5041[CD]|5042[ADEFGWX]|5044[ADGIKOPSTY]|5045[ADFGIJTXY]|5046[ADGIJSTUY]|5047[DIUY]|5048[AYU](?:_RU|_EEA)?|5049[EGSWZ]|5050[ASXY]|5051[ADEJMTWX]|5052[ADY](_RU)?|5053[AKY](?:_EEA|_RU)?|5054[ADNSTWX]|5056[ADEGIJMNTUWX]|5057M|5058[AIY](_RU)?|5059[ADXYZIST](_RU)?|5060D(?:_EEA|_RU)?|5065[ADNWX]|5070D|5080[ADFQUX]|5085[ABCDGHIJNOQY]|5086[ADY]|5090[AIY]|5095[IKY]|5098[OS]|5099[ADYUI](_RU)?|5116J|5145A|6016[ADEX]|6036[AXY]|6037[BKY]|6039[AHJKY]|6043[AD]|6044D|6045[BFIKOYX]|6050[AFY]|6055[ABDHIKPUYZ]|6058[ADX]|6060S|6062W|6070K|7040[ADEFKRT]|7041[DX]|7042A|7043[AEKY]|7044[AX]|7045Y|7048[ASWX]|7053D|7055A|7070X|8030Y|8050[DEGX]|8063|9001[DIX]|9002X|9003[AX]|9024O|9005X|9026X|9007[ATX]|9008[ADIJNTUX]|9010X|9022X|9027[FTWX]|9203A|A570BL|I213|I216X|A50[13]DL|A574BL|A57[17]VL|A464BG|5028Y[_ ]EEA)(?:[);/ ]|$)|TIMXL'
   device: 'smartphone'
   models:
-    - regex: '(?:5022[EDX]|5070D)[);/ ]'
+    - regex: '(?:5022[EDX]|5070D)(?:[);/ ]|$)'
       model: 'One Touch Pop Star'
-    - regex: '6044D[);/ ]'
+    - regex: '6044D(?:[);/ ]|$)'
       model: 'One Touch Pop Up'
-    - regex: '(?:4015[ATX]|4016A)[);/ ]'
+    - regex: '(?:4015[ATX]|4016A)(?:[);/ ]|$)'
       model: 'One Touch Pop C1'
-    - regex: '(?:4015[DN]|4016[DX])[);/ ]'
+    - regex: '(?:4015[DN]|4016[DX])(?:[);/ ]|$)'
       model: 'One Touch Pop C1 Dual SIM'
-    - regex: '4032[AX][);/ ]'
+    - regex: '4032[AX](?:[);/ ]|$)'
       model: 'One Touch Pop C2'
-    - regex: '4032[DE][);/ ]'
+    - regex: '4032[DE](?:[);/ ]|$)'
       model: 'One Touch Pop C2 Dual SIM'
-    - regex: '5036D[);/ ]'
+    - regex: '5036D(?:[);/ ]|$)'
       model: 'One Touch Pop C5 Dual SIM'
-    - regex: '(?:7040[AFK]|7041X|7042A)[);/ ]'
+    - regex: '(?:7040[AFK]|7041X|7042A)(?:[);/ ]|$)'
       model: 'One Touch Pop C7'
-    - regex: '(?:7040[DE]|7041D)[);/ ]'
+    - regex: '(?:7040[DE]|7041D)(?:[);/ ]|$)'
       model: 'One Touch Pop C7 Dual SIM'
-    - regex: '4018[ADEFMX][);/ ]'
+    - regex: '4018[ADEFMX](?:[);/ ]|$)'
       model: 'One Touch Pop D1'
-    - regex: '4035[ADXY][);/ ]'
+    - regex: '4035[ADXY](?:[);/ ]|$)'
       model: 'One Touch Pop D3'
-    - regex: '5038[ADEX][);/ ]'
+    - regex: '5038[ADEX](?:[);/ ]|$)'
       model: 'One Touch Pop D5'
-    - regex: '4045[AX][);/ ]'
+    - regex: '4045[AX](?:[);/ ]|$)'
       model: 'One Touch Pop 2 4"'
-    - regex: '4045[DE][);/ ]'
+    - regex: '4045[DE](?:[);/ ]|$)'
       model: 'One Touch Pop 2 4" Dual SIM'
-    - regex: '5042[AFGWX][);/ ]'
+    - regex: '5042[AFGWX](?:[);/ ]|$)'
       model: 'One Touch Pop 2 4.5"'
-    - regex: '5042[DE][);/ ]'
+    - regex: '5042[DE](?:[);/ ]|$)'
       model: 'One Touch Pop 2 4.5" Dual SIM'
-    - regex: '(?:7043[AY]|7044[AX])[);/ ]'
+    - regex: '(?:7043[AY]|7044[AX])(?:[);/ ]|$)'
       model: 'One Touch Pop 2 5"'
-    - regex: '7043[EK][);/ ]'
+    - regex: '7043[EK](?:[);/ ]|$)'
       model: 'One Touch Pop 2 5" Dual SIM'
-    - regex: '50[16]5X[);/ ]'
+    - regex: '50[16]5X(?:[);/ ]|$)'
       model: 'One Touch Pop 3'
-    - regex: '(?:5015[AE]|5016[AJ]|5065[ADWX]|5116J)[);/ ]'
+    - regex: '(?:5015[AE]|5016[AJ]|5065[ADWX]|5116J)(?:[);/ ]|$)'
       model: 'One Touch Pop 3 5"'
-    - regex: '(?:5025[DEG]|5054[ADSTX])[);/ ]'
+    - regex: '(?:5025[DEG]|5054[ADSTX])(?:[);/ ]|$)'
       model: 'One Touch Pop 3 5.5"'
-    - regex: '5015D[);/ ]'
+    - regex: '5015D(?:[);/ ]|$)'
       model: 'One Touch Pop 3 Dual SIM'
-    - regex: '5051[AEJMTWX][);/ ]'
+    - regex: '5051[AEJMTWX](?:[);/ ]|$)'
       model: 'One Touch Pop 4'
-    - regex: '5051D[);/ ]'
+    - regex: '5051D(?:[);/ ]|$)'
       model: 'One Touch Pop 4 Dual SIM'
-    - regex: '5095[IKY][);/ ]'
+    - regex: '5095[IKY](?:[);/ ]|$)'
       model: 'One Touch Pop 4S'
-    - regex: '5056[ADEGJMTUX][);/ ]'
+    - regex: '5056[ADEGJMTUX](?:[);/ ]|$)'
       model: 'One Touch Pop 4+'
-    - regex: '7070X[);/ ]'
+    - regex: '7070X(?:[);/ ]|$)'
       model: 'One Touch Pop 4 6"'
-    - regex: '5057M[);/ ]'
+    - regex: '5057M(?:[);/ ]|$)'
       model: 'One Touch Pop Mirage'
-    - regex: '5050[ASXY][);/ ]'
+    - regex: '5050[ASXY](?:[);/ ]|$)'
       model: 'One Touch Pop S3'
-    - regex: '7045Y[);/ ]'
+    - regex: '7045Y(?:[);/ ]|$)'
       model: 'One Touch Pop S7'
-    - regex: '6037[BKY][);/ ]'
+    - regex: '6037[BKY](?:[);/ ]|$)'
       model: 'One Touch Idol 2'
-    - regex: '5027B[);/ ]'
+    - regex: '5027B(?:[);/ ]|$)'
       model: 'One Touch Dawn'
-    - regex: '(?:5024[AD](?:_RU|_EEA)?|5028Y[_ ]EEA)[);/ ]'
+    - regex: '(?:5024[AD](?:_RU|_EEA)?|5028Y[_ ]EEA)(?:[);/ ]|$)'
       model: '1S'
-    - regex: '5034D(_RU)?[);/ ]'
+    - regex: '5034D(_RU)?(?:[);/ ]|$)'
       model: '3L'
-    - regex: '7040[RT][);/ ]'
+    - regex: '7040[RT](?:[);/ ]|$)'
       model: 'One Touch Fierce 2'
     - regex: '5056[NW]'
       model: 'One Touch Fierce 4'
     - regex: '5054[NW]'
       model: 'One Touch Fierce XL'
-    - regex: '6016[AX][);/ ]'
+    - regex: '6016[AX](?:[);/ ]|$)'
       model: 'One Touch Idol 2 mini'
-    - regex: '6016[DE][);/ ]'
+    - regex: '6016[DE](?:[);/ ]|$)'
       model: 'One Touch Idol 2 mini Dual SIM'
-    - regex: '6036[AXY][);/ ]'
+    - regex: '6036[AXY](?:[);/ ]|$)'
       model: 'One Touch Idol 2 mini S'
-    - regex: '6050[AFY][);/ ]'
+    - regex: '6050[AFY](?:[);/ ]|$)'
       model: 'One Touch Idol 2S'
-    - regex: '6039[AHJKY][);/ ]|idol3'
+    - regex: '6039[AHJKY](?:[);/ ]|$)|idol3'
       model: 'One Touch Idol 3'
-    - regex: '6045[BFIKOYX][);/ ]'
+    - regex: '6045[BFIKOYX](?:[);/ ]|$)'
       model: 'One Touch Idol 3 5.5"'
-    - regex: '6055[ABDHIKPUYZ][);/ ]'
+    - regex: '6055[ABDHIKPUYZ](?:[);/ ]|$)'
       model: 'One Touch Idol 4'
-    - regex: '6070K[);/ ]'
+    - regex: '6070K(?:[);/ ]|$)'
       model: 'One Touch Idol 4S'
-    - regex: '6058[ADX][);/ ]'
+    - regex: '6058[ADX](?:[);/ ]|$)'
       model: 'One Touch Idol 5'
-    - regex: '6060S[);/ ]'
+    - regex: '6060S(?:[);/ ]|$)'
       model: 'One Touch Idol 5S'
-    - regex: '6043[AD][);/ ]'
+    - regex: '6043[AD](?:[);/ ]|$)'
       model: 'One Touch Idol X+'
-    - regex: '8030Y[);/ ]'
+    - regex: '8030Y(?:[);/ ]|$)'
       model: 'One Touch Hero 2'
-    - regex: '7055A[);/ ]'
+    - regex: '7055A(?:[);/ ]|$)'
       model: 'One Touch Hero 2C'
-    - regex: '7053D[);/ ]'
+    - regex: '7053D(?:[);/ ]|$)'
       model: 'One Touch X1'
-    - regex: '5065N[);/ ]'
+    - regex: '5065N(?:[);/ ]|$)'
       model: 'TRU'
-    - regex: 'A574BL[);/ ]'
+    - regex: 'A574BL(?:[);/ ]|$)'
       model: 'Raven'
-    - regex: 'A577VL[);/ ]'
+    - regex: 'A577VL(?:[);/ ]|$)'
       model: 'Zip'
-    - regex: 'A466BG[);/ ]'
+    - regex: 'A466BG(?:[);/ ]|$)'
       model: 'Pixi Unite'
-    - regex: '5056I[);/ ]'
+    - regex: '5056I(?:[);/ ]|$)'
       model: 'One Touch Optus X Smart'
-    - regex: 'A570BL[);/ ]'
+    - regex: 'A570BL(?:[);/ ]|$)'
       model: 'One Touch Pixi Avion LTE'
-    - regex: 'A571VL[);/ ]'
+    - regex: 'A571VL(?:[);/ ]|$)'
       model: 'One Touch Pixi Avion 4G LTE'
-    - regex: '4024[DEX][);/ ]'
+    - regex: '4024[DEX](?:[);/ ]|$)'
       model: 'One Touch Pixi First'
-    - regex: 'A464BG[);/ ]'
+    - regex: 'A464BG(?:[);/ ]|$)'
       model: 'One Touch Pixi Glitz'
-    - regex: 'A621BL[);/ ]'
+    - regex: 'A621BL(?:[);/ ]|$)'
       model: 'One Touch Pixi Glory'
-    - regex: '4014D[);/ ]'
+    - regex: '4014D(?:[);/ ]|$)'
       model: 'One Touch Pixi 2'
-    - regex: '4009[AFIKMSX][);/ ]'
+    - regex: '4009[AFIKMSX](?:[);/ ]|$)'
       model: 'One Touch Pixi 3 3.5"'
-    - regex: '4009[DE][);/ ]'
+    - regex: '4009[DE](?:[);/ ]|$)'
       model: 'One Touch Pixi 3 3.5" Dual SIM'
-    - regex: '(?:4003[AJ]|4013[DEJKMX]|4014[AEKMX]|4114E)[);/ ]'
+    - regex: '(?:4003[AJ]|4013[DEJKMX]|4014[AEKMX]|4114E)(?:[);/ ]|$)'
       model: 'One Touch Pixi 3 4"'
-    - regex: '(?:4027[ADNX]|4028[AEJS]|5019D)[);/ ]'
+    - regex: '(?:4027[ADNX]|4028[AEJS]|5019D)(?:[);/ ]|$)'
       model: 'One Touch Pixi 3 4.5"'
-    - regex: '5017[ABDEOX][);/ ]'
+    - regex: '5017[ABDEOX](?:[);/ ]|$)'
       model: 'One Touch Pixi 3 4.5" 4G'
-    - regex: '9002X[);/ ]'
+    - regex: '9002X(?:[);/ ]|$)'
       model: 'One Touch Pixi 3 7"'
       device: 'phablet'
-    - regex: '9007A[);/ ]'
+    - regex: '9007A(?:[);/ ]|$)'
       model: 'One Touch Pixi 3 7"'
       device: 'tablet'
-    - regex: '9007[TX][);/ ]'
+    - regex: '9007[TX](?:[);/ ]|$)'
       model: 'One Touch Pixi 3 7" 4G'
       device: 'tablet'
-    - regex: '9022X[);/ ]'
+    - regex: '9022X(?:[);/ ]|$)'
       model: 'One Touch Pixi 3 8"'
       device: 'phablet'
-    - regex: '9010X[);/ ]'
+    - regex: '9010X(?:[);/ ]|$)'
       model: 'One Touch Pixi 3 10"'
       device: 'tablet'
-    - regex: '4017[ADEFSX][);/ ]'
+    - regex: '4017[ADEFSX](?:[);/ ]|$)'
       model: 'One Touch Pixi 4 3.5"'
-    - regex: '4034(?:[ADEFGX]|L_EEA)[);/ ]'
+    - regex: '4034(?:[ADEFGX]|L_EEA)(?:[);/ ]|$)'
       model: 'One Touch Pixi 4 4"'
-    - regex: '4060[SW][);/ ]'
+    - regex: '4060[SW](?:[);/ ]|$)'
       model: 'One Touch Pixi 4 4.5"'
-    - regex: '5023[EF][);/ ]'
+    - regex: '5023[EF](?:[);/ ]|$)'
       model: 'One Touch Pixi 4 Plus Power'
-    - regex: '5010[DEGSUX][);/ ]'
+    - regex: '5010[DEGSUX](?:[);/ ]|$)'
       model: 'One Touch Pixi 4 5" 3G'
-    - regex: '5041D[);/ ]'
+    - regex: '5041D(?:[);/ ]|$)'
       model: 'One Touch Pixi 4 5.0"'
-    - regex: '5012[DFG][);/ ]'
+    - regex: '5012[DFG](?:[);/ ]|$)'
       model: 'One Touch Pixi 4 5.5" 3G'
-    - regex: '(?:5045[ADFGIJTXY]|5145A)[);/ ]'
+    - regex: '(?:5045[ADFGIJTXY]|5145A)(?:[);/ ]|$)'
       model: 'One Touch Pixi 4 5" 4G'
-    - regex: '5098O[);/ ]'
+    - regex: '5098O(?:[);/ ]|$)'
       model: 'One Touch Pixi Theatre'
-    - regex: 'A501DL[);/ ]'
+    - regex: 'A501DL(?:[);/ ]|$)'
       model: 'A1'
-    - regex: 'A503DL[);/ ]'
+    - regex: 'A503DL(?:[);/ ]|$)'
       model: 'A1X'
-    - regex: '5046[ADIJTUY][);/ ]'
+    - regex: '5046[ADIJTUY](?:[);/ ]|$)'
       model: 'A3'
-    - regex: '(?:5011A|5049[EG])[);/ ]'
+    - regex: '(?:5011A|5049[EG])(?:[);/ ]|$)'
       model: 'A3 Plus'
     - regex: '9008[ADIJNTUX]'
       model: 'A3 XL'
-    - regex: '9203A[);/ ]'
+    - regex: '9203A(?:[);/ ]|$)'
       model: 'A3 7" 3G'
       device: 'tablet'
-    - regex: '9027[FTWX][);/ ]'
+    - regex: '9027[FTWX](?:[);/ ]|$)'
       model: '3T 8.0"'
       device: 'tablet'
-    - regex: '9026X[);/ ]'
+    - regex: '9026X(?:[);/ ]|$)'
       model: 'A3 10"'
       device: 'tablet'
-    - regex: '5085[BQ][);/ ]'
+    - regex: '5085[BQ](?:[);/ ]|$)'
       model: 'A5'
-    - regex: '5085[ADHIJY][);/ ]'
+    - regex: '5085[ADHIJY](?:[);/ ]|$)'
       model: 'A5 LED'
-    - regex: '5085N[);/ ]'
+    - regex: '5085N(?:[);/ ]|$)'
       model: 'A5 Max LED'
-    - regex: '5090[AIY][);/ ]'
+    - regex: '5090[AIY](?:[);/ ]|$)'
       model: 'A7'
-    - regex: '5046[GS][);/ ]'
+    - regex: '5046[GS](?:[);/ ]|$)'
       model: 'A30'
-    - regex: '5049S[);/ ]'
+    - regex: '5049S(?:[);/ ]|$)'
       model: 'A30 Plus'
-    - regex: '5049Z[);/ ]'
+    - regex: '5049Z(?:[);/ ]|$)'
       model: 'A30 Fierce'
     - regex: '5085[GO]'
       model: 'A50'
-    - regex: '5048[AYU](?:_RU|_EEA)?[);/ ]'
+    - regex: '5048[AYU](?:_RU|_EEA)?(?:[);/ ]|$)'
       model: '3X (2019)'
-    - regex: '5049W[);/ ]'
+    - regex: '5049W(?:[);/ ]|$)'
       model: 'Revvl'
-    - regex: '8050[GX][);/ ]'
+    - regex: '8050[GX](?:[);/ ]|$)'
       model: 'One Touch Pixi 4 6" 3G'
-    - regex: '8050[ED][);/ ]'
+    - regex: '8050[ED](?:[);/ ]|$)'
       model: 'One Touch Pixi 4 6" 3G Dual SIM'
-    - regex: '(?:5098S|9001[DIX])[);/ ]'
+    - regex: '(?:5098S|9001[DIX])(?:[);/ ]|$)'
       model: 'One Touch Pixi 4 6" 4G'
-    - regex: '9003[AX][);/ ]'
+    - regex: '9003[AX](?:[);/ ]|$)'
       model: 'One Touch Pixi 4 7" 3G'
       device: 'tablet'
-    - regex: '8063[);/ ]'
+    - regex: '8063(?:[);/ ]|$)'
       model: 'One Touch Pixi 4 7" WiFi'
       device: 'tablet'
-    - regex: '9024O[);/ ]'
+    - regex: '9024O(?:[);/ ]|$)'
       model: 'One Touch Pixi 5'
       device: 'tablet'
-    - regex: 'I216X[);/ ]'
+    - regex: 'I216X(?:[);/ ]|$)'
       model: 'One Touch Pixi 7'
       device: 'tablet'
-    - regex: 'I213[);/ ]'
+    - regex: 'I213(?:[);/ ]|$)'
       model: 'One Touch Pixi 7'
       device: 'tablet'
-    - regex: '9005X[);/ ]'
+    - regex: '9005X(?:[);/ ]|$)'
       model: 'One Touch Pixi 8'
       device: 'tablet'
     - regex: 'P320X'
@@ -1325,21 +1329,21 @@ Alcatel:
     - regex: 'P310X'
       model: 'One Touch POP 7'
       device: 'tablet'
-    - regex: '7048[ASWX][);/ ]'
+    - regex: '7048[ASWX](?:[);/ ]|$)'
       model: 'One Touch Go Play'
-    - regex: '(?:Alcatel-)?OT-802[);/ ]'
+    - regex: '(?:Alcatel-)?OT-802(?:[);/ ]|$)'
       model: 'Wave'
-    - regex: 'ALCATEL_ONE_TOUCH_768T[);/ ]'
+    - regex: 'ALCATEL_ONE_TOUCH_768T(?:[);/ ]|$)'
       model: 'Island'
-    - regex: '(?:TRIBE_)?3075A[);/ ]'
+    - regex: '(?:TRIBE_)?3075A(?:[);/ ]|$)'
       model: 'One Touch Tribe'
-    - regex: 'ALCATEL_one_touch_585[);/ ]'
+    - regex: 'ALCATEL_one_touch_585(?:[);/ ]|$)'
       model: 'One Touch 585'
-    - regex: 'ALCATEL_ONE_TOUCH_838[);/ ]'
+    - regex: 'ALCATEL_ONE_TOUCH_838(?:[);/ ]|$)'
       model: 'One Touch 838'
-    - regex: 'ALCATEL_one_touch_813d[);/ ]'
+    - regex: 'ALCATEL_one_touch_813d(?:[);/ ]|$)'
       model: 'One Touch 813D'
-    - regex: 'ALCATEL_one_touch_813[);/ ]'
+    - regex: 'ALCATEL_one_touch_813(?:[);/ ]|$)'
       model: 'One Touch 813'
     - regex: 'OT871A'
       model: 'One Touch 871A'
@@ -1350,75 +1354,75 @@ Alcatel:
       model: 'One Touch$1'
     - regex: '(?:Alcatel[ _])?One[ _]?Touch([^/;\)]*)\)'
       model: 'One Touch$1'
-    - regex: '5080[ADFQUX][);/ ]'
+    - regex: '5080[ADFQUX](?:[);/ ]|$)'
       model: 'Shine Lite'
     - regex: 'TIMXL'
       model: 'TIM XL'
     - regex: '5085C'
       model: 'PulseMix'
-    - regex: '4049[DEGMX][);/ ]'
+    - regex: '4049[DEGMX](?:[);/ ]|$)'
       model: 'U3'
-    - regex: '5044[ADIKOPTY][);/ ]'
+    - regex: '5044[ADIKOPTY](?:[);/ ]|$)'
       model: 'U5'
-    - regex: '4047[DFXN][);/ ]'
+    - regex: '4047[DFXN](?:[);/ ]|$)'
       model: 'U5 3G'
-    - regex: '5047[DIUY][);/ ]'
+    - regex: '5047[DIUY](?:[);/ ]|$)'
       model: 'U5 HD'
-    - regex: '4047G[);/ ]'
+    - regex: '4047G(?:[);/ ]|$)'
       model: 'U5 Lite'
-    - regex: '4047A[);/ ]'
+    - regex: '4047A(?:[);/ ]|$)'
       model: 'U5 Plus'
-    - regex: '4044[CV][);/ ]'
+    - regex: '4044[CV](?:[);/ ]|$)'
       model: 'Quick Flip'
-    - regex: '4044O[);/ ]'
+    - regex: '4044O(?:[);/ ]|$)'
       model: 'Cingular Flip 2'
-    - regex: '4044[MNT][);/ ]'
+    - regex: '4044[MNT](?:[);/ ]|$)'
       model: 'Go Flip'
-    - regex: '5044[GS][);/ ]'
+    - regex: '5044[GS](?:[);/ ]|$)'
       model: 'U50'
-    - regex: '5033[ADXJEFGMOTXY](?:_(?:EEA|RU))?[);/ ]'
+    - regex: '5033[ADXJEFGMOTXY](?:_(?:EEA|RU))?(?:[);/ ]|$)'
       model: '1'
-    - regex: '5009[AD](?:_RU|_EEA)?[);/ ]'
+    - regex: '5009[AD](?:_RU|_EEA)?(?:[);/ ]|$)'
       model: '1C'
-    - regex: '5008[DUY](?:_(?:EEA|RU))?[);/ ]'
+    - regex: '5008[DUY](?:_(?:EEA|RU))?(?:[);/ ]|$)'
       model: '1X (2019)'
-    - regex: '5007A[);/ ]'
+    - regex: '5007A(?:[);/ ]|$)'
       model: '1V (2020)'
-    - regex: '5003[ADG](?:_(?:EEA|RU))?[);/ ]'
+    - regex: '5003[ADG](?:_(?:EEA|RU))?(?:[);/ ]|$)'
       model: '1C (2019)'
-    - regex: '5024J[);/ ]'
+    - regex: '5024J(?:[);/ ]|$)'
       model: '1S'
-    - regex: '5028A[);/ ]'
+    - regex: '5028A(?:[);/ ]|$)'
       model: '1S (2020)'
-    - regex: '5001[ADJTU](?:_EEA|_RU)?[);/ ]'
+    - regex: '5001[ADJTU](?:_EEA|_RU)?(?:[);/ ]|$)'
       model: '1V'
-    - regex: '5059[ADXYZIT](_RU)?[);/ ]'
+    - regex: '5059[ADXYZIT](_RU)?(?:[);/ ]|$)'
       model: '1X'
-    - regex: '5059S[);/ ]'
+    - regex: '5059S(?:[);/ ]|$)'
       model: 'Avalon V'
-    - regex: '5060D(?:_EEA|_RU)?[);/ ]'
+    - regex: '5060D(?:_EEA|_RU)?(?:[);/ ]|$)'
       model: '5V'
       device: 'phablet'
-    - regex: '(?:5052[ADY]|5053[AKY])(?:_EEA|_RU)?[);/ ]'
+    - regex: '(?:5052[ADY]|5053[AKY])(?:_EEA|_RU)?(?:[);/ ]|$)'
       model: '3'
-    - regex: '5029E[);/ ]'
+    - regex: '5029E(?:[);/ ]|$)'
       model: '3 (2020)'
-    - regex: '(?:5032W|5099[ADYUI](_RU)?)[);/ ]'
+    - regex: '(?:5032W|5099[ADYUI](_RU)?)(?:[);/ ]|$)'
       model: '3V'
-    - regex: '5026[ADJ][);/ ]'
+    - regex: '5026[ADJ](?:[);/ ]|$)'
       model: '3C'
-    - regex: '5039[D](?:_(?:EEA|RU))?[);/ ]'
+    - regex: '5039[D](?:_(?:EEA|RU))?(?:[);/ ]|$)'
       model: '3L'
       device: 'phablet'
-    - regex: '5058[AIY](_RU)?[);/ ]'
+    - regex: '5058[AIY](_RU)?(?:[);/ ]|$)'
       model: '3X'
-    - regex: '5086[ADY][);/ ]'
+    - regex: '5086[ADY](?:[);/ ]|$)'
       model: '5'
-    - regex: '6062W[);/ ]'
+    - regex: '6062W(?:[);/ ]|$)'
       model: '7'
     - regex: 'Alcatel UP'
       model: ''
-    - regex: '(?:ALCATEL_)?A383G[);/ ]'
+    - regex: '(?:ALCATEL_)?A383G(?:[);/ ]|$)'
       model: 'Big Easy Plus'
     - regex: '5041C'
       model: 'TETRA'
@@ -1590,12 +1594,12 @@ Allview:
 
     - regex: 'Allview[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'Allview[ _-]([^;/]+)[;/)]'
+    - regex: 'Allview[ _-]([^;/]+)(?:[;/)]|$)'
       model: '$1'
 
 # Allwinner
 Allwinner:
-  regex: '(?:QUAD-CORE A64 p3|ZY-07B)[);/ ]'
+  regex: '(?:QUAD-CORE A64 p3|ZY-07B)(?:[);/ ]|$)'
   device: 'tablet'
   models:
       - regex: 'QUAD-CORE A64 p3'
@@ -1680,13 +1684,13 @@ Ainol:
       model: 'Numy 3G Talos'
     - regex: 'Numy_3G_BW1'
       model: 'Numy 3G Talos 2'
-    - regex: 'NUMY3GAX9[);/ ]'
+    - regex: 'NUMY3GAX9(?:[);/ ]|$)'
       model: 'Numy 3G AX9'
     - regex: '(Novo 10 Hero QuadCore)'
       model: '$1'
-    - regex: 'Novo7 Flame[);/ ]'
+    - regex: 'Novo7 Flame(?:[);/ ]|$)'
       model: 'Novo 7 Flame'
-    - regex: 'NOVO7[);/ ]'
+    - regex: 'NOVO7(?:[);/ ]|$)'
       model: 'Novo 7'
     - regex: 'Numy[ _]([^;/]+) Build'
       model: 'Numy $1'
@@ -1696,17 +1700,17 @@ Ainol:
 
 # Archos
 Archos:
-  regex: '(?:YL-)?Archos|(?:A50TI|AC101BHE)[);/ ]'
+  regex: '(?:YL-)?Archos|(?:A50TI|AC101BHE)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Archos (Oxygen 63)[);/ ]'
+    - regex: 'Archos (Oxygen 63)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'A50TI[);/ ]'
+    - regex: 'A50TI(?:[);/ ]|$)'
       model: '50 Titanium 4G'
-    - regex: 'Archos ?5[);/ ]'
+    - regex: 'Archos ?5(?:[);/ ]|$)'
       device: 'tablet'
       model: '5'
-    - regex: 'AC101BHE[);/ ]'
+    - regex: 'AC101BHE(?:[);/ ]|$)'
       device: 'tablet'
       model: '101B Helium 4G'
     - regex: '(?:YL-)?Archos ([^/;]*(?:PAD)[^/;]*) Build'
@@ -1722,10 +1726,10 @@ Archos:
 
 # Axxion
 Axxion:
-  regex: 'Axxion ATAB-[0-9]+[);/ ]'
+  regex: 'Axxion ATAB-[0-9]+(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'Axxion ATAB-([0-9]+)[);/ ]'
+    - regex: 'Axxion ATAB-([0-9]+)(?:[);/ ]|$)'
       model: 'ATAB-$1'
 
 # Meu
@@ -1830,57 +1834,57 @@ Assistant:
   regex: '(AS[-_](?:50[123]|543[1-6]|44[12]1|541[12]|54[23]1|6431|[46]01L)|AP-(?:109|115G|721N|753G|7[25]7G|10[68]|107G|110N|941|719))[;/)_ ]'
   device: 'smartphone'
   models:
-    - regex: 'AS[-_]401L[);/ ]'
+    - regex: 'AS[-_]401L(?:[);/ ]|$)'
       model: 'Asper'
-    - regex: 'AS-5432[);/ ]'
+    - regex: 'AS-5432(?:[);/ ]|$)'
       model: 'Agio'
-    - regex: 'AS[-_](?:5434|501)[);/ ]'
+    - regex: 'AS[-_](?:5434|501)(?:[);/ ]|$)'
       model: 'Club'
-    - regex: 'AS_601L[);/ ]'
+    - regex: 'AS_601L(?:[);/ ]|$)'
       model: 'AS-601L'
-    - regex: 'AS-5433 Secret[);/ ]'
+    - regex: 'AS-5433 Secret(?:[);/ ]|$)'
       model: 'Secret'
-    - regex: 'AS-5433[);/ ]'
+    - regex: 'AS-5433(?:[);/ ]|$)'
       model: 'Max Secret'
-    - regex: 'AS-5421[);/ ]'
+    - regex: 'AS-5421(?:[);/ ]|$)'
       model: 'Surf'
-    - regex: 'AS-44[12]1[);/ ]'
+    - regex: 'AS-44[12]1(?:[);/ ]|$)'
       model: 'Unami'
-    - regex: 'AS-5431[);/ ]'
+    - regex: 'AS-5431(?:[);/ ]|$)'
       model: 'Prima'
-    - regex: 'AS-502[);/ ]'
+    - regex: 'AS-502(?:[);/ ]|$)'
       model: 'Shot'
-    - regex: 'AS-503[);/ ]'
+    - regex: 'AS-503(?:[);/ ]|$)'
       model: 'Target'
-    - regex: 'AS-5435[);/ ]'
+    - regex: 'AS-5435(?:[);/ ]|$)'
       model: 'Shine'
     - regex: 'AS-5436[ _]'
       model: 'Grid'
-    - regex: 'AS-6431[);/ ]'
+    - regex: 'AS-6431(?:[);/ ]|$)'
       model: 'Rider'
     - regex: 'AS-5411[_ ]'
       model: 'Max Ritm'
-    - regex: 'AS-5412 Max[);/ ]'
+    - regex: 'AS-5412 Max(?:[);/ ]|$)'
       model: 'AS-5412 Max'
-    - regex: 'AP-721N[);/ ]'
+    - regex: 'AP-721N(?:[);/ ]|$)'
       model: 'AP-721N Force'
       device: 'tablet'
-    - regex: 'AP-941[);/ ]'
+    - regex: 'AP-941(?:[);/ ]|$)'
       model: 'AP-941'
       device: 'tablet'
-    - regex: 'AP-108[);/ ]'
+    - regex: 'AP-108(?:[);/ ]|$)'
       model: 'Cetus'
       device: 'tablet'
-    - regex: 'AP-106[);/ ]'
+    - regex: 'AP-106(?:[);/ ]|$)'
       model: 'AP-106 Force'
       device: 'tablet'
-    - regex: '(AP-(?:109|115G|7[25]7G|753G|107G|110N|719))[/;) ]'
+    - regex: '(AP-(?:109|115G|7[25]7G|753G|107G|110N|719))(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1'
 
 # Ark (Ark Electronic Technology)
 Ark:
-  regex: '(ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))|EDGE A5HD|Elf_S8|ICON (R40\+|R45)|Impulse[ _](P[12])|Wizard_1[/;) ]'
+  regex: '(ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))|EDGE A5HD|Elf_S8|ICON (R40\+|R45)|Impulse[ _](P[12])|Wizard_1(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '(?:ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))'
@@ -1895,7 +1899,7 @@ Ark:
       model: 'Icon $1'
     - regex: 'Wizard_1'
       model: 'Wizard 1'
-    - regex: 'Elf_S8[);/ ]'
+    - regex: 'Elf_S8(?:[);/ ]|$)'
       model: 'Elf S8'
 
 # Garmin-Asus
@@ -1912,68 +1916,68 @@ Garmin-Asus:
 
 # Asus
 Asus:
-  regex: 'Asus|Transformer|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|P(?:00[18ACIL]|01[MTVWYZ]|01MA|01T_1|02[13478])(?: Build|\))|X015D|X018D|X003|X00[7ABT]D|Z00D|Z00[MTY]D|Z01[7FGHKMR]D)[);/ ]|G55[023]KL|ZB(631|602|633|55[135]|50[01])KL|ZC(55[134]|520|600)KL|ZA550KL|ZE(520|620|55[2345])KL|ZD55[23]KL|ZS600KL|ZS(6[236]0|55[10])KL|ZB(500KG|601KL)|MeMo Pad FHD 10 LTE|Z00VD'
+  regex: 'Asus|Transformer|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|P(?:00[18ACIL]|01[MTVWYZ]|01MA|01T_1|02[13478])(?: Build|\))|X015D|X018D|X003|X00[7ABT]D|Z00D|Z00[MTY]D|Z01[7FGHKMR]D)(?:[);/ ]|$)|G55[023]KL|ZB(631|602|633|55[135]|50[01])KL|ZC(55[134]|520|600)KL|ZA550KL|ZE(520|620|55[2345])KL|ZD55[23]KL|ZS600KL|ZS(6[236]0|55[10])KL|ZB(500KG|601KL)|MeMo Pad FHD 10 LTE|Z00VD'
   device: 'smartphone'
   models:
     # explicit tablet models
-    - regex: 'ME171[);/ ]'
+    - regex: 'ME171(?:[);/ ]|$)'
       model: 'Eee Pad MeMO 171'
       device: 'tablet'
-    - regex: 'ASUS Z906[);/ ]'
+    - regex: 'ASUS Z906(?:[);/ ]|$)'
       model: 'Z906 10.1"'
       device: 'tablet'
     - regex: 'ME172V'
       model: 'MeMO Pad'
       device: 'tablet'
-    - regex: 'ME302C[);/ ]'
+    - regex: 'ME302C(?:[);/ ]|$)'
       model: 'MeMO Pad FHD 10'
       device: 'tablet'
-    - regex: '(ME302KL|MeMo Pad FHD 10 LTE)[);/ ]'
+    - regex: '(ME302KL|MeMo Pad FHD 10 LTE)(?:[);/ ]|$)'
       model: 'MeMO Pad FHD 10 LTE'
       device: 'tablet'
-    - regex: 'ME301T[);/ ]'
+    - regex: 'ME301T(?:[);/ ]|$)'
       model: 'MeMO Pad Smart 10'
       device: 'tablet'
-    - regex: 'Z101[);/ ]'
+    - regex: 'Z101(?:[);/ ]|$)'
       model: 'Z101'
       device: 'tablet'
-    - regex: 'X Pad 10 LTE[);/ ]'
+    - regex: 'X Pad 10 LTE(?:[);/ ]|$)'
       model: 'X Pad 10 LTE'
       device: 'tablet'
-    - regex: '(?:K01[3A]|K007|K00R)[);/ ]|MeMO Pad 7'
+    - regex: '(?:K01[3A]|K007|K00R)(?:[);/ ]|$)|MeMO Pad 7'
       model: 'MeMO Pad 7'
       device: 'tablet'
-    - regex: 'K01E[);/ ]'
+    - regex: 'K01E(?:[);/ ]|$)'
       model: 'MeMO Pad 10 ME103K'
       device: 'tablet'
-    - regex: 'K00U|ME173X[);/ ]'
+    - regex: 'K00U|ME173X(?:[);/ ]|$)'
       model: 'MeMO Pad HD 7'
       device: 'tablet'
-    - regex: '(?:K011|K00L)[);/ ]'
+    - regex: '(?:K011|K00L)(?:[);/ ]|$)'
       model: 'MeMO Pad 8'
       device: 'tablet'
-    - regex: 'K014[);/ ]'
+    - regex: 'K014(?:[);/ ]|$)'
       model: 'MeMO Pad 8.9'
       device: 'tablet'
-    - regex: 'K00S[);/ ]'
+    - regex: 'K00S(?:[);/ ]|$)'
       model: 'MeMO Pad HD 7 Dual SIM'
       device: 'tablet'
-    - regex: 'K00F[);/ ]'
+    - regex: 'K00F(?:[);/ ]|$)'
       model: 'MeMO Pad 10'
       device: 'tablet'
-    - regex: 'K00C[);/ ]'
+    - regex: 'K00C(?:[);/ ]|$)'
       model: 'Transformer Pad TF701T'
       device: 'tablet'
-    - regex: 'K010[);/ ]'
+    - regex: 'K010(?:[);/ ]|$)'
       model: 'Transformer Pad TF103C'
       device: 'tablet'
-    - regex: 'K018[);/ ]'
+    - regex: 'K018(?:[);/ ]|$)'
       model: 'Transformer Pad TF103CG'
       device: 'tablet'
-    - regex: 'TF300T[);/ ]'
+    - regex: 'TF300T(?:[);/ ]|$)'
       model: 'Transformer Pad TF300T'
       device: 'tablet'
-    - regex: 'K01B[);/ ]'
+    - regex: 'K01B(?:[);/ ]|$)'
       model: 'Transformer Pad TF303K'
       device: 'tablet'
     - regex: 'Slider SL101'
@@ -2009,21 +2013,21 @@ Asus:
     - regex: '(?:ASUS_)?P00C|P02[138]|P00L|P01T_1'
       model: 'ZenPad 10'
       device: 'tablet'
-      
+
     # explicit phablet models
-    - regex: 'ME371MG[);/ ]'
+    - regex: 'ME371MG(?:[);/ ]|$)'
       model: 'Fonepad'
       device: 'phablet'
-    - regex: 'K00G[);/ ]'
+    - regex: 'K00G(?:[);/ ]|$)'
       model: 'Fonepad Note 6'
       device: 'phablet'
-    - regex: '(?:K012|K00E)[);/ ]'
+    - regex: '(?:K012|K00E)(?:[);/ ]|$)'
       model: 'Fonepad 7'
       device: 'phablet'
-    - regex: 'K00Z[);/ ]'
+    - regex: 'K00Z(?:[);/ ]|$)'
       model: 'Fonepad 7 Dual SIM'
       device: 'phablet'
-    - regex: 'K016[);/ ]'
+    - regex: 'K016(?:[);/ ]|$)'
       model: 'Fonepad 8'
       device: 'phablet'
 
@@ -2042,10 +2046,12 @@ Asus:
       model: 'ZenFone Max M1'
     - regex: '(?:ASUS_)?(ZB601KL)'
       model: 'ZenFone Max Pro M1'
-    - regex: '(?:ASUS_)?(X01([AB]D)|ZB633KL)[);/ ]'
+    - regex: '(?:ASUS_)?(X01([AB]D)|ZB633KL)(?:[);/ ]|$)'
       model: 'ZenFone Max M2'
     - regex: '(?:ASUS_)?(?:Z00[AD]|Z008D|Z008|Z00AD[AB]?)'
       model: 'ZenFone 2'
+    - regex: '(?:ASUS_)?(?:ZenFone 2E)'
+      model: 'ZenFone 2E'
     - regex: '(?:ASUS_)?A007|ZA550KL|ZB553KL|ZB501KL'
       model: 'ZenFone Live'
     - regex: '(?:ASUS_)?(X00RD|G552KL)'
@@ -2086,7 +2092,7 @@ Asus:
       model: 'ZenFone Go TV'
     - regex: '(?:ASUS_)?Z00VD' #ZC500TG
       model: 'ZenFone Go'
-    - regex: '(?:ASUS_)?(X003)'
+    - regex: '(?:ASUS_)?(X00[23])'
       model: 'ZenFone Pegasus'
     - regex: '(?:ASUS_)?X005'
       model: 'ZenFone Pegasus 5000'
@@ -2132,8 +2138,10 @@ Asus:
       model: 'ZenFone Zoom'
     - regex: '(?:ASUS_)?(?:Z01QD|ZS600KL)'
       model: 'ROG Phone'
-    - regex: '(?:ASUS_)?(I001D[ABCE]?|ZS660KL)'
+    - regex: '(?:ASUS_)?(?:I001D[ABCE]?|ZS660KL)'
       model: 'ROG Phone 2'
+    - regex: '(?:ASUS_)?(?:I003DD?)'
+      model: 'ROG Phone 3'
 
     # general detections
     - regex: 'Asus(?:-|;)?([a-z0-9]+)'
@@ -2239,7 +2247,7 @@ Bitel:
 
 # Blu
 Blu:
-  regex: 'BLU |(?:blu|Dash)[ _]([^/;]+) Build|Studio (5.0K|5.5|View XL|Mega|C 8\+8|C HD|C|G|Selfie LTE|Touch|M HD|M5 Plus|J[1258]|X|X8 HD)|Advance (4.0 ?[LM]|5.0(?: HD)?|A4)|ENERGY (DIAMOND|XL)|LIFE XL|Dash (?:X[2L]|L3)|PURE XL|Life One X2|GRAND 5.5 HD|R1 (HD|PLUS)|Tank Xtreme 5.0|Tank Xtreme Pro|STUDIO SELFIE'
+  regex: 'BLU |(?:blu|Dash)[ _]([^/;]+) Build|Studio (5.0K|5.5|View XL|Mega|C 8\+8|C HD|C|G|Selfie LTE|Touch|M HD|M5 Plus|J[1258]|X|X8 HD)|Advance (4.0 ?[LM]|5.0(?: HD)?|A4)|ENERGY (DIAMOND|XL)|LIFE XL|Dash (?:X[2L]|L3)|PURE XL|Life One X2|GRAND (?:5.5 HD|XL LTE)|R1 (HD|PLUS)|Tank Xtreme 5.0|Tank Xtreme Pro|STUDIO SELFIE'
   device: 'smartphone'
   models:
    - regex: 'Advance (4.0 ?[LM]|4.0|5.0(?: HD)?|A4)'
@@ -2282,6 +2290,8 @@ Blu:
      model: 'Grand 5.5 HD'
    - regex: 'Grand X LTE'
      model: 'Grand X LTE'
+   - regex: 'Grand XL LTE'
+     model: 'Grand XL LTE'
    - regex: 'R1 HD'
      model: 'R1 HD'
    - regex: 'R1 PLUS'
@@ -2309,14 +2319,14 @@ Bluegood:
 
 # Blackview
 Blackview:
-  regex: 'Blackview|(BV([24-9]000|(5[589]|9[15689])00|6[18]00)(?:[ _](?:PRO))?|(P10000(?:[ _](?:PRO))?)|omega[ _]pro|Alife[ _][PS]1|Heatwave|DM550|BV9700Pro|(?<!Lenovo[_ ])A[68]0(?:Pro)?\))'
+  regex: 'Blackview|(BV([24-9]000|(5[589]|9[15689])00|6[138]00)(?:[ _](?:PRO))?|(P10000(?:[ _](?:PRO))?)|omega[ _]pro|Alife[ _][PS]1|Heatwave|DM550|BV9700Pro|(?<!Lenovo[_ ])A[68]0(?:Pro)?\))'
   device: 'smartphone'
   models:
     - regex: 'A60Pro\)'
       model: 'A60 Pro'
     - regex: 'A60\)'
       model: 'A60'
-    - regex: 'A80Pro[);/ ]'
+    - regex: 'A80Pro(?:[);/ ]|$)'
       model: 'A80 Pro'
     - regex: '(BV6000S)'
       model: '$1'
@@ -2326,9 +2336,9 @@ Blackview:
       model: '$1'
     - regex: 'BV9000Pro-F'
       model: 'BV9000 Pro F'
-    - regex: '(BV([48]000|9[56]00|6800))Pro'
+    - regex: '(BV([48]000|9[56]00|6[83]00))Pro'
       model: '$1 Pro'
-    - regex: '(BV6100)[);/ ]'
+    - regex: '(BV6100)(?:[);/ ]|$)'
       model: '$1'
       device: 'phablet'
     - regex: '(BV([24-9]000|(5[589]|9[15689])00)(?:[ _](?:PRO))?)'
@@ -2360,7 +2370,7 @@ Bluboo:
 
 # Black Fox
 'Black Fox':
-  regex: 'BMM[ _-]?((44[123]D|441S|431D|533D|54[12]S|541[ABW]|54[123]D|543S|531[ABD]))[;/) ]'
+  regex: 'BMM[ _-]?(?:44[123]D|441S|431D|533D|54[12]S|541[ABW]|54[123]D|543S|531[ABD])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'BMM443D'
@@ -2389,7 +2399,7 @@ Bluboo:
       model: 'B3'
     - regex: 'BMM541W'
       model: 'B7R Fox'
-    - regex: 'BMM[ _-]?(533D|431D|54[12]S)[;/) ]'
+    - regex: 'BMM[ _-]?(533D|431D|54[12]S)(?:[);/ ]|$)'
       model: 'BMM $1'
 
 # bogo
@@ -2422,215 +2432,228 @@ Boway:
 
 # Brondi
 Brondi:
-  regex: 'Brondi[ _]|(?:CENTURION|GLADIATOR| GLORY|LUXURY|SENSUELLE|VICTORY)(?:[ _-]?[2-6])?[);/ ]|Surfing Tab|501 SZ'
+  regex: 'Brondi[ _]|(?:CENTURION|GLADIATOR| GLORY|LUXURY|SENSUELLE|VICTORY)(?:[ _-]?[2-6])?(?:[);/ ]|$)|Surfing Tab|501 SZ'
   device: 'smartphone'
   models:
-    - regex: '(?:Brondi[ _])?(620 SZ|730_4G_HD|501 SZ)[);/ ]'
+    - regex: '(?:Brondi[ _])?(620 SZ|730_4G_HD|501 SZ)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'CENTURION(?:[ _-]?([2-6]))?[);/ ]'
+    - regex: 'CENTURION(?:[ _-]?([2-6]))?(?:[);/ ]|$)'
       model: 'CENTURION $1'
-    - regex: 'GLADIATOR(?:[ _-]?([2-6]))?[);/ ]'
+    - regex: 'GLADIATOR(?:[ _-]?([2-6]))?(?:[);/ ]|$)'
       model: 'GLADIATOR $1'
-    - regex: 'GLORY(?:[ _-]?([2-6]))?[);/ ]'
+    - regex: 'GLORY(?:[ _-]?([2-6]))?(?:[);/ ]|$)'
       model: 'GLORY $1'
-    - regex: 'LUXURY(?:[ _-]?([2-6]))?[);/ ]'
+    - regex: 'LUXURY(?:[ _-]?([2-6]))?(?:[);/ ]|$)'
       model: 'LUXURY $1'
-    - regex: 'SENSUELLE(?:[ _-]?([2-6]))?[);/ ]'
+    - regex: 'SENSUELLE(?:[ _-]?([2-6]))?(?:[);/ ]|$)'
       model: 'SENSUELLE $1'
-    - regex: 'VICTORY(?:[ _-]?([2-6]))?[);/ ]'
+    - regex: 'VICTORY(?:[ _-]?([2-6]))?(?:[);/ ]|$)'
       model: 'VICTORY $1'
 
     - regex: 'Surfing Tab ([^;/]+) Build'
       model: 'SURFING TAB $1'
       device: 'tablet'
-    - regex: 'Surfing Tab ([^;/]+)[);/ ]'
+    - regex: 'Surfing Tab ([^;/]+)(?:[);/ ]|$)'
       model: 'SURFING TAB $1'
       device: 'tablet'
 
 # VGO TEL
 VGO TEL:
-  regex: 'Venture V(?:[278]|12)[);/ ]'
+  regex: 'Venture V(?:[278]|12)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Venture V([278]|12)[);/ ]'
+    - regex: 'Venture V([278]|12)(?:[);/ ]|$)'
       model: 'Venture V$1'
 
-#
-# Vivo
+# Vivo (vivo.com.cn, vivo.com)
 Vivo:
-  regex: '((?:VIV-|BBG-)?(?<!FBCR/)vivo(?!(?:Browser)))|(?:V1730(D[AT]|GA)|V18(18CA|01A0|13B[AT]|18T|09[AT]|1[346][AT]|[13]8[AT]|14A|24[B]?A|2[19][AT]|3[12][AT]|36[AT])|V1731CA|V1732[AT]|V1818CT|V19[01]1[AT]|V1932[AT]|V191[346][AT]|V192[1348]A|V193[04]A|V194[15]A|V1938CT|V1955A|V1938T|V1730EA|V19[26]2A|V196[35]A|V198[16]A|V1936A[L]?|V19[59]0A|V200[125]A|1819)[);/ ]'
+  regex: '((?:VIV-|BBG-)?(?<!FBCR/)vivo(?!(?:Browser)))|(?:V1730(D[AT]|GA)|V18(18CA|01A0|13B[AT]|18T|09[AT]|1[346][AT]|[13]8[AT]|14A|24[B]?A|2[19][AT]|3[12][AT]|36[AT])|V1731CA|V1732[AT]|V1818CT|V19[01]1[AT]|V1932[AT]|V191[3469][AT]|V192[1348]A|V193[04]A|V194[15]A|V1938CT|V1955A|V1938T|V1730EA|V19[26]2A|V196[35]A|V198[16]A|V1936A[L]?|V19[59]0A|V200[125]A|1819|V201[12]A|V202[0345]C?A)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'V1824[B]?A[);/ ]'
+    - regex: 'V1824[B]?A(?:[);/ ]|$)'
       model: 'iQOO'
-    - regex: 'V1955A[);/ ]'
+    - regex: 'V1955A(?:[);/ ]|$)'
       model: 'iQOO 3'
-    - regex: 'V1922A[);/ ]'
+    - regex: 'V1922A(?:[);/ ]|$)'
       model: 'iQOO Pro' # 2019
-    - regex: 'V1916A[);/ ]'
+    - regex: 'V1916A(?:[);/ ]|$)'
       model: 'iQOO Pro 5G'
-    - regex: 'V1914A[);/ ]'
+    - regex: 'V1914A(?:[);/ ]|$)'
       model: 'iQOO Neo'
-    - regex: 'V1981A[);/ ]'
+    - regex: 'V1981A(?:[);/ ]|$)'
       model: 'iQOO Neo 3'
-    - regex: 'V1936A[L]?[);/ ]'
+    - regex: 'V1936A[L]?(?:[);/ ]|$)'
       model: 'iQOO Neo 855'
-    - regex: 'V1986A[);/ ]'
+    - regex: 'V1986A(?:[);/ ]|$)'
       model: 'iQOO Z1'
-    - regex: 'vivo 1805[);/ ]'
+    - regex: 'V2012A(?:[);/ ]|$)'
+      model: 'iQOO Z1x'
+    - regex: 'V1919A(?:[);/ ]|$)'
+      model: 'iQOO Z5x'
+    - regex: 'V2023A(?:[);/ ]|$)'
+      model: 'iQOO U1'
+    - regex: 'V2024A(?:[);/ ]|$)'
+      model: 'iQOO 5'
+    - regex: 'V2025A(?:[);/ ]|$)'
+      model: 'iQOO 5 Pro'
+    - regex: 'vivo 1805(?:[);/ ]|$)'
       model: 'Nex'
-    - regex: 'V1923A[);/ ]'
+    - regex: 'V1923A(?:[);/ ]|$)'
       model: 'Nex 3'
-    - regex: 'V1924A[);/ ]'
+    - regex: 'V1924A(?:[);/ ]|$)'
       model: 'Nex 3 5G'
-    - regex: 'V1950A[);/ ]'
+    - regex: 'V1950A(?:[);/ ]|$)'
       model: 'Nex 3S'
-    - regex: 'V1821[AT][);/ ]'
+    - regex: 'V1821[AT](?:[);/ ]|$)'
       model: 'Nex Dual Display'
-    - regex: 'Vivo ONE[);/ ]'
+    - regex: 'Vivo ONE(?:[);/ ]|$)'
       model: 'One'
-    - regex: 'V1831[AT][);/ ]'
+    - regex: 'V1831[AT](?:[);/ ]|$)'
       model: 'S1'
-    - regex: 'V1832[AT][);/ ]'
+    - regex: 'V1832[AT](?:[);/ ]|$)'
       model: 'S1 Pro'
-    - regex: 'V1932[AT][);/ ]'
+    - regex: 'V1932[AT](?:[);/ ]|$)'
       model: 'S5'
-    - regex: 'V1962A[);/ ]'
+    - regex: 'V1962A(?:[);/ ]|$)'
       model: 'S6 5G'
-    - regex: 'V1941A[);/ ]'
+    - regex: 'V2020C?A(?:[);/ ]|$)'
+      model: 'S7'
+    - regex: 'V1941A(?:[);/ ]|$)'
       model: 'U3'
-    - regex: 'V1928A[);/ ]'
+    - regex: 'V1928A(?:[);/ ]|$)'
       model: 'U3X'
-    - regex: 'vivo 1804[);/ ]'
+    - regex: 'vivo 1804(?:[);/ ]|$)'
       model: 'V11 Pro'
-    - regex: 'vivo 1806[);/ ]'
+    - regex: 'vivo 1806(?:[);/ ]|$)'
       model: 'V11i'
-    - regex: '1819[);/ ]'
+    - regex: '1819(?:[);/ ]|$)'
       model: 'V15'
-    - regex: 'vivo 1818[);/ ]'
+    - regex: 'vivo 1818(?:[);/ ]|$)'
       model: 'V15 Pro'
-    - regex: 'vivo 1909[);/ ]'
+    - regex: 'vivo 1909(?:[);/ ]|$)'
       model: 'V17 Pro'
-    - regex: '(?:VIV-|BBG-)?vivo[ _]1601[);/ ]'
+    - regex: '(?:VIV-|BBG-)?vivo[ _]1601(?:[);/ ]|$)'
       model: 'V5'
-    - regex: 'vivo 1609[);/ ]'
+    - regex: 'vivo 1609(?:[);/ ]|$)'
       model: 'V5 Lite'
-    - regex: 'vivo 1611[);/ ]'
+    - regex: 'vivo 1611(?:[);/ ]|$)'
       model: 'V5 Plus'
-    - regex: 'vivo (1713|1612)[);/ ]'
+    - regex: 'vivo (1713|1612)(?:[);/ ]|$)'
       model: 'V5s'
-    - regex: 'vivo 1718[);/ ]'
+    - regex: 'vivo 1718(?:[);/ ]|$)'
       model: 'V7'
-    - regex: 'vivo 1716[);/ ]'
+    - regex: 'vivo 1716(?:[);/ ]|$)'
       model: 'V7 Plus'
-    - regex: 'vivo 1723[);/ ]'
+    - regex: 'vivo 1723(?:[);/ ]|$)'
       model: 'V9'
-    - regex: 'vivo 1727[);/ ]'
+    - regex: 'vivo 1727(?:[);/ ]|$)'
       model: 'V9 Youth'
-    - regex: 'vivo 1721[);/ ]'
+    - regex: 'vivo 1721(?:[);/ ]|$)'
       model: 'X20'
-    - regex: 'X20Plus[);/ ]'
+    - regex: 'X20Plus(?:[);/ ]|$)'
       model: 'X20 Plus'
-    - regex: 'vivo 1725[);/ ]'
+    - regex: 'vivo 1725(?:[);/ ]|$)'
       model: 'X21'
-    - regex: 'V1814[AT][);/ ]'
+    - regex: 'V1814[AT](?:[);/ ]|$)'
       model: 'X21S'
-    - regex: 'V1809[AT][);/ ]'
+    - regex: 'V1809[AT](?:[);/ ]|$)'
       model: 'X23'
-    - regex: 'V1816[AT][);/ ]'
+    - regex: 'V1816[AT](?:[);/ ]|$)'
       model: 'X23'
-    - regex: 'V18(38|29)[AT][);/ ]'
+    - regex: 'V18(38|29)[AT](?:[);/ ]|$)'
       model: 'X27'
-    - regex: 'V1836[AT][);/ ]'
+    - regex: 'V1836[AT](?:[);/ ]|$)'
       model: 'X27 Pro'
-    - regex: 'V1938CT[);/ ]'
+    - regex: 'V1938CT(?:[);/ ]|$)'
       model: 'X30'
-    - regex: 'V1938T[);/ ]'
+    - regex: 'V1938T(?:[);/ ]|$)'
       model: 'X30 Pro'
-    - regex: 'V2001A[);/ ]'
+    - regex: 'V2001A(?:[);/ ]|$)'
       model: 'X50'
-    - regex: 'V2005A[);/ ]'
+    - regex: 'V2005A(?:[);/ ]|$)'
       model: 'X50 Pro'
-    - regex: 'X9Plus[);/ ]'
+    - regex: 'V2011A(?:[);/ ]|$)'
+      model: 'X50 Pro Plus'
+    - regex: 'X9Plus(?:[);/ ]|$)'
       model: 'X9 Plus'
-    - regex: 'vivo 1902[);/ ]'
+    - regex: 'vivo 1902(?:[);/ ]|$)'
       model: 'Y17'
-    - regex: 'vivo 1915[);/ ]'
+    - regex: 'vivo 1915(?:[);/ ]|$)'
       model: 'Y19'
-    - regex: 'V1901[AT][);/ ]'
+    - regex: 'V1901[AT](?:[);/ ]|$)'
       model: 'Y3'
-    - regex: 'V1930A[);/ ]'
+    - regex: 'V1930A(?:[);/ ]|$)'
       model: 'Y3 Standard'
-    - regex: 'V1934A[);/ ]'
+    - regex: 'V1934A(?:[);/ ]|$)'
       model: 'Y5s'
-    - regex: 'V1965A[);/ ]'
+    - regex: 'V1965A(?:[);/ ]|$)'
       model: 'Y50'
-    - regex: 'vivo 1606[);/ ]'
+    - regex: 'vivo 1606(?:[);/ ]|$)'
       model: 'Y53i'
-    - regex: 'vivo 1603[);/ ]'
+    - regex: 'vivo 1603(?:[);/ ]|$)'
       model: 'Y55l'
-    - regex: 'vivo 1610[);/ ]'
+    - regex: 'vivo 1610(?:[);/ ]|$)'
       model: 'Y55s'
-    - regex: 'vivo 1719[);/ ]'
+    - regex: 'vivo 1719(?:[);/ ]|$)'
       model: 'Y65'
-    - regex: 'vivo 1714[);/ ]'
+    - regex: 'vivo 1714(?:[);/ ]|$)'
       model: 'Y69'
-    - regex: 'V2002A[);/ ]'
+    - regex: 'V2002A(?:[);/ ]|$)'
       model: 'Y70s'
-    - regex: 'vivo 1724[);/ ]'
+    - regex: 'vivo 1724(?:[);/ ]|$)'
       model: 'Y71'
-    - regex: 'vivo 1801[);/ ]'
+    - regex: 'vivo 1801(?:[);/ ]|$)'
       model: 'Y71i'
-    - regex: 'V1731CA[);/ ]'
+    - regex: 'V1731CA(?:[);/ ]|$)'
       model: 'Y73'
-    - regex: 'V1913[AT][);/ ]'
+    - regex: 'V1913[AT](?:[);/ ]|$)'
       model: 'Y7s'
-    - regex: 'vivo 180([38]|8i)[);/ ]'
+    - regex: 'vivo 180([38]|8i)(?:[);/ ]|$)'
       model: 'Y81'
-    - regex: 'vivo 1812[);/ ]'
+    - regex: 'vivo 1812(?:[);/ ]|$)'
       model: 'Y81i'
-    - regex: 'V1732[AT][);/ ]'
+    - regex: 'V1732[AT](?:[);/ ]|$)'
       model: 'Y81s'
-    - regex: 'vivo 1726[);/ ]'
+    - regex: 'vivo 1726(?:[);/ ]|$)'
       model: 'Y83 Pro'
-    - regex: 'V1730EA[);/ ]'
+    - regex: 'V1730EA(?:[);/ ]|$)'
       model: 'Y89'
-    - regex: 'vivo 181[17][);/ ]'
+    - regex: 'vivo 181[17](?:[);/ ]|$)'
       model: 'Y91'
-    - regex: 'V1945A[);/ ]'
+    - regex: 'V1945A(?:[);/ ]|$)'
       model: 'Y9s'
-    - regex: 'vivo 18(16|20)[);/ ]'
+    - regex: 'vivo 18(16|20)(?:[);/ ]|$)'
       model: 'Y91i'
-    - regex: '(V1818[AT]|vivo 181[45])[);/ ]'
+    - regex: '(V1818[AT]|vivo 181[45])(?:[);/ ]|$)'
       model: 'Y93'
-    - regex: 'V1818C[AT][);/ ]'
+    - regex: 'V1818C[AT](?:[);/ ]|$)'
       model: 'Y93s'
-    - regex: 'vivo 1807[);/ ]'
+    - regex: 'vivo 1807(?:[);/ ]|$)'
       model: 'Y95'
-    - regex: 'V1813[AT][);/ ]'
+    - regex: 'V1813[AT](?:[);/ ]|$)'
       model: 'Y97'
-    - regex: 'V1801A0[);/ ]'
+    - regex: 'V1801A0(?:[);/ ]|$)'
       model: 'Z1'
-    - regex: 'V1730D[AT][);/ ]'
+    - regex: 'V1730D[AT](?:[);/ ]|$)'
       model: 'Z1i'
-    - regex: 'vivo 1917[);/ ]'
+    - regex: 'vivo 1917(?:[);/ ]|$)'
       model: 'Z1x'
-    - regex: 'V1813B[AT][);/ ]'
+    - regex: 'V1813B[AT](?:[);/ ]|$)'
       model: 'Z3'
-    - regex: 'V1730GA[);/ ]'
+    - regex: 'V1730GA(?:[);/ ]|$)'
       model: 'Z3x'
-    - regex: 'V1921A[);/ ]'
+    - regex: 'V1921A(?:[);/ ]|$)'
       model: 'Z5'
-    - regex: 'V1911A[);/ ]'
+    - regex: 'V1911A(?:[);/ ]|$)'
       model: 'Z5x'
-    - regex: 'V1990A[);/ ]'
+    - regex: 'V1990A(?:[);/ ]|$)'
       model: 'Z5x (2020)'
-    - regex: 'V1963A[);/ ]'
+    - regex: 'V1963A(?:[);/ ]|$)'
       model: 'Z6'
 
     - regex: '(?:VIV-|BBG-)?vivo[ _]([^/;]+) Build'
       model: '$1'
-    - regex: '(?:VIV-|BBG-)?vivo[ _]([^);/]+)[);/]+'
+    - regex: '(?:VIV-|BBG-)?vivo[ _]([^);/]+)(?:[);/]|$)'
       model: '$1'
 
 # Vinsoc
@@ -2679,9 +2702,9 @@ Beeline:
       model: 'Smart $1'
     - regex: 'Smart Dual'
       model: 'Smart Dual'
-    - regex: '(?:Beeline[_ ])?Fast[_ ]2[);/ ]'
+    - regex: '(?:Beeline[_ ])?Fast[_ ]2(?:[);/ ]|$)'
       model: 'Fast 2'
-    - regex: 'Fast[);/ ]'
+    - regex: 'Fast(?:[);/ ]|$)'
       model: 'Fast'
 
 # Beetel
@@ -2746,22 +2769,22 @@ bq:
   regex: 'Aquaris|bq [^/;]+ Build|BQS[-_]([0-9]{4})|(BQ(ru)?[_ -][0-9]{3,4})|BQ5059|BQ1008G'
   device: 'smartphone'
   models:
-    - regex: 'BQ(?:ru)?-(?:5209L|5044)[);/ ]'
+    - regex: 'BQ(?:ru)?-(?:5209L|5044)(?:[);/ ]|$)'
       model: 'Strike LTE'
-    - regex: 'BQ(?:ru)?-(?:6035L)[);/ ]'
+    - regex: 'BQ(?:ru)?-(?:6035L)(?:[);/ ]|$)'
       model: 'Strike Power Max'
-    - regex: 'BQ(?:ru)?-(5535L)[);/ ]'
+    - regex: 'BQ(?:ru)?-(5535L)(?:[);/ ]|$)'
       model: 'Strike Power Plus'
-    - regex: 'BQ(S|ru)?-(5070|6040L)[);/ ]'
+    - regex: 'BQ(S|ru)?-(5070|6040L)(?:[);/ ]|$)'
       model: 'Magic'
-    - regex: 'BQ(?:S|ru)?-(?:5730L)[);/ ]'
+    - regex: 'BQ(?:S|ru)?-(?:5730L)(?:[);/ ]|$)'
       model: 'Magic C'
-    - regex: 'BQ(?:S|ru)?-(?:5731L)[);/ ]'
+    - regex: 'BQ(?:S|ru)?-(?:5731L)(?:[);/ ]|$)'
       model: 'Magic S'
-    - regex: 'BQ-9011[G]?[);/ ]'
+    - regex: 'BQ-9011[G]?(?:[);/ ]|$)'
       model: 'Vision'
       device: 'tablet'
-    - regex: 'BQ-8068L[);/ ]'
+    - regex: 'BQ-8068L(?:[);/ ]|$)'
       model: 'Hornet Plus Pro'
     - regex: 'BQ-8067L'
       model: 'Hornet Plus'
@@ -2810,312 +2833,314 @@ bq:
       model: 'Practic'
     - regex: 'BQ-6001L|BQ-6050'
       model: 'Jumbo'
-    - regex: 'BQ-5707G[);/ ]'
+    - regex: 'BQ-5707G(?:[);/ ]|$)'
       model: 'Next Music'
-    - regex: 'BQ-5702[);/ ]'
+    - regex: 'BQ-5702(?:[);/ ]|$)'
       model: 'Spring'
-    - regex: 'BQ-5700L[);/ ]'
+    - regex: 'BQ-5700L(?:[);/ ]|$)'
       model: 'Space X'
-    - regex: 'BQ-(?:5591|5518G)[);/ ]'
+    - regex: 'BQ-(?:5591|5518G)(?:[);/ ]|$)'
       model: 'Jeans'
     - regex: 'BQ-5522'
       model: 'Next'
-    - regex: 'BQ-5520L[);/ ]'
+    - regex: 'BQ-5520L(?:[);/ ]|$)'
       model: 'Silk'
-    - regex: 'BQ-5519L[);/ ]'
+    - regex: 'BQ-5519L(?:[);/ ]|$)'
       model: 'Fast Plus'
-    - regex: 'BQ-5517L[);/ ]'
+    - regex: 'BQ-5517L(?:[);/ ]|$)'
       model: 'Twin Pro'
-    - regex: 'BQ-5516L[);/ ]'
+    - regex: 'BQ-5516L(?:[);/ ]|$)'
       model: 'Twin'
-    - regex: 'BQS-5515[);/ ]'
+    - regex: 'BQS-5515(?:[);/ ]|$)'
       model: 'Wide'
-    - regex: 'BQ-5515[L]?[);/ ]'
+    - regex: 'BQ-5515[L]?(?:[);/ ]|$)'
       model: 'Fast'
-    - regex: 'BQ-(?:5512L|5528L)[);/ ]'
+    - regex: 'BQ-(?:5512L|5528L)(?:[);/ ]|$)'
       model: 'Strike Forward'
-    - regex: 'BQ-5511L[);/ ]'
+    - regex: 'BQ-5511L(?:[);/ ]|$)'
       model: 'Bliss'
-    - regex: 'BQS[_ ]5505[);/ ]'
+    - regex: 'BQS[_ ]5505(?:[);/ ]|$)'
       model: 'Amsterdam'
-    - regex: 'BQ(?:ru)?-5510[);/ ]'
+    - regex: 'BQ(?:ru)?-5510(?:[);/ ]|$)'
       model: 'Strike Power Max 4G'
-    - regex: 'BQ(?:ru)?-(?:5521|5594)[);/ ]'
+    - regex: 'BQ(?:ru)?-(?:5521|5594)(?:[);/ ]|$)'
       model: 'Strike Power Max'
-    - regex: 'BQ-5508L[);/ ]'
+    - regex: 'BQ-5508L(?:[);/ ]|$)'
       model: 'Next LTE'
-    - regex: 'BQ-5507L[);/ ]'
+    - regex: 'BQ-5507L(?:[);/ ]|$)'
       model: 'Iron Max'
-    - regex: 'BQ(?:ru)?-5504[);/ ]'
+    - regex: 'BQ(?:ru)?-5504(?:[);/ ]|$)'
       model: 'Strike Selfie Max'
-    - regex: 'BQ(?:ru)?-5503[);/ ]'
+    - regex: 'BQ(?:ru)?-5503(?:[);/ ]|$)'
       model: 'Nice 2'
-    - regex: 'BQS-5502[);/ ]'
+    - regex: 'BQS-5502(?:[);/ ]|$)'
       model: 'Hammer'
-    - regex: 'BQS-5501[);/ ]'
+    - regex: 'BQS-5501(?:[);/ ]|$)'
       model: 'Kawasaki'
-    - regex: 'BQS-5500[);/ ]'
+    - regex: 'BQS-5500(?:[);/ ]|$)'
       model: 'Vancouver'
-    - regex: 'BQ-5500L[);/ ]'
+    - regex: 'BQ-5500L(?:[);/ ]|$)'
       model: 'Advance'
-    - regex: 'BQ-5302G[);/ ]'
+    - regex: 'BQ-5302G(?:[);/ ]|$)'
       model: 'Velvet 2'
-    - regex: 'BQ-5301[);/ ]'
+    - regex: 'BQ-5301(?:[);/ ]|$)'
       model: 'Strike View'
-    - regex: 'BQ-5300G[);/ ]'
+    - regex: 'BQ-5300G(?:[);/ ]|$)'
       model: 'Velvet View'
-    - regex: 'BQ(ru|S)?-(?:5211|5020)[);/ ]'
+    - regex: 'BQ(ru|S)?-(?:5211|5020)(?:[);/ ]|$)'
       model: 'Strike'
-    - regex: 'BQ-5206L[);/ ]'
+    - regex: 'BQ-5206L(?:[);/ ]|$)'
       model: 'Balance'
-    - regex: 'BQ(?:ru|S)?-(?:5204|5050)[);/ ]'
+    - regex: 'BQ(?:ru|S)?-(?:5204|5050)(?:[);/ ]|$)'
       model: 'Strike Selfie'
-    - regex: 'BQ(?:ru)?-5203[);/ ]'
+    - regex: 'BQ(?:ru)?-5203(?:[);/ ]|$)'
       model: 'Vision'
-    - regex: 'BQ(?:ru)?-5202[);/ ]'
+    - regex: 'BQ(?:ru)?-5202(?:[);/ ]|$)'
       model: 'Space Lite'
-    - regex: 'BQ(?:ru)?-5201[);/ ]'
+    - regex: 'BQ(?:ru)?-5201(?:[);/ ]|$)'
       model: 'Space'
-    - regex: 'BQ-5082[);/ ]'
+    - regex: 'BQ-5082(?:[);/ ]|$)'
       model: 'Sense 2'
-    - regex: 'BQ-5071[);/ ]'
+    - regex: 'BQ-5071(?:[);/ ]|$)'
       model: 'Belief'
-    - regex: 'BQ[S]?-(?:5065|5340)[);/ ]'
+    - regex: 'BQ[S]?-(?:5065|5340)(?:[);/ ]|$)'
       model: 'Choice'
-    - regex: 'BQ(?:ru)?-?(?:5059|5514G)[);/ ]'
+    - regex: 'BQ(?:ru)?-?(?:5059|5514G)(?:[);/ ]|$)'
       model: 'Strike Power'
-    - regex: 'BQ-5058[);/ ]'
+    - regex: 'BQ-5058(?:[);/ ]|$)'
       model: 'Strike Power Easy'
-    - regex: 'BQ(?:ru)?-5057[);/ ]'
+    - regex: 'BQ(?:ru)?-5057(?:[);/ ]|$)'
       model: 'Strike 2'
-    - regex: 'BQ[S]?-(?:5056|5030)[);/ ]'
+    - regex: 'BQ[S]?-(?:5056|5030)(?:[);/ ]|$)'
       model: 'Fresh'
-    - regex: 'BQ-6042l[);/ ]'
+    - regex: 'BQ-6042l(?:[);/ ]|$)'
       model: 'Magic E'
-    - regex: 'BQS-5055[);/ ]'
+    - regex: 'BQS-5055(?:[);/ ]|$)'
       model: 'Turbo Plus'
-    - regex: 'BQ(?:ru)?-5054[);/ ]'
+    - regex: 'BQ(?:ru)?-5054(?:[);/ ]|$)'
       model: 'Crystal'
-    - regex: 'BQ-5052[);/ ]'
+    - regex: 'BQ-5052(?:[);/ ]|$)'
       model: 'Sense'
-    - regex: 'BQ[S]?-5045[);/ ]'
+    - regex: 'BQ[S]?-5045(?:[);/ ]|$)'
       model: 'Fast'
-    - regex: 'BQ(?:ru)?-(?:5037|5514L)[);/ ]'
+    - regex: 'BQ(?:ru)?-(?:5037|5514L)(?:[);/ ]|$)'
       model: 'Strike Power 4G'
-    - regex: 'BQ(?:ru)?-5035[);/ ]'
+    - regex: 'BQ(?:ru)?-5035(?:[);/ ]|$)'
       model: 'Velvet'
-    - regex: 'BQ(?:ru)?-5033[);/ ]'
+    - regex: 'BQ(?:ru)?-5033(?:[);/ ]|$)'
       model: 'Shark'
-    - regex: 'BQ-5541L[);/ ]'
+    - regex: 'BQ-5541L(?:[);/ ]|$)'
       model: 'Shark Rush'
-    - regex: 'BQ-5032[);/ ]'
+    - regex: 'BQ-5032(?:[);/ ]|$)'
       model: 'Element'
-    - regex: 'BQS-5025[);/ ]'
+    - regex: 'BQS-5025(?:[);/ ]|$)'
       model: 'High Way'
-    - regex: 'BQ(?:ru)?-5022[);/ ]'
+    - regex: 'BQ(?:ru)?-5022(?:[);/ ]|$)'
       model: 'Bond'
-    - regex: 'BQ-5015L[);/ ]'
+    - regex: 'BQ-5015L(?:[);/ ]|$)'
       model: 'First'
-    - regex: 'BQ-5012L[);/ ]'
+    - regex: 'BQ-5012L(?:[);/ ]|$)'
       model: 'Rich'
-    - regex: 'BQS-5011[);/ ]'
+    - regex: 'BQS-5011(?:[);/ ]|$)'
       model: 'Monte Carlo'
-    - regex: 'BQ-5010G[);/ ]'
+    - regex: 'BQ-5010G(?:[);/ ]|$)'
       model: 'Spot'
-    - regex: 'BQS-5010[);/ ]'
+    - regex: 'BQS-5010(?:[);/ ]|$)'
       model: 'Prague'
-    - regex: 'BQ-5009L[);/ ]'
+    - regex: 'BQ-5009L(?:[);/ ]|$)'
       model: 'Trend'
-    - regex: 'BQS-500[59][);/ ]'
+    - regex: 'BQS-500[59](?:[);/ ]|$)'
       model: 'Sydney'
-    - regex: 'BQ-5008L[);/ ]'
+    - regex: 'BQ-5008L(?:[);/ ]|$)'
       model: 'Brave'
-    - regex: 'BQ-5007L[);/ ]'
+    - regex: 'BQ-5007L(?:[);/ ]|$)'
       model: 'Iron'
-    - regex: 'BQS-5006[);/ ]'
+    - regex: 'BQS-5006(?:[);/ ]|$)'
       model: 'Los Angeles'
-    - regex: 'BQ-(?:5005L|5530L)[);/ ]'
+    - regex: 'BQ-(?:5005L|5530L)(?:[);/ ]|$)'
       model: 'Intense'
-    - regex: 'BQS-5004[);/ ]'
+    - regex: 'BQS-5004(?:[);/ ]|$)'
       model: 'Paris'
-    - regex: 'BQ-5003L[);/ ]'
+    - regex: 'BQ-5003L(?:[);/ ]|$)'
       model: 'Shark Pro'
-    - regex: 'BQ-5002G[);/ ]'
+    - regex: 'BQ-5002G(?:[);/ ]|$)'
       model: 'Fun'
-    - regex: 'BQS-5002[);/ ]'
+    - regex: 'BQS-5002(?:[);/ ]|$)'
       model: 'Colombo'
-    - regex: 'BQS-5003[);/ ]'
+    - regex: 'BQS-5003(?:[);/ ]|$)'
       model: 'Colombo II'
-    - regex: 'BQ-5001L[);/ ]'
+    - regex: 'BQ-5001L(?:[);/ ]|$)'
       model: 'Contact'
-    - regex: 'BQS-5001[);/ ]'
+    - regex: 'BQS-5001(?:[);/ ]|$)'
       model: 'Milan'
-    - regex: 'BQ(?:ru|S)?-5000[);/ ]'
+    - regex: 'BQ(?:ru|S)?-5000(?:[);/ ]|$)'
       model: 'Tokyo'
-    - regex: 'BQS-4800[);/ ]'
+    - regex: 'BQS-4800(?:[);/ ]|$)'
       model: 'Blade'
-    - regex: 'BQS-4707[);/ ]'
+    - regex: 'BQS-4707(?:[);/ ]|$)'
       model: 'Montreal'
-    - regex: 'BQS-4702[);/ ]'
+    - regex: 'BQS-4702(?:[);/ ]|$)'
       model: 'Оsaka'
-    - regex: 'BQS-4701[);/ ]'
+    - regex: 'BQS-4701(?:[);/ ]|$)'
       model: 'Venice'
-    - regex: 'BQ-(?:4585|5011G)[);/ ]'
+    - regex: 'BQ-(?:4585|5011G)(?:[);/ ]|$)'
       model: 'Fox View'
-    - regex: 'BQ(?:ru)?-4583[);/ ]'
+    - regex: 'BQ(?:ru)?-4583(?:[);/ ]|$)'
       model: 'Fox Power'
-    - regex: 'BQS-4570[);/ ]'
+    - regex: 'BQS-4570(?:[);/ ]|$)'
       model: 'Drive'
-    - regex: 'BQS-4560[);/ ]'
+    - regex: 'BQS-4560(?:[);/ ]|$)'
       model: 'Golf'
-    - regex: 'BQS-4555[);/ ]'
+    - regex: 'BQS-4555(?:[);/ ]|$)'
       model: 'Turbo'
-    - regex: 'BQS-4550[);/ ]'
+    - regex: 'BQS-4550(?:[);/ ]|$)'
       model: 'Richmond'
-    - regex: 'BQ(?:ru)?-(?:4526|5004G)[);/ ]'
+    - regex: 'BQ(?:ru)?-(?:4526|5004G)(?:[);/ ]|$)'
       model: 'Fox'
-    - regex: 'BQS-4525[);/ ]'
+    - regex: 'BQS-4525(?:[);/ ]|$)'
       model: 'Vienna'
-    - regex: 'BQS-4516[);/ ]'
+    - regex: 'BQS-4516(?:[);/ ]|$)'
       model: 'Singapore'
-    - regex: 'BQS-4515[);/ ]'
+    - regex: 'BQS-4515(?:[);/ ]|$)'
       model: 'Moscow'
-    - regex: 'BQS-4510[);/ ]'
+    - regex: 'BQS-4510(?:[);/ ]|$)'
       model: 'Florence'
-    - regex: 'BQS-4505[);/ ]'
+    - regex: 'BQS-4505(?:[);/ ]|$)'
       model: 'Santiago'
-    - regex: 'BQS-4503[);/ ]'
+    - regex: 'BQS-4503(?:[);/ ]|$)'
       model: 'Dubai'
-    - regex: 'BQS-4502[);/ ]'
+    - regex: 'BQS-4502(?:[);/ ]|$)'
       model: 'Kingston'
     - regex: 'BQS-4501 Bristol'
       model: 'Bristol'
-    - regex: 'BQ-4501G[);/ ]'
+    - regex: 'BQ-4501G(?:[);/ ]|$)'
       model: 'Fox Easy'
-    - regex: 'BQ(?:ru)?-4500[);/ ]'
+    - regex: 'BQ(?:ru)?-4500(?:[);/ ]|$)'
       model: 'Fox LTE'
-    - regex: 'BQ-4077[);/ ]'
+    - regex: 'BQ-4077(?:[);/ ]|$)'
       model: 'Shark Mini'
-    - regex: 'BQ(?:ru)?-4072[);/ ]'
+    - regex: 'BQ(?:ru)?-4072(?:[);/ ]|$)'
       model: 'Strike Mini'
-    - regex: 'BQ(?:ru)?[- ]402[68][);/ ]'
+    - regex: 'BQ(?:ru)?[- ]402[68](?:[);/ ]|$)'
       model: 'Up!'
-    - regex: 'BQS-4010[);/ ]'
+    - regex: 'BQS-4010(?:[);/ ]|$)'
       model: 'Aspen'
-    - regex: 'BQS-4009[);/ ]'
+    - regex: 'BQS-4009(?:[);/ ]|$)'
       model: 'Orleans'
-    - regex: 'BQS-4008[);/ ]'
+    - regex: 'BQS-4008(?:[);/ ]|$)'
       model: 'Shanghai'
-    - regex: 'BQS-4007[);/ ]'
+    - regex: 'BQS-4007(?:[);/ ]|$)'
       model: 'Valencia'
-    - regex: 'BQS-4005[);/ ]'
+    - regex: 'BQS-4005(?:[);/ ]|$)'
       model: 'Seoul'
-    - regex: 'BQS-4004[);/ ]'
+    - regex: 'BQS-4004(?:[);/ ]|$)'
       model: 'Dusseldorf'
-    - regex: 'BQS-4003[);/ ]'
+    - regex: 'BQS-4003(?:[);/ ]|$)'
       model: 'Verona'
-    - regex: 'BQ-4001G[);/ ]'
+    - regex: 'BQ-4001G(?:[);/ ]|$)'
       model: 'Cool'
-    - regex: 'BQS-4001[);/ ]'
+    - regex: 'BQS-4001(?:[);/ ]|$)'
       model: 'Oxford'
-    - regex: 'BQS-3510[);/ ]'
+    - regex: 'BQS-3510(?:[);/ ]|$)'
       model: 'Aspen Mini'
-    - regex: 'BQS-3503[);/ ]'
+    - regex: 'BQS-3503(?:[);/ ]|$)'
       model: 'Bombay'
-    - regex: 'BQ-1085L[);/ ]'
+    - regex: 'BQ-1085L(?:[);/ ]|$)'
       model: 'Hornet Max Pro'
       device: 'tablet'
-    - regex: 'BQ-1084L[);/ ]'
+    - regex: 'BQ-1084L(?:[);/ ]|$)'
       model: 'Hornet Max'
       device: 'tablet'
-    - regex: 'BQ-1083G[);/ ]'
+    - regex: 'BQ-1083G(?:[);/ ]|$)'
       model: 'Armor Pro Plus'
       device: 'tablet'
-    - regex: 'BQ-1082G[);/ ]'
+    - regex: 'BQ-1082G(?:[);/ ]|$)'
       model: 'Armor Pro'
       device: 'tablet'
-    - regex: 'BQ-1077L[);/ ]'
+    - regex: 'BQ-1077L(?:[);/ ]|$)'
       model: 'Armor Pro LTE'
       device: 'tablet'
-    - regex: 'BQ(?:ru)?-1057L[);/ ]'
+    - regex: 'BQ(?:ru)?-1057L(?:[);/ ]|$)'
       model: 'Passion'
       device: 'tablet'
-    - regex: 'BQ-1051G[);/ ]'
+    - regex: 'BQ-1051G(?:[);/ ]|$)'
       model: 'Corsika'
       device: 'tablet'
-    - regex: 'BQ-1050G[);/ ]'
+    - regex: 'BQ-1050G(?:[);/ ]|$)'
       model: 'Hawaii'
       device: 'tablet'
-    - regex: 'BQ[-]?1008G[);/ ]'
+    - regex: 'BQ[-]?1008G(?:[);/ ]|$)'
       model: 'Grace'
       device: 'tablet'
     - regex: 'Aquaris M8'
       model: 'Aquaris M8'
       device: 'tablet'
-    - regex: 'BQ(?:ru)?[_ ]5590[);/ ]'
+    - regex: 'Aquaris_A4.5'
+      model: 'Aquaris A4.5'
+    - regex: 'BQ(?:ru)?[_ ]5590(?:[);/ ]|$)'
       model: 'Spring'
-    - regex: 'BQ[S]?-(?:6016L|5520)[);/ ]'
+    - regex: 'BQ[S]?-(?:6016L|5520)(?:[);/ ]|$)'
       model: 'Mercury'
-    - regex: 'BQ(?:S|ru)?-(?:5701L|5060)[);/ ]'
+    - regex: 'BQ(?:S|ru)?-(?:5701L|5060)(?:[);/ ]|$)'
       model: 'Slim'
     - regex: '(BQ-7850|BQ-700[12]G|BQ-8002G|BQ-905[12]G|BQ-9702G|BQ-7056G)'
       model: '$1'
       device: 'tablet'
-    - regex: 'BQ-8006G[);/ ]'
+    - regex: 'BQ-8006G(?:[);/ ]|$)'
       model: 'Java'
       device: 'tablet'
-    - regex: 'BQ-7062G[);/ ]'
+    - regex: 'BQ-7062G(?:[);/ ]|$)'
       model: 'Fiji'
       device: 'tablet'
-    - regex: 'BQ(?:ru)?-1081G[);/ ]'
+    - regex: 'BQ(?:ru)?-1081G(?:[);/ ]|$)'
       model: 'Grace 3G'
       device: 'tablet'
-    - regex: 'BQ-7802G[);/ ]'
+    - regex: 'BQ-7802G(?:[);/ ]|$)'
       model: 'Luzon'
       device: 'tablet'
-    - regex: 'BQ-7008G[);/ ]'
+    - regex: 'BQ-7008G(?:[);/ ]|$)'
       model: 'Clarion'
       device: 'tablet'
-    - regex: 'BQ-7064G[);/ ]'
+    - regex: 'BQ-7064G(?:[);/ ]|$)'
       model: 'Fusion'
       device: 'tablet'
-    - regex: 'BQ-7050G[);/ ]'
+    - regex: 'BQ-7050G(?:[);/ ]|$)'
       model: 'Malta'
       device: 'tablet'
-    - regex: 'BQ-7000G[);/ ]'
+    - regex: 'BQ-7000G(?:[);/ ]|$)'
       model: 'Сharm'
       device: 'tablet'
-    - regex: 'BQ-7040G[);/ ]'
+    - regex: 'BQ-7040G(?:[);/ ]|$)'
       model: 'Сharm Plus'
       device: 'tablet'
-    - regex: 'BQ-7038G[);/ ]'
+    - regex: 'BQ-7038G(?:[);/ ]|$)'
       model: 'Light Plus'
       device: 'tablet'
-    - regex: 'BQ-7005G[);/ ]'
+    - regex: 'BQ-7005G(?:[);/ ]|$)'
       model: 'Maui'
       device: 'tablet'
-    - regex: 'BQ-7098G[);/ ]'
+    - regex: 'BQ-7098G(?:[);/ ]|$)'
       model: 'Armor Power'
       device: 'tablet'
-    - regex: 'BQ-1007[);/ ]'
+    - regex: 'BQ-1007(?:[);/ ]|$)'
       model: 'Necker'
       device: 'tablet'
-    - regex: 'BQ-1045[G]?[);/ ]'
+    - regex: 'BQ-1045[G]?(?:[);/ ]|$)'
       model: 'Orion'
       device: 'tablet'
-    - regex: 'BQ-1054L[);/ ]'
+    - regex: 'BQ-1054L(?:[);/ ]|$)'
       model: 'Nexion'
       device: 'tablet'
-    - regex: 'BQ(?:ru)?-7083[);/ ]'
+    - regex: 'BQ(?:ru)?-7083(?:[);/ ]|$)'
       model: '7083'
       device: 'tablet'
-    - regex: 'BQ(?:ru)?-1056L[);/ ]'
+    - regex: 'BQ(?:ru)?-1056L(?:[);/ ]|$)'
       model: '1056L'
       device: 'tablet'
-    - regex: 'BQ(?:ru)?-1022l[);/ ]'
+    - regex: 'BQ(?:ru)?-1022l(?:[);/ ]|$)'
       model: 'Armor Pro LTE+'
       device: 'tablet'
-    - regex: 'BQ(?:ru)?-7081[);/ ]'
+    - regex: 'BQ(?:ru)?-7081(?:[);/ ]|$)'
       model: 'Charm'
       device: 'tablet'
     - regex: '(?:bq )?(Aquaris[^/;]*) Build'
@@ -3161,22 +3186,22 @@ Captiva:
 
 # Casio
 Casio:
-  regex: '(C811|C7[57]1)(?: 4G)?[);/ ]'
+  regex: '(C811|C7[57]1)(?: 4G)?(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'C751[);/ ]'
+    - regex: 'C751(?:[);/ ]|$)'
       model: "G'zOne Ravine"
-    - regex: 'C771[);/ ]'
+    - regex: 'C771(?:[);/ ]|$)'
       model: "G'zOne Commando"
-    - regex: 'C811 4G[);/ ]'
+    - regex: 'C811 4G(?:[);/ ]|$)'
       model: "G'zOne Commando 4G LTE"
 
 # Casper
 Casper:
-  regex: 'CASPER[_ ]|VIA[- _](T7D|A[34]|E3|F[123]|G4|M4|[LS]8|S7|P2|V8C|A1_Plus|A1|S10|S|T17_M|T1[07]|T7|T7-3G|T8B|T8D-3G)[);/ ]'
+  regex: 'CASPER[_ ]|VIA[- _](T7D|A[34]|E3|F[123]|G4|M4|[LS]8|S7|P2|V8C|A1_Plus|A1|S10|S|T17_M|T1[07]|T7|T7-3G|T8B|T8D-3G)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'CASPER[_ ]VIA_(G1_Plus|G1|E1|[AE]2|M[123]|V[35689]|V10|G3)[);/ ]'
+    - regex: 'CASPER[_ ]VIA_(G1_Plus|G1|E1|[AE]2|M[123]|V[35689]|V10|G3)(?:[);/ ]|$)'
       model: 'VIA $1'
     - regex: 'CASPER_VIA_E1c'
       model: 'VIA E1C'
@@ -3186,7 +3211,7 @@ Casper:
     - regex: 'VIA[- _](T7|T8D)-3G'
       model: 'VIA $1 3G'
       device: 'tablet'
-    - regex: 'VIA[- _](T7D|S10|[LS]8|S7|T17_M|T1[07]|T7|T8B)[);/ ]'
+    - regex: 'VIA[- _](T7D|S10|[LS]8|S7|T17_M|T1[07]|T7|T8B)(?:[);/ ]|$)'
       model: 'VIA $1'
       device: 'tablet'
     - regex: 'VIA[_ ](A[34]|E3|F[123]|G4|M4|P2|S|V8C|A1_Plus|A1)'
@@ -3210,7 +3235,7 @@ Cat:
 
 # Carrefour
 Carrefour:
-  regex: 'CT(?:10[0123]0|7[12]0|820)(?:W|FR)?[);/ ]'
+  regex: 'CT(?:10[0123]0|7[12]0|820)(?:W|FR)?(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'CT820'
@@ -3405,19 +3430,19 @@ ConCorde:
 
 # Condor
 Condor:
-  regex: 'Allure M[13]|Griffe T[256789]|TFX712G|TRA-901G|TGW[-]?(710G|709)|(?:PGN\-?[456][012][0-9]|PHS\-601|PHQ519|PHQ52[056]|PKT\-301|Plume (?:H1|L[123]|P8))[;/) ]|CTAB[^/;]+ Build'
+  regex: 'Allure M[13]|Griffe T[256789]|TFX712G|TRA-901G|TGW[-]?(710G|709)|(?:PGN\-?[456][012][0-9]|PHS\-601|PHQ519|PHQ52[056]|PKT\-301|Plume (?:H1|L[123]|P8))(?:[);/ ]|$)|CTAB[^/;]+ Build'
   device: 'smartphone'
   models:
     - regex: 'CTAB([^/;]+) Build'
       device: 'tablet'
       model: 'CTAB $1'
-    - regex: '(TGW)-?(710G|709)[);/ ]'
+    - regex: '(TGW)-?(710G|709)(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1 $2'
-    - regex: '(TFX712G)[);/ ]'
+    - regex: '(TFX712G)(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1'
-    - regex: '(TRA)-(901G)[);/ ]'
+    - regex: '(TRA)-(901G)(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1 $2'
 
@@ -3521,35 +3546,39 @@ Condor:
 
 # Coolpad
 Coolpad:
-  regex: '(?:YL-)?Coolpad|(?:8190Q|8676-A01|CP8298_I00|CP3648A|CP8676_I0[23]|REVVLPLUS C3701A|VCR-[AI]0|C106-7|MTS-T0|cp3705A[S]?|ORL-C0)[);/ ]|(8295|5860S) Build'
+  regex: '(?:YL-)?Coolpad|(?:Cool_9S|8190Q|1831-A0|8676-A01|CP8298_I00|CP3648A|CP8676_I0[23]|REVVLPLUS C3701A|VCR-[AI]0|C106-7|MTS-T0|cp3705A[S]?|ORL-C0)(?:[);/ ]|$)|(8295|5860S) Build'
   device: 'smartphone'
   models:
     - regex: 'VCR-[AI]0'
       model: 'Cool Play 6'
+    - regex: '1831-A0(?:[);/ ]|$)'
+      model: 'Cool Play C7'
     - regex: 'REVVLPLUS C3701A'
       model: 'REVVL Plus'
       device: 'phablet'
-    - regex: '8190Q[);/ ]'
+    - regex: '8190Q(?:[);/ ]|$)'
       model: '8190Q'
-    - regex: 'CP3705A[S]?[);/ ]'
+    - regex: 'CP3705A[S]?(?:[);/ ]|$)'
       model: 'Legacy'
-    - regex: 'CP3648A[);/ ]'
+    - regex: 'CP3648A(?:[);/ ]|$)'
       model: 'Legacy S'
-    - regex: 'MTS-T0[);/ ]'
+    - regex: 'MTS-T0(?:[);/ ]|$)'
       model: 'N2M'
-    - regex: 'C106-7[);/ ]'
+    - regex: 'C106-7(?:[);/ ]|$)'
       model: 'Cool 1'
-    - regex: 'ORL-C0[);/ ]'
+    - regex: 'ORL-C0(?:[);/ ]|$)'
       model: 'Cool 9'
+    - regex: 'Cool_9S(?:[);/ ]|$)'
+      model: 'Cool 9S'
     - regex: '(5860S|8295) Build'
       model: '$1'
-    - regex: 'CP8676_I02[);/ ]'
+    - regex: 'CP8676_I02(?:[);/ ]|$)'
       model: 'Note 3'
-    - regex: 'CP8676_I03[);/ ]'
+    - regex: 'CP8676_I03(?:[);/ ]|$)'
       model: 'Note 3 Plus'
-    - regex: 'CP8298_I00[);/ ]'
+    - regex: 'CP8298_I00(?:[);/ ]|$)'
       model: 'Note 3 Lite'
-    - regex: '(8676-A01)[);/ ]'
+    - regex: '(8676-A01)(?:[);/ ]|$)'
       model: '$1'
     - regex: '(?:YL-)?Coolpad[ _\-]?([^/;]+) Build'
       model: '$1'
@@ -3572,7 +3601,7 @@ Cricket:
 
 # Crius
 'Crius Mea':
-  regex: '(Q7A\+?)[);/ ]'
+  regex: '(Q7A\+?)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
@@ -3594,19 +3623,41 @@ Crosscall:
     - regex: 'Trekker-([MSX][1234](?: Core)?)'
       model: 'Trekker-$1'
 
-# Cube
+# AllDocube (https://www.alldocube.com/)
+AllDocube:
+  regex: '(?:T1001XS?|iPlay_20|U1006)(?:[);/ ]|$)'
+  device: 'tablet'
+  models:
+    - regex: 'T1001XS(?:[);/ ]|$)'
+      model: 'M5XS'
+    - regex: 'T1001X(?:[);/ ]|$)'
+      model: 'M5X'
+    - regex: 'U1006(?:[);/ ]|$)'
+      model: 'iPlay 10 Pro 10.1"'
+    - regex: 'iPlay_20(?:[);/ ]|$)'
+      model: 'iPlay 20'
+
+# Cube (short name Alldocube)
 Cube:
-  regex: '(<!myPhone ?)Cube|(U[0-9]+GT|K8GT)|(?:T8-PLUSM?S?|T8PLUSML)[);/ ]'
+  regex: '(<!myPhone ?)Cube|(U[0-9]+GT|K8GT)|(?:T8-PLUSM?S?|T8PLUSML|I1-TF[BD]?|I1-TC|i1002S|Iwork10 Flagship|iwork10 Pro)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'U27GT'
       model: 'Talk 8'
-    - regex: '(?:T8-PLUSM?S?|T8PLUSML)[);/ ]'
+    - regex: '(?:T8-PLUSM?S?|T8PLUSML)(?:[);/ ]|$)'
       model: 'T8 Ultimate'
     - regex: 'U55GT'
       model: 'Talk 79'
     - regex: 'U65GT'
       model: 'Talk 9X'
+    - regex: 'I1-TF[BD]?(?:[);/ ]|$)'
+      model: 'iWork 8 Air'
+    - regex: 'I1-TC(?:[);/ ]|$)'
+      model: 'iWork 8 Ultimate'
+    - regex: '(?:i1002S|iwork10 Pro)(?:[);/ ]|$)'
+      model: 'iWork 10 Pro'
+    - regex: 'Iwork10 Flagship(?:[);/ ]|$)'
+      model: 'iWork 10 Flagship'
 
     - regex: '(U[0-9]+GT[^;/]*) Build'
       model: '$1'
@@ -3617,7 +3668,7 @@ Cube:
 
 # CUBOT
 CUBOT:
-  regex: 'CUBOT|RAINBOW 2|KING_KONG_3|KINGKONG_MINI'
+  regex: 'CUBOT|RAINBOW 2|KING_KONG_3|KINGKONG_MINI|QUEST LITE'
   device: 'smartphone'
   models:
     - regex: 'CHEETAH 2'
@@ -3634,6 +3685,8 @@ CUBOT:
       model: 'King Kong 3'
     - regex: 'KING KONG'
       model: 'King Kong'
+    - regex: 'QUEST LITE'
+      model: 'Quest Lite'
     - regex: 'CUBOT[ _]Echo'
       model: 'Echo'
     - regex: 'CUBOT[ _]MANITO'
@@ -3652,7 +3705,7 @@ CUBOT:
       model: 'Power'
     - regex: 'CUBOT_X18_Plus'
       model: 'X18 Plus'
-    - regex: 'CUBOT[ _](A5|C6W|H3|J3|P7|P20|[RX]9|R11|X18)[);/ ]'
+    - regex: 'CUBOT[ _](A5|C6W|H3|J3|P7|P20|[RX]9|R11|X18)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'CUBOT ([^;/]+) Build'
       model: '$1'
@@ -3681,7 +3734,7 @@ Clout:
 
 # Concord
 Concord:
-  regex: 'Concord[ _-]|Flyfix 6|C-721[);/ ]'
+  regex: 'Concord[ _-]|Flyfix 6|C-721(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'M10'
@@ -3711,7 +3764,7 @@ Cyrus:
   models:
     - regex: 'Cyrus[ _-]?([^;/)]+) Build'
       model: '$1'
-    - regex: 'Cyrus[ _-]?([^;/)]+)[);/ ]'
+    - regex: 'Cyrus[ _-]?([^;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Datang
@@ -3721,7 +3774,7 @@ Datang:
   models:
     - regex: '(?:DATANG[ _-])+([^;/]+) Build'
       model: '$1'
-    - regex: '(?:DATANG[ _-])+([^;/)]+)[;/)]'
+    - regex: '(?:DATANG[ _-])+([^;/)]+)(?:[;/)]|$)'
       model: '$1'
 
 # Datsun
@@ -3750,7 +3803,7 @@ Denver:
   regex: '(?:TA[CDQ]-[0-9]+)|P(?:.+)TAQ-(?:[0-9]+)'
   device: 'tablet'
   models:
-    - regex: 'P(?:.+)TAQ-(10172MK3|10242MK2|70242MK2|[0-9]+)[);/ ]'
+    - regex: 'P(?:.+)TAQ-(10172MK3|10242MK2|70242MK2|[0-9]+)(?:[);/ ]|$)'
       model: 'TAQ-$1'
     - regex: '(TA[CDQ]-[0-9]+)'
       model: '$1'
@@ -3787,46 +3840,46 @@ Desay:
   models:
     - regex: 'Desay[ _-]?([^;/)]+) Build'
       model: '$1'
-    - regex: 'Desay[ _-]?([^;/)]+)[);/ ]'
+    - regex: 'Desay[ _-]?([^;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
 # DEXP
 DEXP:
-  regex: 'DEXP|(?:Ursus|Ixion)[ _]([^;/)]+)|H135[ _]Build|(SENIOR|F4[38]D8000K|VA[12]10|ML450|MS[56]50|BL[12]50|BS155|BS160|BS[1256]50|AL[12]40|AS260| (?:B450|B340))[);/ ]'
+  regex: 'DEXP|(?:Ursus|Ixion)[ _]([^;/)]+)|H135[ _]Build|(SENIOR|F4[38]D8000K|VA[12]10|ML450|MS[56]50|BL[12]50|BS155|BS160|BS[1256]50|AL[12]40|AS260| (?:B450|B340))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
 
     - regex: 'Ixion[_ ]([^;/]+)(?: Build|\))'
       model: 'Ixion $1'
-    - regex: '(ML450|MS[56]50)[);/ ]'
+    - regex: '(ML450|MS[56]50)(?:[);/ ]|$)'
       model: 'Ixion $1'
-    - regex: 'AS260[);/ ]'
+    - regex: 'AS260(?:[);/ ]|$)'
       model: '5.85" AS260'
       device: 'phablet'
 
     - regex: 'Ursus ([^;/)]+)(?: Build|\))'
       model: 'Ursus $1'
       device: 'tablet'
-    - regex: '(VA[21]10)[);/ ]'
+    - regex: '(VA[21]10)(?:[);/ ]|$)'
       model: 'Ursus $1'
       device: 'tablet'
 
-    - regex: ' (B450|B340)[);/ ]'
+    - regex: ' (B450|B340)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'SENIOR[);/ ]'
+    - regex: 'SENIOR(?:[);/ ]|$)'
       model: 'Senior'
 
     - regex: 'H135[ _]Build'
       model: 'Atlas'
       device: 'desktop'
-    - regex: '(BL[12]50|BS155|BS160|BS[1256]50|AL[12]40)[);/ ]'
+    - regex: '(BL[12]50|BS155|BS160|BS[1256]50|AL[12]40)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'DEXP[ _]([^;/]+) Build'
       model: '$1'
-    - regex: 'DEXP[ _]([^);/]+)[);/ ]'
+    - regex: 'DEXP[ _]([^);/]+)(?:[);/ ]|$)'
       model: '$1'
 
-    - regex: '(F4[38]D8000K)[);/ ]'
+    - regex: '(F4[38]D8000K)(?:[);/ ]|$)'
       device: 'tv'
       model: '$1'
 
@@ -3850,7 +3903,7 @@ Dicam:
 
 # Digi
 Digi:
-  regex: '(?<!FBCR/)Digi[ _]([^);/]+)[);/ ]'
+  regex: '(?<!FBCR/)Digi[ _]([^);/]+)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
@@ -3989,16 +4042,16 @@ DoCoMo:
 
 # Doogee
 Doogee:
-  regex: 'DOOGEE[ _-]|Valencia2_Y100_?(?:pro|plus)|Y100_Plus|X5max(?:[_ ]PRO)?|(KISSME|BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)[);/ ]|BL[579]000[);/ ]|BL12000|BL5500[_ ]Lite|X9 Mini|LEO_DG280|Y9Plus|Hitman_DG850'
+  regex: 'DOOGEE[ _-]|Valencia2_Y100_?(?:pro|plus)|Y100_Plus|X5max(?:[_ ]PRO)?|(KISSME|BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)(?:[);/ ]|$)|BL[579]000(?:[);/ ]|$)|BL12000|BL5500[_ ]Lite|X9 Mini|LEO_DG280|Y9Plus|Hitman_DG850'
   device: 'smartphone'
   models:
-    - regex: '(?:Valencia2_)?Y100_Plus[);/ ]'
+    - regex: '(?:Valencia2_)?Y100_Plus(?:[);/ ]|$)'
       model: 'Valencia2 Y100 Plus'
     - regex: 'Valencia2_Y100pro'
       model: 'Valencia2 Y100 Pro'
     - regex: 'LEO_(DG280)'
       model: 'Leo $1'
-    - regex: '(BL[579]000)[);/ ]'
+    - regex: '(BL[579]000)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'BL12000 PRO'
       model: 'BL12000 Pro'
@@ -4014,13 +4067,13 @@ Doogee:
       model: 'X9 Mini'
     - regex: '(X5max(?:[_ ]PRO)?)'
       model: '$1'
-    - regex: '(?:DOOGEE[ _-])?(BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|Valencia2_Y100pro|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)[);/ ]'
+    - regex: '(?:DOOGEE[ _-])?(BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|Valencia2_Y100pro|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)(?:[);/ ]|$)'
       model: '$1 $2'
     - regex: 'DOOGEE[ _-]([^);/]+) Build'
       model: '$1'
-    - regex: 'DOOGEE[ _-]([^);/]+)[);/ ]'
+    - regex: 'DOOGEE[ _-]([^);/]+)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'Y9Plus[);/ ]'
+    - regex: 'Y9Plus(?:[);/ ]|$)'
       model: 'Y9 Plus'
 
 # Doov
@@ -4030,7 +4083,7 @@ Doov:
   models:
     - regex: '(?:Doov-)?Doov[ _]([^;/]+) Build'
       model: '$1'
-    - regex: '(?:Doov-)?Doov[ _]([^);/]+)[);/ ]'
+    - regex: '(?:Doov-)?Doov[ _]([^);/]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Dopod
@@ -4061,10 +4114,10 @@ Doro:
 
 # DNS
 DNS:
-  regex: '(?:DNS|AirTab)[ _\-]([^;/)]+)(?: Build|\))|(?:S4505M|SD01M)[);/ ]'
+  regex: '(?:DNS|AirTab)[ _\-]([^;/)]+)(?: Build|\))|(?:S4505M|SD01M)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(?:DNS[_ ])?(S4505M|SD01M|S4502|S4003|S4003)[);/ ]'
+    - regex: '(?:DNS[_ ])?(S4505M|SD01M|S4502|S4003|S4003)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'AirTab[ _\-]([^;/]+)Build'
       model: 'AirTab $1'
@@ -4103,7 +4156,7 @@ EBEST:
   models:
     - regex: 'EBEST[ _-]?([^;/)]+) Build'
       model: '$1'
-    - regex: 'EBEST[ _-]?([^;/)]+)[);/ ]'
+    - regex: 'EBEST[ _-]?([^;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Echo Mobiles
@@ -4113,7 +4166,7 @@ Echo Mobiles:
   models:
     - regex: 'ECHO_HORIZON_LITE'
       model: 'HORIZON Lite'
-    - regex: '(HORIZON_M)[);/ ]'
+    - regex: '(HORIZON_M)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'ECHO_SMART_4G'
       model: 'SMART 4G'
@@ -4122,16 +4175,16 @@ Echo Mobiles:
 
 # ECS
 ECS:
-  regex: '(?:TA10CA3|TM105A?|TR10CS1)[);/ ]'
+  regex: '(?:TA10CA3|TM105A?|TR10CS1)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'TA10CA3[);/ ]'
+    - regex: 'TA10CA3(?:[);/ ]|$)'
       model: 'TA10CA3'
-    - regex: 'TR10CS1[);/ ]'
+    - regex: 'TR10CS1(?:[);/ ]|$)'
       model: 'TR10CS1'
-    - regex: 'TM105A[);/ ]'
+    - regex: 'TM105A(?:[);/ ]|$)'
       model: 'TM105A'
-    - regex: 'TM105[);/ ]'
+    - regex: 'TM105(?:[);/ ]|$)'
       model: 'TM105'
 
 # EE
@@ -4157,15 +4210,15 @@ Elephone:
   regex: 'Elephone|P6000( ?Pro| ?Plus|\+| ?02)? Build'
   device: 'smartphone'
   models:
-    - regex: 'Elephone Trunk[);/ ]'
+    - regex: 'Elephone Trunk(?:[);/ ]|$)'
       model: 'Trunk'
-    - regex: 'P6000(\+| ?Plus)[);/ ]'
+    - regex: 'P6000(\+| ?Plus)(?:[);/ ]|$)'
       model: 'P6000 Plus'
-    - regex: 'P6000 02[);/ ]'
+    - regex: 'P6000 02(?:[);/ ]|$)'
       model: 'P6000 02'
-    - regex: 'P6000 ?Pro[);/ ]'
+    - regex: 'P6000 ?Pro(?:[);/ ]|$)'
       model: 'P6000 Pro'
-    - regex: '(?:Elephone[ _])?(P[68]000|S2)[);/ ]'
+    - regex: '(?:Elephone[ _])?(P[68]000|S2)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'Elephone[ _\-]([^/;]+) Build'
       model: '$1'
@@ -4177,7 +4230,7 @@ Element:
 
 # Elenberg
 Elenberg:
-  regex: '(TAB(?:101|728)[ _]3G|TAB7(?:[03]8|16|40|3[30]))[/;) ]'
+  regex: '(TAB(?:101|728)[ _]3G|TAB7(?:[03]8|16|40|3[30]))(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
@@ -4211,26 +4264,26 @@ E-tel:
 
 # Evercoss
 Evercoss:
-  regex: 'EVERCOSS[ _]|(A75A\*|U50A_PLUS|M50 STAR)[/;) ]'
+  regex: 'EVERCOSS[ _]|(A75A\*|U50A_PLUS|M50 STAR)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'A75A\*[/;) ]'
+    - regex: 'A75A\*(?:[);/ ]|$)'
       model: 'A75A Star'
-    - regex: 'U50A_PLUS[/;) ]'
+    - regex: 'U50A_PLUS(?:[);/ ]|$)'
       model: 'U50A Plus'
-    - regex: 'M50 STAR[/;) ]'
+    - regex: 'M50 STAR(?:[);/ ]|$)'
       model: 'M50 Star'
-    - regex: 'EVERCOSS[ _](A7[BRLZ]|A65|A74A)[/;) ]'
+    - regex: 'EVERCOSS[ _](A7[BRLZ]|A65|A74A)(?:[);/ ]|$)'
       model: '$1'
 
 # Eurostar
 Eurostar:
-  regex: '(ET7002C-H12|Onyx-[13]S)[/;) ]'
+  regex: '(ET7002C-H12|Onyx-[13]S)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Onyx-([13]S)[/;) ]'
+    - regex: 'Onyx-([13]S)(?:[);/ ]|$)'
       model: 'Onyx $1'
-    - regex: 'ET7002C-H12[/;) ]'
+    - regex: 'ET7002C-H12(?:[);/ ]|$)'
       model: 'ePad 4S'
       device: 'tablet'
 
@@ -4241,17 +4294,17 @@ Eton:
   models:
     - regex: 'Eton[ _-]?([^;/)]+) Build'
       model: '$1'
-    - regex: 'Eton[ _-]?([^;/)]+)[);/ ]'
+    - regex: 'Eton[ _-]?([^;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Essentielb
 Essentielb:
-  regex: '(?:Wooze[_ ](?:I55?|L|XL)|HEYOU[135])[);/ ]'
+  regex: '(?:Wooze[_ ](?:I55?|L|XL)|HEYOU[135])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'HEYOU([135])[);/ ]'
+    - regex: 'HEYOU([135])(?:[);/ ]|$)'
       model: 'HEYou $1'
-    - regex: '(Wooze[_ ](?:I55?|L|XL))[);/ ]'
+    - regex: '(Wooze[_ ](?:I55?|L|XL))(?:[);/ ]|$)'
       model: '$1'
 
 # Rikomagic
@@ -4282,7 +4335,7 @@ Senseit:
 
 # Sony & Sony Ericsson (combined as they are mixed up)
 Sony:
-  regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|(?:[4-9]0[12])SO|C1[569]0[45]|C2[01]0[45]|C230[45]|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5316|D5322|D5503|D58[03]3|D65(?:0[23]|43|63)|D66[03458]3|D66[14]6|D6708|E(?:20[0345]3|2006|210[45]|2115|2124|230[36]|2312|23[356]3|530[36]|53[3456]3|5506|55[356]3|56[46305][36]|58[02]3|65[35]3|66[0358]3|68[358]3)|I[34]312|I4332|F311[12356]|F331[13]|F321[12356]|F5[13]21|F5122|F813[12]|F833[12]|G312[135]|G311[26]|G322[136]|G3212|G331[123]|G3412|G3416|G342[136]|G823[12]|G834[123]|G8[14]4[12]|H(?:3113|3123|3133|3213|3223|3311|3321|4113|4133|4213|4233|4311|4331|4413|4433|82[167]6|83[12]4|8416|9436)|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]+[0-9]*(?: Build|\))|X?L39H|XM50[ht]|W960|portalmmm/2\.0 K|S3[69]h|SOL2[246]|SOV3[1-9]|SOV4[0-2]|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[12]C|[345]D|[234]E|[1-5]F|[1-5]G|[1-4]H|[1-4]J|[1-5]K|1M|[1-3]L)|R800[aix]|J82[17]0|J9110|J9210|J81[17]0|I[34]113|I3[12]23|I42[19]3|H9493|H8296|H8166|H4493|LiveWithWalkman|BRAVIA|SGP771|E3 Dual|A001SO|I4193|E6508|SOT31|XQ-AD51'
+  regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|(?:[4-9]0[12])SO|C1[569]0[45]|C2[01]0[45]|C230[45]|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5316|D5322|D5503|D58[03]3|D65(?:0[23]|43|63)|D66[03458]3|D66[14]6|D6708|E(?:20[0345]3|2006|210[45]|2115|2124|230[36]|2312|23[356]3|530[36]|53[3456]3|5506|55[356]3|56[46305][36]|58[02]3|65[35]3|66[0358]3|68[358]3)|I[34]312|I4332|F311[12356]|F331[13]|F321[12356]|F5[13]21|F5122|F813[12]|F833[12]|G312[135]|G311[26]|G322[136]|G3212|G331[123]|G3412|G3416|G342[136]|G823[12]|G834[123]|G8[14]4[12]|H(?:3113|3123|3133|3213|3223|3311|3321|4113|4133|4213|4233|4311|4331|4413|4433|82[167]6|83[12]4|8416|9436)|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]+[0-9]*(?: Build|\))|X?L39H|XM50[ht]|W960|portalmmm/2\.0 K|S3[69]h|SOG01|SOL2[246]|SOV3[1-9]|SOV4[0-3]|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[12]C|[345]D|[234]E|[1-5]F|[1-5]G|[1-4]H|[1-4]J|[1-5]K|1M|[1-3]L)|R800[aix]|J82[17]0|J9110|J92[16]0|J81[17]0|I[34]113|I3[12]23|I42[19]3|H9493|H8296|H8166|H4493|LiveWithWalkman|BRAVIA|SGP771|E3 Dual|A001SO|I4193|E6508|SOT31|SO-[45]1A|XQ-AD51|XQ-AU52'
   device: 'smartphone'
   models:
     # SONY ERICSSON: explicit smartphone models
@@ -4418,7 +4471,7 @@ Sony:
       model: 'Xperia A4'
     - regex: '(?:Sony(?:Ericsson)?)?I(?:4113|31[12]3)'
       model: 'Xperia 10'
-    - regex: 'A001SO[);/ ]'
+    - regex: '(?:A001SO|XQ-AU52|SO-41A|SOV43)(?:[);/ ]|$)'
       model: 'Xperia 10 II'
     - regex: '(?:Sony(?:Ericsson)?)?I(?:42[19]3|3223)'
       model: 'Xperia 10 Plus'
@@ -4426,11 +4479,13 @@ Sony:
       model: 'Xperia 10 Dual'
     - regex: '(?:Sony(?:Ericsson)?)?(?:J(?:9110|81[17]0)|SOV40|SO-03L|802SO)'
       model: 'Xperia 1'
-    - regex: '(?:Sony(?:Ericsson)?)?LT22i'
+    - regex: '(?:Sony(?:Ericsson)?)?(?:SOG01|SO-51A)(?:[);/ ]|$)'
+      model: 'Xperia 1 II'
+    - regex: '(?:Sony(?:Ericsson)?)?LT22i|Xperia P'
       model: 'Xperia P'
-    - regex: '(?:Sony(?:Ericsson)?)?LT25i'
+    - regex: '(?:Sony(?:Ericsson)?)?LT25i|Xperia V'
       model: 'Xperia V'
-    - regex: '(?:Sony(?:Ericsson)?)?J9210'
+    - regex: '(?:Sony(?:Ericsson)?)?J92[16]0'
       model: 'Xperia 5 Dual'
     - regex: '(?:Sony(?:Ericsson)?)?(?:J82[17]0|SO-01M|SOV41|901SO)'
       model: 'Xperia 5'
@@ -4438,7 +4493,7 @@ Sony:
       model: 'Xperia 8'
     - regex: '(?:Sony(?:Ericsson)?)?LT26ii'
       model: 'Xperia SL'
-    - regex: '(?:Sony(?:Ericsson)?)?LT26i'
+    - regex: '(?:Sony(?:Ericsson)?)?LT26i|Xperia S(?:[);/ ]|$)'
       model: 'Xperia S'
     - regex: '(?:Sony(?:Ericsson)?)?SO-02C'
       model: 'Xperia arco'
@@ -4448,7 +4503,7 @@ Sony:
       model: 'Xperia arco S'
     - regex: '(?:Sony(?:Ericsson)?)?LT28[aih]'
       model: 'Xperia ion'
-    - regex: '(?:Sony(?:Ericsson)?)?LT29i'
+    - regex: '(?:Sony(?:Ericsson)?)?LT29i|Xperia TX(?:[);/ ]|$)'
       model: 'Xperia TX'
     - regex: '(?:Sony(?:Ericsson)?)?LT30a'
       model: 'Xperia T LTE'
@@ -4484,19 +4539,21 @@ Sony:
       model: 'Xperia L'
     - regex: '(?:Sony(?:Ericsson)?)?C230[45]|S39h'
       model: 'Xperia C'
-    - regex: '(?:Sony(?:Ericsson)?)?C530[236]'
+    - regex: '(?:Sony(?:Ericsson)?)?C530[236]|Xperia SP(?:[);/ ]|$)'
       model: 'Xperia SP'
     - regex: '(?:Sony(?:Ericsson)?)?C550[23]'
       model: 'Xperia ZR'
-    - regex: '(?:Sony(?:Ericsson)?)?C650[236]'
+    - regex: '(?:Sony(?:Ericsson)?)?C650[236]|Xperia ZL(?:[);/ ]|$)'
       model: 'Xperia ZL'
     - regex: '(?:Sony(?:Ericsson)?)?(?:C66(?:0[236]|16)|SO-02E)'
       model: 'Xperia Z'
-    - regex: '(?:Sony(?:Ericsson)?)?(?:C68(?:0[26]|[34]3)|XL39H|SOL24)'
+    - regex: '(?:Sony(?:Ericsson)?)?(?:C68(?:0[26]|[34]3)|XL39H|SOL24)|Xperia Z Ultra(?:[);/ ]|$)'
       device: 'phablet'
       model: 'Xperia Z Ultra'
     - regex: '(?:Sony(?:Ericsson)?)?(?:C69(?:0[236]|16|43)|L39H|SO-0[12]F)'
       model: 'Xperia Z1'
+    - regex: 'Xperia Z(?:[);/ ]|$)'
+      model: 'Xperia Z'
     - regex: '(?:Sony(?:Ericsson)?)?D200[45]'
       model: 'Xperia E1'
     - regex: '(?:Sony(?:Ericsson)?)?D21(?:0[45]|14)'
@@ -4551,12 +4608,15 @@ Sony:
     - regex: '(?:Sony(?:Ericsson)?)?D5322'
       model: 'Xperia T2 Ultra Dual'
       device: 'phablet'
-    - regex: '(?:Sony(?:Ericsson)?)?D5503'
+    - regex: '(?:Sony(?:Ericsson)?)?D5503|Xperia Z1 Compact'
       model: 'Xperia Z1 Compact'
     - regex: '(?:Sony(?:Ericsson)?)?(?:D58[03]3|SO-02G)'
       model: 'Xperia Z3 Compact'
     - regex: '(?:Sony(?:Ericsson)?)?(?:D65(?:0[23]|43)|SO-03F)'
       model: 'Xperia Z2'
+    - regex: 'Xperia Z2 Tablet Wifi'
+      model: 'Xperia Z2 Tablet WiFi'
+      device: 'tablet'
     - regex: 'D6563'
       model: 'Xperia Z2a'
     - regex: '(?:Sony(?:Ericsson)?)?(?:D66[045]3|D66[14]6|SO-01G|SOL26|401SO)'
@@ -4628,7 +4688,7 @@ Sony:
       model: 'Xperia XZ2 Dual'
     - regex: 'SO-05K'
       model: 'Xperia XZ2 Compact'
-    - regex: '(?:H8166|SOV38)[);/ ]'
+    - regex: '(?:H8166|SOV38)(?:[);/ ]|$)'
       model: 'Xperia XZ2 Premium Dual'
     - regex: '(?:Sony(?:Ericsson)?)?(?:H(8416|9436|9493)|SO-01L|SOV39|801SO)'
       model: 'Xperia XZ3'
@@ -4654,24 +4714,24 @@ Sony:
       model: 'Xperia X Performance Dual'
 
     # SONY: explicit tablet models
-    - regex: 'SGP(?:311|312|321)[);/ ]|SO-03E'
+    - regex: 'SGP(?:311|312|321)(?:[);/ ]|$)|SO-03E'
       model: 'Xperia Tablet Z'
       device: 'tablet'
-    - regex: 'SGP712[);/ ]'
+    - regex: 'SGP712(?:[);/ ]|$)'
       model: 'Xperia Tablet Z4'
       device: 'tablet'
-    - regex: 'SGP(?:511|512|521)[);/ ]|SO-05F'
+    - regex: 'SGP(?:511|512|521)(?:[);/ ]|$)|SO-05F'
       model: 'Xperia Tablet Z2'
       device: 'tablet'
-    - regex: 'SGP(?:6[124]1|612)[);/ ]'
+    - regex: 'SGP(?:6[124]1|612)(?:[);/ ]|$)'
       model: 'Xperia Tablet Z3 Compact'
       device: 'tablet'
-    - regex: 'SGPT(?:12|121|122|123|13|131|132|133)[);/ ]'
+    - regex: 'SGPT(?:12|121|122|123|13|131|132|133)(?:[);/ ]|$)'
       model: 'Xperia Tablet S'
       device: 'tablet'
 
     # SONY: Bravia
-    - regex: '(?:BRAVIA )(2K GB ATV3|4K UR2|4K GB ATV3|4K GB|4K 2015|2015)[);/ ]'
+    - regex: '(?:BRAVIA )(2K GB ATV3|4K UR2|4K GB ATV3|4K GB|4K 2015|2015)(?:[);/ ]|$)'
       model: 'Bravia $1'
       device: 'tv'
 
@@ -4688,7 +4748,7 @@ Sony:
     - regex: '((?:WT|SO|ST|SK|MK)[0-9]+[a-z]*[0-9]*)(?: Build|\))'
       model: '$1'
       brand: 'Sony Ericsson'
-    - regex: '(MT[0-9]{2}[a-z]?)[);/ ]'
+    - regex: '(MT[0-9]{2}[a-z]?)(?:[);/ ]|$)'
       model: '$1'
       brand: 'Sony Ericsson'
     - regex: 'portalmmm/2.0 K([a-z0-9]+)'
@@ -4821,7 +4881,7 @@ eTouch:
 
 # Etuline
 Etuline:
-  regex: '(ETL-S(?:3520|4521|5042|5084|6022)|ETL-T(?:752G|882G|9[78]0))[/); ]'
+  regex: '(ETL-S(?:3520|4521|5042|5084|6022)|ETL-T(?:752G|882G|9[78]0))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '(ETL-S(?:[^/); ]+))'
@@ -4884,7 +4944,7 @@ Explay:
   models:
     - regex: 'ActiveD[ _]7.4[ _]3G'
       model: 'ActiveD 7.4 3G'
-    - regex: 'Imperium([78])[;/) ]'
+    - regex: 'Imperium([78])(?:[);/ ]|$)'
       model: 'Imperium $1 3G'
     - regex: 'ActiveD[ _]8.2[ _]3G'
       model: 'ActiveD 8.2 3G'
@@ -4900,14 +4960,14 @@ Explay:
       model: 'sQuad $1'
     - regex: 'Onliner([1-3])'
       model: 'Onliner $1'
-    - regex: 'Atlant[;/) ]'
+    - regex: 'Atlant(?:[);/ ]|$)'
       device: 'smartphone'
       model: 'Atlant'
     - regex: 'Explay[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'Explay[ _-]([^;/]+)[;/)]'
+    - regex: 'Explay[ _-]([^;/]+)(?:[;/)]|$)'
       model: '$1'
-    - regex: '(RioPlay)[;/) ]'
+    - regex: '(RioPlay)(?:[);/ ]|$)'
       device: 'smartphone'
       model: 'Rio Play'
     - regex: 'Leader'
@@ -4931,7 +4991,7 @@ EKO:
   models:
     - regex: 'EKO[ _-]?([^;/)]+) Build'
       model: '$1'
-    - regex: 'EKO[ _-]?([^;/)]+)[);/ ]'
+    - regex: 'EKO[ _-]?([^;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Extrem
@@ -4989,7 +5049,7 @@ Fondi:
 
 # Fairphone
 Fairphone:
-  regex: '(FP(?:1U?|2))[);/ ]'
+  regex: '(FP(?:1U?|2))(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
@@ -5041,90 +5101,96 @@ FNB:
 
 # Fujitsu
 Fujitsu:
-  regex: '(?:F-01[FHJKL]|F-02[EFGHLK]|F-03[DEFGH]|F-04[EGKJ]|F-05[DEFJ]|F-06E|F-07[DE]|F-08D|F-09[DE]|F-10D|F-41A|F-11D|F-12C|M532|FARTM933KZ|901FJ|arrowsM03)[);/ ]'
+  regex: '(?:F-01[FHJKL]|F-02[EFGHLK]|F-03[DEFGH]|F-04[EGKJ]|F-05[DEFJ]|F-06E|F-07[DE]|F-08D|F-09[DE]|F-10D|F-[45]1A|F-11D|F-12C|M532|FARTM933KZ|901FJ|arrows(?:M03|M04-PREMIUM)|801FJ)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'F-01F[);/ ]'
+    - regex: 'F-51A(?:[);/ ]|$)'
+      model: 'Arrows 5G F-51A'
+    - regex: 'F-01F(?:[);/ ]|$)'
       model: 'Arrows NX F-01F'
-    - regex: 'F-01L[);/ ]'
+    - regex: 'F-01L(?:[);/ ]|$)'
       model: 'Easy Phone F-01L'
-    - regex: 'F-01J[);/ ]'
+    - regex: 'F-01J(?:[);/ ]|$)'
       model: 'Arrows NX F-01J'
-    - regex: 'F-01K[);/ ]'
+    - regex: 'F-01K(?:[);/ ]|$)'
       model: 'Arrows NX F-01K'
-    - regex: 'F-01H[);/ ]'
+    - regex: 'F-01H(?:[);/ ]|$)'
       model: 'Arrows Fit F-01H'
-    - regex: 'F-02E[);/ ]'
+    - regex: 'F-02E(?:[);/ ]|$)'
       model: 'Arrows X F-02E'
-    - regex: 'F-02G[);/ ]'
+    - regex: 'F-02G(?:[);/ ]|$)'
       model: 'Arrows NX F-02G'
-    - regex: 'F-02H[);/ ]'
+    - regex: 'F-02H(?:[);/ ]|$)'
       model: 'Arrows NX F-02H'
-    - regex: 'F-03D[);/ ]'
+    - regex: 'F-03D(?:[);/ ]|$)'
       model: 'Arrows Kiss F-03D'
-    - regex: 'F-03E[);/ ]'
+    - regex: 'F-03E(?:[);/ ]|$)'
       model: 'Arrows Kiss F-03E'
-    - regex: 'F-03F[);/ ]'
+    - regex: 'F-03F(?:[);/ ]|$)'
       model: 'Disney Mobile F-03F'
-    - regex: 'F-03H[);/ ]'
+    - regex: 'F-03H(?:[);/ ]|$)'
       model: 'Arrows SV F-03H'
-    - regex: '901FJ[);/ ]'
+    - regex: '901FJ(?:[);/ ]|$)'
       model: 'Arrows J 901FJ'
-    - regex: 'F-04E[);/ ]'
+    - regex: 'F-04E(?:[);/ ]|$)'
       model: 'Arrows V F-04E'
-    - regex: 'F-04G[);/ ]'
+    - regex: 'F-04G(?:[);/ ]|$)'
       model: 'Arrows NX F-04G'
-    - regex: 'F-05D[);/ ]'
+    - regex: 'F-05D(?:[);/ ]|$)'
       model: 'Arrows X LTE F-05D'
-    - regex: 'F-05F[);/ ]'
+    - regex: 'F-05F(?:[);/ ]|$)'
       model: 'Arrows NX F-05F'
-    - regex: 'F-05J[);/ ]'
+    - regex: 'F-05J(?:[);/ ]|$)'
       model: 'Arrows Be F-05J'
-    - regex: 'F-04K[);/ ]'
+    - regex: 'F-04K(?:[);/ ]|$)'
       model: 'Arrows Be F-04K'
-    - regex: 'F-02L[);/ ]'
+    - regex: 'F-02L(?:[);/ ]|$)'
       model: 'Arrows Be 3 F-02L'
-    - regex: 'F-41A[);/ ]'
+    - regex: 'F-41A(?:[);/ ]|$)'
       model: 'Arrows Be 4 F-41A'
-    - regex: 'F-06E[);/ ]'
+    - regex: 'F-06E(?:[);/ ]|$)'
       model: 'Arrows NX F-06E'
-    - regex: 'F-07D[);/ ]'
+    - regex: 'F-07D(?:[);/ ]|$)'
       model: 'Arrows μ F-07D'
-    - regex: 'F-07E[);/ ]'
+    - regex: '801FJ(?:[);/ ]|$)'
+      model: 'Arrows U 801FJ'
+    - regex: 'F-07E(?:[);/ ]|$)'
       model: 'Disney Mobile F-07E'
-    - regex: 'F-08D[);/ ]'
+    - regex: 'F-08D(?:[);/ ]|$)'
       model: 'Disney Mobile F-08D'
-    - regex: 'F-09D[);/ ]'
+    - regex: 'F-09D(?:[);/ ]|$)'
       model: 'ANTEPRIMA F-09D'
-    - regex: 'F-09E[);/ ]'
+    - regex: 'F-09E(?:[);/ ]|$)'
       model: 'Raku-Raku Smartphone Premium F-09E'
-    - regex: 'F-10D[);/ ]'
+    - regex: 'F-10D(?:[);/ ]|$)'
       model: 'Arrows X F-10D'
-    - regex: 'F-11D[);/ ]'
+    - regex: 'F-11D(?:[);/ ]|$)'
       model: 'Arrows Me F-11D'
-    - regex: 'F-12C[);/ ]'
+    - regex: 'F-12C(?:[);/ ]|$)'
       model: 'F-12C'
-    - regex: 'F-04J[);/ ]'
+    - regex: 'F-04J(?:[);/ ]|$)'
       model: 'F-04J'
-    - regex: 'arrowsM03[);/ ]'
+    - regex: 'arrowsM03(?:[);/ ]|$)'
       model: 'Arrows M03'
+    - regex: 'arrowsM04-PREMIUM(?:[);/ ]|$)'
+      model: 'Arrows M04 Premium'
 
-    - regex: 'F-02F[);/ ]'
+    - regex: 'F-02F(?:[);/ ]|$)'
       model: 'Arrows Tab F-02F'
       device: 'tablet'
-    - regex: 'F-02K[);/ ]'
+    - regex: 'F-02K(?:[);/ ]|$)'
       model: 'Arrows Tab F-02K'
       device: 'tablet'
-    - regex: 'F-03G[);/ ]'
+    - regex: 'F-03G(?:[);/ ]|$)'
       model: 'Arrows Tab F-03G'
       device: 'tablet'
-    - regex: 'F-05E[);/ ]'
+    - regex: 'F-05E(?:[);/ ]|$)'
       model: 'Arrows Tab F-05E'
       device: 'tablet'
     - regex: 'FARTM933KZ'
       model: 'Arrows Tab M504/HA4'
       device: 'tablet'
-    - regex: 'M532[);/ ]'
+    - regex: 'M532(?:[);/ ]|$)'
       model: 'Stylistic'
       device: 'tablet'
 
@@ -5197,20 +5263,32 @@ Gigabyte:
 
 # Gigaset
 Gigaset:
-  regex: 'Gigaset'
+  regex: 'Gigaset|(?:GS5[357]-6|GS[23]70(?:_Plus)?)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Gigaset QV(1030|830)'
       model: 'Gigaset QV$1'
       device: 'tablet'
+
+    - regex: 'G(S[23]70)[_ ]Plus(?:[);/ ]|$)'
+      model: 'G$1 Plus'
+    - regex: 'GS([23]70)(?:[);/ ]|$)'
+      model: 'GS$1'
+    - regex: 'GS57-6'
+      model: 'ME Pro'
+    - regex: 'GS55-6'
+      model: 'ME'
+    - regex: 'GS53-6'
+      model: 'ME Pure'
+
     - regex: 'Gigaset ([^;/]+) Build'
       model: '$1'
-    - regex: 'Gigaset ([^;/)]+)[);/ ]'
+    - regex: 'Gigaset ([^;/)]+)(?:[);/]|$)'
       model: '$1'
 
 # Ginzzu
 Ginzzu:
-  regex: 'GINZZU[_ ]|((?:RS(?:7[14]|81|9[67])D)|S50[45]0|S5120|RS(6[12]|9[45])D|S40[23]0|RS8502|RS9602)[);/ ]'
+  regex: 'GINZZU[_ ]|((?:RS(?:7[14]|81|9[67])D)|S50[45]0|S5120|RS(6[12]|9[45])D|S40[23]0|RS850[12]|RS9602)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'GINZZU[_ ]?(S40[17]0|S4710|ST6040|ST6120)'
@@ -5220,30 +5298,30 @@ Ginzzu:
       device: 'tablet'
     - regex: '(RS6[12]D) ULTIMATE'
       model: '$1 Ultimate'
-    - regex: '(?:GINZZU[ _])?((?:RS(?:7[14]|81|9[4-7])D)|S50[45]0|S5120|S40[23]0|RS8502|RS9602|RS94D)[);/ ]'
+    - regex: '(?:GINZZU[ _])?((?:RS(?:7[14]|81|9[4-7])D)|S50[45]0|S5120|S40[23]0|RS850[12]|RS9602|RS94D)(?:[);/ ]|$)'
       model: '$1'
 
 # Gionee
 Gionee:
-  regex: '(?:GIO-)?GIONEE[ _-]?[a-z0-9]+|(?:Dream_D1|V188S?|GN[0-9]{3,4}[a-z]?)[);/ ]|F103(?: Pro)? Build|P5 mini Build|P7 Max Build|(M7 Power|F106L|F100A)[);/ ]'
+  regex: '(?:GIO-)?GIONEE[ _-]?[a-z0-9]+|(?:Dream_D1|V188S?|GN[0-9]{3,4}[a-z]?)(?:[);/ ]|$)|F103(?: Pro)? Build|P5 mini Build|P7 Max Build|(M7 Power|F106L|F100A|F103S)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'GN810[);/ ]'
+    - regex: 'GN810(?:[);/ ]|$)'
       model: 'GN810'
       device: 'phablet'
-    - regex: 'GN([0-9]{3,4}[a-z]?)[);/ ]'
+    - regex: 'GN([0-9]{3,4}[a-z]?)(?:[);/ ]|$)'
       model: 'GN$1'
-    - regex: '(F106L|F100A|V188S|V188)[);/ ]'
+    - regex: '(F106L|F100A|V188S|V188|F103S)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'F103( Pro)? Build'
       model: 'F103$1'
-    - regex: 'M7 Power[);/ ]'
+    - regex: 'M7 Power(?:[);/ ]|$)'
       model: 'M7 Power'
     - regex: 'P5 mini Build'
       model: 'P5 mini'
     - regex: 'P7 Max Build'
       model: 'P7 Max'
-    - regex: '(?:(?:GIO-)?GIONEE[ _-])?Dream_D1[);/ ]'
+    - regex: '(?:(?:GIO-)?GIONEE[ _-])?Dream_D1(?:[);/ ]|$)'
       model: 'Dream D1'
     - regex: '(?:GIO-)?GIONEE[ _-]([a-z0-9_-]+).*Android'
       model: '$1'
@@ -5299,10 +5377,10 @@ GOCLEVER:
       device: 'tablet'
     - regex: '([^;/)]+) Build/GOCLEVER'
       model: '$1'
-    - regex: 'GOCLEVER[ _-]?TAB[ _-]([^;/)]+)[;/)]'
+    - regex: 'GOCLEVER[ _-]?TAB[ _-]([^;/)]+)(?:[;/)]|$)'
       model: 'TAB $1'
       device: 'tablet'
-    - regex: 'GOCLEVER[ _-]?([^;/)]+)[;/)]'
+    - regex: 'GOCLEVER[ _-]?([^;/)]+)(?:[;/)]|$)'
       model: '$1'
     - regex: 'LIBRA[ _]97'
       model: 'Libra 97'
@@ -5325,7 +5403,7 @@ Goly:
   models:
     - regex: 'Goly[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'Goly[ _-]([^;/)]+)[;/)]'
+    - regex: 'Goly[ _-]([^;/)]+)(?:[;/)]|$)'
       model: '$1'
 
 # Google
@@ -5418,11 +5496,13 @@ Hafury:
 
 # Haier
 Haier:
-  regex: 'Haier|I6_Infinity|Titan[ _]T[13]|(?:HW-)?W(?:716|757|860|970)[);/ ]|(?:HM-)?(N505|N700|G(?:152|303|353|552|70[01])?-FL|HM-N501-FL|G(?:303)?-W|I(?:557)?-FL)|(?:PAD[ _](D71|G781|d85))'
+  regex: 'Haier|I6_Infinity|Titan[ _]T[13]|(?:HW-)?W(?:716|757|860|970)(?:[);/ ]|$)|S5 Silk|(?:HM-)?(N505|N700|G(?:152|303|353|552|70[01])?-FL|HM-N501-FL|G(?:303)?-W|I(?:557)?-FL)|(?:PAD[ _](D71|G781|d85))'
   device: 'smartphone'
   models:
     - regex: 'HM-N505-FL'
       model: 'I8'
+    - regex: 'S5 Silk'
+      model: 'S5 Silk'
     - regex: 'HM-N700-FL'
       model: 'L7'
     - regex: 'HM-N501-FL'
@@ -5431,7 +5511,7 @@ Haier:
       model: '$1'
     - regex: '(Titan[_ ]T[13]|I6_Infinity)'
       model: '$1'
-    - regex: '(?:HW-)?W(716|757|860|970)[);/ ]'
+    - regex: '(?:HW-)?W(716|757|860|970)(?:[);/ ]|$)'
       model: 'W$1'
     - regex: 'PAD[ -_](D71|G781|d85)'
       device: 'tablet'
@@ -5473,12 +5553,12 @@ Hasee:
   models:
     - regex: 'Hasee ([^;/]+) Build'
       model: '$1'
-    - regex: 'Hasee ([^;/)]+)[);/ ]'
+    - regex: 'Hasee ([^;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Hisense
 Hisense:
-  regex: '(?:HS-)?Hisense ([^;/]+) Build|Hisense [^);/]+|HS-(?:G|U|EG?|I|L|T|X)[0-9]+[a-z0-9\-]*|E270BSA|HITV300C|M470BS[AE]|E2281|EG680|I46D1G|HAT4KDTV|HLTE([237]00T|200M|21[237]T|22[13]E|310M|510T)'
+  regex: '(?:HS-)?Hisense ([^;/]+) Build|Hisense [^);/]+|HS-(?:G|U|EG?|I|L|T|X)[0-9]+[a-z0-9\-]*|E270BSA|HITV300C|M470BS[AE]|E2281|EG680|I46D1G|HAT4KDTV|HLTE([237]00T|200M|203T|202N|21[023567]T|22[67]T|22[13]E|310[TM]|31[16]T|500T|501N|510[TM]|7[23]0T)'
   device: 'smartphone'
   models:
     # explicit tablet models
@@ -5491,34 +5571,61 @@ Hisense:
     - regex: 'E2281'
       device: 'tablet'
       model: 'Sero 8'
+    - regex: 'HLTE202N'
+      model: 'A5'
+    - regex: 'HLTE203T'
+      model: 'A5 Pro CC'
     - regex: 'HLTE700T'
       model: 'A6'
+    - regex: 'HLTE730T'
+      model: 'A6L'
     - regex: 'HLTE221E'
       model: 'E Max'
+    - regex: 'HLTE501N'
+      model: 'V Plus'
     - regex: 'HLTE223E'
       model: 'H30'
     - regex: 'I46D1G'
       model: 'Smartfren Andromax R'
     - regex: 'EG680'
       model: 'Smartfren Andromax Z'
-    - regex: 'HLTE200T[);/ ]'
+    - regex: 'HLTE200T(?:[);/ ]|$)'
       model: 'F26'
-    - regex: 'HLTE213T[);/ ]'
+    - regex: 'HLTE210T(?:[);/ ]|$)'
+      model: 'F28'
+    - regex: 'HLTE215T(?:[);/ ]|$)'
+      model: 'F29'
+    - regex: 'HLTE213T(?:[);/ ]|$)'
       model: 'King Kong 4'
-    - regex: 'HLTE217T[);/ ]'
+    - regex: 'HLTE311T(?:[);/ ]|$)'
+      model: 'King Kong 4 Pro'
+    - regex: 'HLTE216T(?:[);/ ]|$)'
+      model: 'King Kong 5'
+    - regex: 'HLTE316T(?:[);/ ]|$)'
+      model: 'King Kong 5 Pro'
+    - regex: 'HLTE226T(?:[);/ ]|$)'
+      model: 'King Kong 6'
+    - regex: 'HLTE217T(?:[);/ ]|$)'
       model: 'F30S'
-    - regex: 'HLTE310M[);/ ]'
+    - regex: 'HLTE227T(?:[);/ ]|$)'
+      model: 'F40'
+    - regex: 'HLTE310[TM](?:[);/ ]|$)'
       model: 'H18'
-    - regex: 'HLTE510T[);/ ]'
+    - regex: 'HLTE510[TM](?:[);/ ]|$)'
       model: 'H20'
-    - regex: '(HLTE300T|HLTE200M|HLTE212T)[);/ ]'
+    - regex: 'HLTE500T(?:[);/ ]|$)'
+      model: 'H11'
+    - regex: 'HLTE720T(?:[);/ ]|$)'
+      model: 'U30'
+      device: 'phablet'
+    - regex: '(HLTE300T|HLTE200M|HLTE212T)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'HITV300C[);/ ]'
+    - regex: 'HITV300C(?:[);/ ]|$)'
       model: 'E9'
     - regex: '(HS-(?:G|U|EG?|I|L|T|X)[0-9]+[a-z0-9\-]*)'
       model: '$1'
 
-    - regex: '(HAT4KDTV)[);/ ]'
+    - regex: '(HAT4KDTV)(?:[);/ ]|$)'
       device: 'tv'
       model: '$1'
 
@@ -5535,7 +5642,7 @@ Hi-Level:
 
 # Hoffmann
 Hoffmann:
-  regex: '(HOFFMANN|Neo[_ ]A[1379]00)[);/ ]'
+  regex: '(HOFFMANN|Neo[_ ]A[1379]00)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Neo[_ ](A[1379]00)'
@@ -5546,10 +5653,10 @@ Hoffmann:
 
 # Homtom
 Homtom:
-  regex: 'Homtom|(?:HT[0-9]{1,2})(?: ?Pro)?[);/ ]'
+  regex: 'Homtom|(?:HT[0-9]{1,2})(?: ?Pro)?(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(?:Homtom[_ ])?HT([0-9]{1,2}(?: ?Pro)?)[);/ ]'
+    - regex: '(?:Homtom[_ ])?HT([0-9]{1,2}(?: ?Pro)?)(?:[);/ ]|$)'
       model: 'HT$1'
     - regex: 'Homtom ([^;/]+) Build'
       model: '$1'
@@ -5560,639 +5667,656 @@ Hosin:
   models:
     - regex: 'HOSIN[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'HOSIN[ _-]([^;/]+)[;/)]'
+    - regex: 'HOSIN[ _-]([^;/]+)(?:[;/)]|$)'
       model: '$1'
 
 # Hoozo
 Hoozo:
-  regex: 'HOOZO[_ ](MT232|MT116|MT Pad 116 LTE|X1001)[);/ ]'
+  regex: 'HOOZO[_ ](MT232|MT116|MT Pad 116 LTE|X1001)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Minix (minix.us)
 Minix:
-  regex: 'NEO-(?:X8-H|U9-H|X[57]-mini|X8H-PLUS|X88-?I|X7-216A|X5-116A|X[68]|U1|Z64)[);/ ]'
+  regex: 'NEO-(?:X8-H|U9-H|X[57]-mini|X8H-PLUS|X88-?I|X7-216A|X5-116A|X[68]|U1|Z64)(?:[);/ ]|$)'
   device: 'tv'
   models:
-    - regex: 'NEO-X8-H[);/ ]'
+    - regex: 'NEO-X8-H(?:[);/ ]|$)'
       model: 'NEO X8H'
-    - regex: 'NEO-X([57])-mini[);/ ]'
+    - regex: 'NEO-X([57])-mini(?:[);/ ]|$)'
       model: 'NEO X$1 Mini'
-    - regex: 'NEO-X8H-PLUS[);/ ]'
+    - regex: 'NEO-X8H-PLUS(?:[);/ ]|$)'
       model: 'NEO X8H Plus'
-    - regex: 'NEO-X88-?I[);/ ]'
+    - regex: 'NEO-X88-?I(?:[);/ ]|$)'
       model: 'NEO X88i'
-    - regex: 'NEO-X7-216A[);/ ]'
+    - regex: 'NEO-X7-216A(?:[);/ ]|$)'
       model: 'NEO X7'
-    - regex: 'NEO-X5-116A[);/ ]'
+    - regex: 'NEO-X5-116A(?:[);/ ]|$)'
       model: 'NEO X5'
-    - regex: 'NEO-X([68])[);/ ]'
+    - regex: 'NEO-X([68])(?:[);/ ]|$)'
       model: 'NEO X$1'
-    - regex: 'NEO-U1[);/ ]'
+    - regex: 'NEO-U1(?:[);/ ]|$)'
       model: 'NEO U1'
-    - regex: 'NEO-Z64[);/ ]'
+    - regex: 'NEO-Z64(?:[);/ ]|$)'
       model: 'NEO Z64'
-    - regex: 'NEO-U9-H[);/ ]'
+    - regex: 'NEO-U9-H(?:[);/ ]|$)'
       model: 'NEO U9H'
 
 # Huawei
 Huawei:
-  regex: '(HW-)?(?:Huawei|MediaPad T1|Ideos|Honor[ _]?|(?:(?:AGS|AGS2|ALE|ALP|AMN|ANE|ARE|ARS|ASK|ATH|ATU|AUM|BAC|BAH[23]?|BG2|BGO|B[ZK]K|BKL|BL[ALN]|BND|BTV|CA[GMNZ]|CH[CM]|CHE[12]?|CLT|CMR|COL|COR|CPN|CRO|CRR|CUN|DIG|DLI|DRA|DUA|DUB|DUK|EDI|ELE|EML|EVA|EVR|FDR|FIG|FLA|FRD|GEM|GRA|HDN|HLK|HMA|Hol|HRY|HWI|H[36]0|INE|JAT|JDN|JDN2|JKM|JMM|JSN|KII|KIW|KNT|KOB|KSA|LDN|LEO|LIO|LLD|LND|LON|LRA|LUA|LY[AO]|MAR|MHA|MRD|MYA|NCE|NEM|NEO|NXT|PAR|PCT|PIC|PLE|PLK|POT|PRA|RIO|RNE|RVL|SCC|SCL|SCM|SEA|SHT|SLA|SNE|SPN|STF|STK|TAG|TIT|TNY|TRT|VCE|VEN|VIE|VKY|VNS|VOG|VRD|VTR|WAS|YAL|G(?:527|620S|621|630|735)|Y(?:221|330|550|6[23]5))-(?:[A-Z]{0,2}[0-9]{1,4}[A-Z]{0,3}?)|H1711|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))[);/ ])|hi6210sft|PE-(UL00|TL[12]0|TL00M)|T1-(A21[Lw]|A23L|701u|823L)|G7-(?:L01|TL00)|HW-01K|JNY-(LX[12]|AL10)|OXF-AN[01]0|TAS-(A[LN]00|L29|TL00)|WLZ-(AL10|AN00)|NIC-LX1A|MRX-(AL09|W09)|CDY-([AT]N00|AN90)|GLK-[AT]L00|JER-[AT]N10|ELS-(?:[AT]N00|NX9)|AKA-(AL10|L29)|MON-(W|AL)19|BMH-AN[12]0|AQM-([AT]L[01]0|LX1)|MOA-(AL00|LX9N)|NTS-AL00|ART-[AT]L00[xm]|JEF-[AT]N00|MED-(?:[AT]L00|LX9N)|EBG-AN[01]0|ANA-[AT]N00|BZ[AK]-W00|BZT-(W09|AL[01]0)|HDL-(AL09|W09)|HWV3[123]|HW-02L|TEL-AN00a?|TAH-AN00m|C8817D|T1-821W|d-01J|d-02[HK]|HWT31|Y320-U10|Y541-U02|VAT-L19|605HW'
+  regex: '(HW-)?(?:Huawei|MediaPad T1|Ideos|Honor[ _]?|(?:(?:AGS|AGS2|ALE|ALP|AMN|ANE|ARE|ARS|ASK|ATH|ATU|AUM|BAC|BAH[23]?|BG2|BGO|B[ZK]K|BKL|BL[ALN]|BND|BTV|CA[GMNZ]|CH[CM]|CHE[12]?|CLT|CMR|COL|COR|CPN|CRO|CRR|CUN|DIG|DLI|DRA|DUA|DUB|DUK|EDI|ELE|EML|EVA|EVR|FDR|FIG|FLA|FRD|GEM|GRA|HDN|HLK|HMA|Hol|HRY|HWI|H[36]0|INE|JAT|JDN|JDN2|JKM|JMM|JSN|KII|KIW|KNT|KOB|KSA|LDN|LEO|LIO|LLD|LND|LON|LRA|LUA|LY[AO]|MAR|MHA|MRD|MYA|NCE|NEM|NEO|NXT|PAR|PCT|PIC|PLE|PLK|POT|PRA|RIO|RNE|RVL|SCC|SCL|SCM|SEA|SHT|SLA|SNE|SPN|STF|STK|TAG|TIT|TNY|TRT|VCE|VEN|VIE|VKY|VNS|VOG|VRD|VTR|WAS|YAL|G(?:527|620S|621|630|735)|Y(?:221|330|550|6[23]5))-(?:[A-Z]{0,2}[0-9]{1,4}[A-Z]{0,3}?)|H1711|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))(?:[);/ ]|$))|hi6210sft|PE-(UL00|TL[12]0|TL00M)|T1-(A21[Lw]|A23L|701u|823L)|G7-(?:L01|TL00)|HW-01K|JNY-(LX[12]|AL10)|OXF-AN[01]0|TAS-(A[LN]00|L29|TL00)|WLZ-(AL10|AN00)|NIC-LX1A|MRX-(AL09|W09)|CDY-([AT]N00|AN90)|GLK-[AT]L00|JER-[AT]N10|ELS-(?:[AT]N[10]0|NX9|N39|N04)|AKA-(AL10|L29)|MON-(W|AL)19|BMH-AN[12]0|AQM-([AT]L[01]0|LX1)|MOA-(AL00|LX9N)|NTS-AL00|ART-(?:[AT]L00[xm]|L29N?)|JEF-[AT]N00|MED-(?:[AT]L00|LX9N?)|EBG-AN[01]0|ANA-(?:[AT]N00|NX9)|BZ[AK]-W00|BZT-(W09|AL[01]0)|HDL-(AL09|W09)|HWV3[123]|HW-02L|TEL-[AT]N(?:00a?|10)|KKG-AN00|MXW-AN00|TAH-AN00m|C8817D|T1-821W|d-01J|d-02[HK]|HWT31|Y320-U10|Y541-U02|VAT-L19|70[14]HW|60[58]HW|TNNH-AN00|LIO-(?:[TA]L00|[LN]29|AN00)|KOB2-L09'
   device: 'smartphone'
   models:
-    - regex: 'POT-[TA]L00a[);/ ]'
+    - regex: 'POT-[TA]L00a(?:[);/ ]|$)'
       model: '9S'
-    - regex: 'U9500[);/ ]'
+    - regex: 'U9500(?:[);/ ]|$)'
       model: 'Ascend D1'
-    - regex: 'Z100-UL00[);/ ]'
+    - regex: 'Z100-UL00(?:[);/ ]|$)'
       model: 'Ascend D3'
-    - regex: 'Y320-(?:U10|T00|U05)[);/ ]'
+    - regex: 'Y320-(?:U10|T00|U05)(?:[);/ ]|$)'
       model: 'Ascend Y320'
-    - regex: 'Y330-U05[);/ ]'
+    - regex: 'Y330-U05(?:[);/ ]|$)'
       model: 'Ascend Y330'
-    - regex: 'Y541-U02[);/ ]'
+    - regex: 'Y541-U02(?:[);/ ]|$)'
       model: 'Ascend Y5C'
-    - regex: 'U8818[);/ ]'
+    - regex: 'U8818(?:[);/ ]|$)'
       model: 'Ascend G300'
-    - regex: 'G527-U081[);/ ]'
+    - regex: 'G527-U081(?:[);/ ]|$)'
       model: 'Ascend G527'
-    - regex: '(G620S-L0[13]|C8817D)[);/ ]'
+    - regex: '(G620S-L0[13]|C8817D)(?:[);/ ]|$)'
       model: 'Ascend G620S'
-    - regex: 'G630-U251[);/ ]'
+    - regex: 'G630-U251(?:[);/ ]|$)'
       model: 'Ascend G630'
-    - regex: 'G7-(?:L01|TL00)[);/ ]'
+    - regex: 'G7-(?:L01|TL00)(?:[);/ ]|$)'
       model: 'Ascend G7'
-    - regex: 'G730-C00[);/ ]'
+    - regex: 'G730-C00(?:[);/ ]|$)'
       model: 'Ascend G730'
-    - regex: 'U9200[);/ ]'
+    - regex: 'U9200(?:[);/ ]|$)'
       model: 'Ascend P1'
-    - regex: 'H1711[);/ ]'
+    - regex: 'H1711(?:[);/ ]|$)'
       model: 'Ascend XT2'
-    - regex: 'Y221-U(?:[12]2|[0345]3)[);/ ]'
+    - regex: 'Y221-U(?:[12]2|[0345]3)(?:[);/ ]|$)'
       model: 'Ascend Y221'
-    - regex: 'Y550-L03[);/ ]'
+    - regex: 'Y550-L03(?:[);/ ]|$)'
       model: 'Ascend Y550'
-    - regex: 'ART-[AT]L00[xm][);/ ]'
+    - regex: 'ART-[AT]L00[xm](?:[);/ ]|$)'
       model: 'Enjoy 10'
-    - regex: 'STK-[AT]L00[);/ ]'
+    - regex: 'STK-[AT]L00(?:[);/ ]|$)'
       model: 'Enjoy 10 Plus'
-    - regex: 'MED-[AT]L00[);/ ]'
+    - regex: 'MED-[AT]L00(?:[);/ ]|$)'
       model: 'Enjoy 10E'
-    - regex: 'AQM-[AT]L00[);/ ]'
+    - regex: 'AQM-[AT]L00(?:[);/ ]|$)'
       model: 'Enjoy 10S'
-    - regex: 'TAG-[ACT]L00[);/ ]'
+    - regex: 'TAG-[ACT]L00(?:[);/ ]|$)'
       model: 'Enjoy 5S'
-    - regex: 'NCE-(AL[10]0|TL10)[);/ ]'
+    - regex: 'NCE-(AL[10]0|TL10)(?:[);/ ]|$)'
       model: 'Enjoy 6'
-    - regex: 'DIG-(?:TL10|AL00)[);/ ]'
+    - regex: 'DIG-(?:TL10|AL00)(?:[);/ ]|$)'
       model: 'Enjoy 6S'
-    - regex: 'SLA-(?:AL00|TL10)[);/ ]'
+    - regex: 'SLA-(?:AL00|TL10)(?:[);/ ]|$)'
       model: 'Enjoy 7'
-    - regex: 'FIG-(?:[AT]L[10]0)[);/ ]'
+    - regex: 'FIG-(?:[AT]L[10]0)(?:[);/ ]|$)'
       model: 'Enjoy 7S'
-    - regex: 'TRT-AL00[A]?[);/ ]'
+    - regex: 'TRT-AL00[A]?(?:[);/ ]|$)'
       model: 'Enjoy 7 Plus'
-    - regex: 'LDN-(?:AL[12]0|TL[02]0)[);/ ]'
+    - regex: 'LDN-(?:AL[12]0|TL[02]0)(?:[);/ ]|$)'
       model: 'Enjoy 8'
-    - regex: 'FLA-AL10[);/ ]'
+    - regex: 'FLA-AL10(?:[);/ ]|$)'
       model: 'Enjoy 8 Plus'
-    - regex: 'ATU-[AT]L10[);/ ]'
+    - regex: 'ATU-[AT]L10(?:[);/ ]|$)'
       model: 'Enjoy 8e'
-    - regex: 'MRD-[TA]L00[);/ ]'
+    - regex: 'MRD-[TA]L00(?:[);/ ]|$)'
       model: 'Enjoy 9e'
-    - regex: 'U8665[);/ ]'
+    - regex: 'U8665(?:[);/ ]|$)'
       model: 'Fusion 2'
-    - regex: 'MED-LX9N[);/ ]'
+    - regex: 'MED-LX9N?(?:[);/ ]|$)'
       model: 'Y6p'
-    - regex: 'G735-L(?:03|12|23)[);/ ]'
+    - regex: 'G735-L(?:03|12|23)(?:[);/ ]|$)'
       model: 'G Play'
-    - regex: 'CHC-U(?:0[13]|23)[);/ ]'
+    - regex: 'CHC-U(?:0[13]|23)(?:[);/ ]|$)'
       model: 'G Play Mini'
-    - regex: '(?:Honor_|HW-)?G621-TL00M?[);/ ]'
+    - regex: '(?:Honor_|HW-)?G621-TL00M?(?:[);/ ]|$)'
       model: 'G621'
-    - regex: 'DIG-L2[12][);/ ]'
+    - regex: 'DIG-L2[12](?:[);/ ]|$)'
       model: 'GR3 (2017)'
-    - regex: 'KII-L21[);/ ]'
+    - regex: 'KII-L21(?:[);/ ]|$)'
       model: 'GR5'
-    - regex: 'BLL-L2[12][);/ ]'
+    - regex: 'BLL-L2[12](?:[);/ ]|$)'
       model: 'GR5 (2017)'
-    - regex: 'RIO-L03[);/ ]'
+    - regex: 'RIO-L03(?:[);/ ]|$)'
       model: 'GX8'
-    - regex: 'U8860[);/ ]'
+    - regex: 'U8860(?:[);/ ]|$)'
       model: 'Honor'
-    - regex: 'COL-(?:AL[01]0|TL[01]0|L29)[);/ ]'
+    - regex: 'COL-(?:AL[01]0|TL[01]0|L29)(?:[);/ ]|$)'
       model: 'Honor 10'
-    - regex: 'HRY-(?:[AT]L00[A]?|LX[12]|LX1MEB)[);/ ]'
+    - regex: 'HRY-(?:[AT]L00[A]?|LX[12]|LX1MEB)(?:[);/ ]|$)'
       model: 'Honor 10 Lite'
-    - regex: 'HRY-LX1T[);/ ]'
+    - regex: 'HRY-LX1T(?:[);/ ]|$)'
       model: 'Honor 10I'
-    - regex: 'U9508[);/ ]'
+    - regex: 'U9508(?:[);/ ]|$)'
       model: 'Honor 2'
-    - regex: 'YAL-(?:L21|[AT]L00)[);/ ]'
+    - regex: 'YAL-(?:L21|[AT]L00)(?:[);/ ]|$)'
       model: 'Honor 20'
-    - regex: 'LRA-AL00[);/ ]'
+    - regex: 'LRA-AL00(?:[);/ ]|$)'
       model: 'Honor 20 Lite'
-    - regex: '(HRY-AL00T[a]?)[);/ ]'
+    - regex: '(HRY-AL00T[a]?)(?:[);/ ]|$)'
       model: 'Honor 20I'
-    - regex: 'YAL-(L41|AL10)[);/ ]'
+    - regex: 'YAL-(L41|AL10)(?:[);/ ]|$)'
       model: 'Honor 20 Pro'
-    - regex: '(MAR-LX1H|YAL-AL50)[);/ ]'
+    - regex: '(MAR-LX1H|YAL-AL50)(?:[);/ ]|$)'
       model: 'Honor 20S'
-    - regex: 'BMH-AN[12]0[);/ ]'
+    - regex: '(?:BMH-AN[12]0|MXW-AN00)(?:[);/ ]|$)'
       model: 'Honor 30'
-    - regex: 'EBG-AN00[);/ ]'
+    - regex: 'EBG-AN00(?:[);/ ]|$)'
       model: 'Honor 30 Pro'
-    - regex: 'EBG-AN10[);/ ]'
+    - regex: 'EBG-AN10(?:[);/ ]|$)'
       model: 'Honor 30 Pro Plus'
-    - regex: 'CDY-AN90[);/ ]'
+    - regex: 'CDY-AN90(?:[);/ ]|$)'
       model: 'Honor 30S'
-    - regex: '(?:Honor_|HW-)?H30-(?:C00|L01M?|L02|U10|T00|T10)(?:_TD)?[);/ ]'
+    - regex: 'LRA-LX1(?:[);/ ]|$)'
+      model: 'Honor 30I'
+    - regex: '(?:Honor_|HW-)?H30-(?:C00|L01M?|L02|U10|T00|T10)(?:_TD)?(?:[);/ ]|$)'
       model: 'Honor 3C'
-    - regex: 'Hol-U19[);/ ]'
+    - regex: 'Hol-U19(?:[);/ ]|$)'
       model: 'Honor 3C Lite'
-    - regex: 'G750-T01[);/ ]'
+    - regex: 'G750-T01(?:[);/ ]|$)'
       model: 'Honor 3X'
-    - regex: '(?:Honor_|HW-)?SCL-(?:AL00|CL00|TL00H?)(?:_TD)?[);/ ]'
+    - regex: '(?:Honor_|HW-)?SCL-(?:AL00|CL00|TL00H?)(?:_TD)?(?:[);/ ]|$)'
       model: 'Honor 4A'
-    - regex: '(?:Honor_|HW-)?CHM-U01(?:_TD)?[);/ ]'
+    - regex: '(?:Honor_|HW-)?CHM-U01(?:_TD)?(?:[);/ ]|$)'
       model: 'Honor 4C'
-    - regex: 'AQM-AL10[);/ ]'
+    - regex: 'AQM-AL10(?:[);/ ]|$)'
       model: 'Honor 4T Pro'
-    - regex: '(CHE2?-[UT]L00[HM]?|CHE1-CL[12]0|CHE2-L(?:1[12]|23)|Che1-L04|CHE-TL00)[);/ ]'
+    - regex: '(CHE2?-[UT]L00[HM]?|CHE1-CL[12]0|CHE2-L(?:1[12]|23)|Che1-L04|CHE-TL00)(?:[);/ ]|$)'
       model: 'Honor 4X'
-    - regex: '(?:Honor_|HW-)?CUN-[AT]L00[);/ ]'
+    - regex: '(?:Honor_|HW-)?CUN-[AT]L00(?:[);/ ]|$)'
       model: 'Honor 5 Play'
-    - regex: '(?:Honor_|HW-)?CAM-(?:AL00|TL00H|TL00)(?:_TD)?[);/ ]'
+    - regex: '(?:Honor_|HW-)?CAM-(?:AL00|TL00H|TL00)(?:_TD)?(?:[);/ ]|$)'
       model: 'Honor 5A'
-    - regex: '(?:Honor_|HW-)?NEM-(?:AL10|L51|UL10|TL00)[);/ ]'
+    - regex: '(?:Honor_|HW-)?NEM-(?:AL10|L51|UL10|TL00)(?:[);/ ]|$)'
       model: 'Honor 5C'
-    - regex: '(?:Honor_|HW-)?NEM-(?:L22|TL00H)[);/ ]'
+    - regex: '(?:Honor_|HW-)?NEM-(?:L22|TL00H)(?:[);/ ]|$)'
       model: 'Honor 5C Dual SIM'
-    - regex: '(?:Honor_|HW-)?KIW-(?:AL10|TL00H|[TC]L00|L2[1-4]|UL00)(?:_TD)?[);/ ]'
+    - regex: '(?:Honor_|HW-)?KIW-(?:AL10|TL00H|[TC]L00|L2[1-4]|UL00)(?:_TD)?(?:[);/ ]|$)'
       model: 'Honor 5X'
-    - regex: '((?:Honor_|HW-)?H60-L(?:01|02|03|04|11|12)(?:_TD)?|HW-H60-J1)[);/ ]'
+    - regex: '((?:Honor_|HW-)?H60-L(?:01|02|03|04|11|12)(?:_TD)?|HW-H60-J1)(?:[);/ ]|$)'
       model: 'Honor 6'
-    - regex: 'MYA-TL10[);/ ]'
+    - regex: 'MYA-TL10(?:[);/ ]|$)'
       model: 'Honor 6 Play'
-    - regex: 'PE-(UL00|TL[12]0|TL00M)[);/ ]'
+    - regex: 'PE-(UL00|TL[12]0|TL00M)(?:[);/ ]|$)'
       model: 'Honor 6 Plus'
-    - regex: '(?:HONOR[ _]?)?DLI-(?:AL10|L[24]2|TL20)[);/ ]'
+    - regex: '(?:HONOR[ _]?)?DLI-(?:AL10|L[24]2|TL20)(?:[);/ ]|$)'
       model: 'Honor 6A'
-    - regex: 'DIG-L21HN[);/ ]'
+    - regex: 'DIG-L21HN(?:[);/ ]|$)'
       model: 'Honor 6C'
-    - regex: 'JMM-L22[);/ ]'
+    - regex: 'JMM-L22(?:[);/ ]|$)'
       model: 'Honor 6C Pro'
-    - regex: '(?:HONOR[ _]?)?BLN-(?:L2[124]|AL[1234]0|TL[01]0[);/ ])'
+    - regex: '(?:HONOR[ _]?)?BLN-(?:L2[124]|AL[1234]0|TL[01]0(?:[);/ ]|$))'
       model: 'Honor 6X'
-    - regex: '(?:Honor[_]?|HW-)?PLK-(?:AL10|CL00|TL00|TL01H?|UL00|L01)[);/ ]'
+    - regex: '(?:Honor[_]?|HW-)?PLK-(?:AL10|CL00|TL00|TL01H?|UL00|L01)(?:[);/ ]|$)'
       model: 'Honor 7'
-    - regex: '(?:Honor_|HW-)?NEM-L21[);/ ]'
+    - regex: '(?:Honor_|HW-)?NEM-L21(?:[);/ ]|$)'
       model: 'Honor 7 Lite'
-    - regex: 'AUM-(?:AL[20]0|L33[A]?|TL20)[);/ ]'
+    - regex: 'AUM-(?:AL[20]0|L33[A]?|TL20)(?:[);/ ]|$)'
       model: 'Honor 7A'
-    - regex: 'AUM-L29[);/ ]'
+    - regex: 'AUM-L29(?:[);/ ]|$)'
       model: 'Honor 7A Pro'
-    - regex: '(?:Honor_|HW-)?(?:LND-(?:AL[34]0|L29|TL40)|AUM-L41)[);/ ]'
+    - regex: '(?:Honor_|HW-)?(?:LND-(?:AL[34]0|L29|TL40)|AUM-L41)(?:[);/ ]|$)'
       model: 'Honor 7C'
-    - regex: 'ATH-(?:AL00|UL00|TL00H)[);/ ]'
+    - regex: 'ATH-(?:AL00|UL00|TL00H)(?:[);/ ]|$)'
       model: 'Honor 7i'
-    - regex: '(?:Honor_|HW-)?DUA-(?:L22|LX3)[);/ ]'
+    - regex: '(?:Honor_|HW-)?DUA-(?:L22|LX3)(?:[);/ ]|$)'
       model: 'Honor 7S'
-    - regex: '(?:HONOR[ _]?)?BND-(?:AL[01]0|TL10|L2[14]|L31)[);/ ]'
+    - regex: '(?:HONOR[ _]?)?BND-(?:AL[01]0|TL10|L2[14]|L31)(?:[);/ ]|$)'
       model: 'Honor 7X'
-    - regex: '(?:FRD-(?:AL[01]0|L0[249]|L1[49]|DL00)|VAT-L19)[);/ ]'
+    - regex: '(?:FRD-(?:AL[01]0|L0[249]|L1[49]|DL00)|VAT-L19)(?:[);/ ]|$)'
       model: 'Honor 8'
-    - regex: 'PRA-(?:AL00X|AL00|TL10)[);/ ]'
+    - regex: 'PRA-(?:AL00X|AL00|TL10)(?:[);/ ]|$)'
       model: 'Honor 8 Lite'
-    - regex: 'DUK-(?:L09|TL30)[);/ ]'
+    - regex: 'DUK-(?:L09|TL30)(?:[);/ ]|$)'
       model: 'Honor 8 Pro'
-    - regex: 'VEN-L22[);/ ]'
+    - regex: 'VEN-L22(?:[);/ ]|$)'
       model: 'Honor 8 Smart'
-    - regex: 'JAT-L(29|X[13])[);/ ]'
+    - regex: 'JAT-L(29|X[13])(?:[);/ ]|$)'
       model: 'Honor 8A'
-    - regex: 'JAT-L41[);/ ]'
+    - regex: 'JAT-L41(?:[);/ ]|$)'
       model: 'Honor 8A Pro'
-    - regex: 'BKK-(?:AL[10]0|L21|L22|LX2|TL00)[);/ ]'
+    - regex: 'BKK-(?:AL[10]0|L21|L22|LX2|TL00)(?:[);/ ]|$)'
       model: 'Honor 8C'
-    - regex: 'KSA-(LX[29]|AL00)[);/ ]'
+    - regex: 'KSA-(LX[29]|AL00)(?:[);/ ]|$)'
       model: 'Honor 8S'
-    - regex: 'JSN-L(?:2[123]|42)|JSN-[TA]L00[a]?[);/ ]'
+    - regex: 'JSN-L(?:2[123]|42)|JSN-[TA]L00[a]?(?:[);/ ]|$)'
       model: 'Honor 8X'
-    - regex: 'ARE-(?:AL[10]0|L22HN|TL00)[);/ ]'
+    - regex: 'ARE-(?:AL[10]0|L22HN|TL00)(?:[);/ ]|$)'
       model: 'Honor 8X Max'
-    - regex: 'STF-(?:AL[10]0|L09|TL10)[);/ ]'
+    - regex: 'STF-(?:AL[10]0|L09|TL10)(?:[);/ ]|$)'
       model: 'Honor 9'
-    - regex: 'MOA-LX9N[);/ ]'
+    - regex: 'MOA-LX9N(?:[);/ ]|$)'
       model: 'Honor 9A'
-    - regex: 'AKA-L29[);/ ]'
+    - regex: 'AKA-L29(?:[);/ ]|$)'
       model: 'Honor 9C'
-    - regex: 'LLD-(?:AL[01]0|L[23]1|TL10)[);/ ]'
+    - regex: 'LLD-(?:AL[01]0|L[23]1|TL10)(?:[);/ ]|$)'
       model: 'Honor 9 Lite'
-    - regex: 'LLD-AL[23]0[);/ ]'
+    - regex: 'LLD-AL[23]0(?:[);/ ]|$)'
       model: 'Honor 9i'
-    - regex: 'DUA-LX9[);/ ]'
+    - regex: 'DUA-LX9(?:[);/ ]|$)'
       model: 'Honor 9S'
-    - regex: 'HLK-AL00a?[);/ ]'
+    - regex: 'HLK-AL00a?(?:[);/ ]|$)'
       model: 'Honor 9X'
-    - regex: 'HLK-AL10[);/ ]'
+    - regex: 'HLK-AL10(?:[);/ ]|$)'
       model: 'Honor 9X Pro'
-    - regex: 'CAM-UL00[);/ ]'
+    - regex: 'CAM-UL00(?:[);/ ]|$)'
       model: 'Honor Holly 3'
-    - regex: 'NTS-AL00[);/ ]'
+    - regex: 'NTS-AL00(?:[);/ ]|$)'
       model: 'Honor Magic'
-    - regex: 'TNY-[AT]L00[);/ ]'
+    - regex: 'TNY-[AT]L00(?:[);/ ]|$)'
       model: 'Honor Magic 2'
-    - regex: 'RVL-AL09[);/ ]'
+    - regex: 'RVL-AL09(?:[);/ ]|$)'
       model: 'Honor Note 10'
-    - regex: 'EDI-AL10[);/ ]'
+    - regex: 'EDI-AL10(?:[);/ ]|$)'
       model: 'Honor Note 8'
-    - regex: 'VKY-TL00[);/ ]'
+    - regex: 'VKY-TL00(?:[);/ ]|$)'
       model: 'Honor P10 Plus'
-    - regex: 'VOG-AL00[);/ ]'
+    - regex: 'VOG-AL00(?:[);/ ]|$)'
       model: 'Honor P30 Pro'
-    - regex: 'ANA-[AT]N00[);/ ]'
+    - regex: 'ANA-(?:[AT]N00|NX9)(?:[);/ ]|$)'
       model: 'Honor P40'
-    - regex: 'COR-(?:AL[01]0|L29|TL10)[);/ ]'
+    - regex: 'COR-(?:AL[01]0|L29|TL10)(?:[);/ ]|$)'
       model: 'Honor Play'
-    - regex: 'ASK-AL00x[);/ ]'
+    - regex: 'ASK-AL00x(?:[);/ ]|$)'
       model: 'Honor Play 3'
-    - regex: 'KSA-AL10[);/ ]'
+    - regex: 'KSA-AL10(?:[);/ ]|$)'
       model: 'Honor Play 3E'
-    - regex: 'CHM-[CUT]L00[HM]?[);/ ]'
+    - regex: 'TNNH-AN00(?:[);/ ]|$)'
+      model: 'Honor Play 4'
+    - regex: 'CHM-[CUT]L00[HM]?(?:[);/ ]|$)'
       model: 'Honor Play 4C'
-    - regex: 'AKA-AL10[);/ ]'
+    - regex: 'AKA-AL10(?:[);/ ]|$)'
       model: 'Honor Play 4T'
-    - regex: 'DUA-[TA]L00[);/ ]'
+    - regex: 'DUA-[TA]L00(?:[);/ ]|$)'
       model: 'Honor Play 7'
-    - regex: 'JAT-[AT]L00[);/ ]'
+    - regex: 'JAT-[AT]L00(?:[);/ ]|$)'
       model: 'Honor Play 8A'
-    - regex: 'MOA-AL00[);/ ]'
+    - regex: 'MOA-AL00(?:[);/ ]|$)'
       model: 'Honor Play 9A'
-    - regex: 'BKL-(?:AL00|AL20|AL30|L09|TL10)[);/ ]'
+    - regex: 'BKL-(?:AL00|AL20|AL30|L09|TL10)(?:[);/ ]|$)'
       model: 'Honor V10'
-    - regex: 'PCT-[TA]L10[);/ ]'
+    - regex: 'PCT-[TA]L10(?:[);/ ]|$)'
       model: 'Honor V20'
-    - regex: 'KNT-(?:AL[12]0|[TU]L10)[);/ ]'
+    - regex: 'KNT-(?:AL[12]0|[TU]L10)(?:[);/ ]|$)'
       model: 'Honor V8'
-    - regex: 'DUK-AL20[);/ ]'
+    - regex: 'DUK-AL20(?:[);/ ]|$)'
       model: 'Honor V9'
-    - regex: 'JMM-[AT]L[01]0[);/ ]'
+    - regex: 'JMM-[AT]L[01]0(?:[);/ ]|$)'
       model: 'Honor V9 Play'
-    - regex: 'BKL-L04[);/ ]'
+    - regex: 'BKL-L04(?:[);/ ]|$)'
       model: 'Honor View 10'
-    - regex: 'PCT-L29[);/ ]'
+    - regex: 'PCT-L29(?:[);/ ]|$)'
       model: 'Honor View 20'
-    - regex: 'OXF-AN00[);/ ]'
+    - regex: 'OXF-AN00(?:[);/ ]|$)'
       model: 'Honor View 30'
-    - regex: 'OXF-AN10[);/ ]'
+    - regex: 'OXF-AN10(?:[);/ ]|$)'
       model: 'Honor View 30 Pro'
-    - regex: '(?:Honor_|HW-)?SCL-L(01|32)(?:_TD)?[);/ ]'
+    - regex: '(?:Honor_|HW-)?SCL-L(01|32)(?:_TD)?(?:[);/ ]|$)'
       model: 'Honor Y6'
-    - regex: '(?:Honor_|HW-)?LYO-L21[);/ ]'
+    - regex: '(?:Honor_|HW-)?LYO-L21(?:[);/ ]|$)'
       model: 'Honor Y6 II Compact'
-    - regex: 'TEL-AN00a?[);/ ]'
+    - regex: 'TEL-(?:AN(?:00a?|10)|TN00)(?:[);/ ]|$)'
       model: 'Honor X10'
-    - regex: 'U8500[);/ ]'
+    - regex: 'KKG-AN00(?:[);/ ]|$)'
+      model: 'Honor X10 Max'
+    - regex: 'U8500(?:[);/ ]|$)'
       model: 'Ideos X2'
-    - regex: 'U8510[);/ ]'
+    - regex: 'U8510(?:[);/ ]|$)'
       model: 'Ideos X3'
-    - regex: 'U8800[);/ ]'
+    - regex: 'U8800(?:[);/ ]|$)'
       model: 'Ideos X5'
-    - regex: 'MLA-AL10[);/ ]'
+    - regex: 'MLA-AL10(?:[);/ ]|$)'
       model: 'Maimang 5'
-    - regex: 'POT-AL10[);/ ]'
+    - regex: 'POT-AL10(?:[);/ ]|$)'
       model: 'Maimang 8'
-    - regex: 'TAH-AN00m[);/ ]'
+    - regex: 'TAH-AN00m(?:[);/ ]|$)'
       model: 'Mate XS'
-    - regex: 'ALP-(?:[TA]L00|L[02]9)[);/ ]'
+    - regex: 'ALP-(?:[TA]L00|L[02]9)(?:[);/ ]|$)'
       model: 'Mate 10'
-    - regex: 'RNE-(?:AL00|L(?:01|03|21|23))[);/ ]'
+    - regex: 'RNE-(?:AL00|L(?:01|03|21|23))(?:[);/ ]|$)'
       model: 'Mate 10 Lite'
-    - regex: 'BLA-(?:A09|L[02]9|[TA]L00)[);/ ]'
+    - regex: 'BLA-(?:A09|L[02]9|[TA]L00)(?:[);/ ]|$)'
       model: 'Mate 10 Pro'
-    - regex: 'HMA-(?:[AT]L00|L[02]9)[);/ ]'
+    - regex: 'HMA-(?:[AT]L00|L[02]9)(?:[);/ ]|$)'
       model: 'Mate 20'
-    - regex: 'SNE-(?:AL00|LX[0-3])[);/ ]'
+    - regex: 'SNE-(?:AL00|LX[0-3])(?:[);/ ]|$)'
       model: 'Mate 20 Lite'
-    - regex: 'LYA-(?:AL[01]0|L[02]9|L0C|TL00)[);/ ]'
+    - regex: 'LYA-(?:AL[01]0|L[02]9|L0C|TL00)(?:[);/ ]|$)'
       model: 'Mate 20 Pro'
-    - regex: 'LYA-AL00P[);/ ]'
+    - regex: 'LYA-AL00P(?:[);/ ]|$)'
       model: 'Mate 20 RS'
-    - regex: 'EVR-(?:[TA]L00|L29|N29|AN00)[);/ ]'
+    - regex: 'EVR-(?:[TA]L00|L29|N29|AN00)(?:[);/ ]|$)'
       model: 'Mate 20 X'
-    - regex: 'TAS-([AT]L00|L29)[);/ ]'
+    - regex: 'TAS-([AT]L00|L29)(?:[);/ ]|$)'
       model: 'Mate 30'
-    - regex: 'TAS-AN00[);/ ]'
+    - regex: 'TAS-AN00(?:[);/ ]|$)'
       model: 'Mate 30 5G'
-    - regex: 'SPN-AL00[);/ ]'
+    - regex: 'SPN-AL00(?:[);/ ]|$)'
       model: 'Mate 30 Lite'
-    - regex: 'LIO-(?:[TA]L00|L29|AN00)[);/ ]'
+    - regex: 'LIO-(?:[TA]L00|L29|AN00)(?:[);/ ]|$)'
       model: 'Mate 30 Pro'
-    - regex: 'NXT-(?:AL10|L29)[);/ ]'
+    - regex: 'LIO-N29(?:[);/ ]|$)'
+      model: 'Mate 30 Pro 5G'
+    - regex: 'NXT-(?:AL10|L29)(?:[);/ ]|$)'
       model: 'Mate 8'
-    - regex: 'MHA-(?:L[02]9|[AT]L00)[);/ ]'
+    - regex: 'MHA-(?:L[02]9|[AT]L00)(?:[);/ ]|$)'
       model: 'Mate 9'
-    - regex: 'BLL-L23[);/ ]'
+    - regex: 'BLL-L23(?:[);/ ]|$)'
       model: 'Mate 9 Lite'
-    - regex: 'LON-(?:AL00|L29)[);/ ]'
+    - regex: 'LON-(?:AL00|L29)(?:[);/ ]|$)'
       model: 'Mate 9 Pro'
-    - regex: 'NEO-AL00[);/ ]'
+    - regex: 'NEO-AL00(?:[);/ ]|$)'
       model: 'Mate RS'
-    - regex: 'NEO-L29[);/ ]'
+    - regex: 'NEO-L29(?:[);/ ]|$)'
       model: 'Mate RS Porsche Design'
-    - regex: 'CRR-(?:L09|UL00)[);/ ]'
+    - regex: 'CRR-(?:L09|UL00)(?:[);/ ]|$)'
       model: 'Mate S'
-    - regex: 'BND-L34[);/ ]'
+    - regex: 'BND-L34(?:[);/ ]|$)'
       model: 'Mate SE'
-    - regex: '(CAZ-(?:AL[01]0|TL[12]0)|CAN-L[01][1-3])[);/ ]'
+    - regex: '(CAZ-(?:AL[01]0|TL[12]0)|CAN-L[01][1-3])(?:[);/ ]|$)'
       model: 'Nova'
-    - regex: '(?:PIC-(?:[AT]L00|LX9)|HWV31)[);/ ]'
+    - regex: '608HW(?:[);/ ]|$)'
+      model: 'Nova Lite'
+    - regex: '(?:PIC-(?:[AT]L00|LX9)|HWV31)(?:[);/ ]|$)'
       model: 'Nova 2'
-    - regex: '704HW[);/ ]'
+    - regex: '704HW(?:[);/ ]|$)'
       model: 'Nova 2 Lite'
-    - regex: 'BAC-(?:L01|TL00)[);/ ]'
+    - regex: 'BAC-(?:L01|TL00)(?:[);/ ]|$)'
       model: 'Nova 2 Plus'
-    - regex: 'BAC-(?:AL00|L2[12])[);/ ]'
+    - regex: 'BAC-(?:AL00|L2[12])(?:[);/ ]|$)'
       model: 'Nova 2 Plus Dual SIM'
-    - regex: 'RNE-L[02]2[);/ ]'
+    - regex: 'RNE-L[02]2(?:[);/ ]|$)'
       model: 'Nova 2I'
-    - regex: 'HWI-[AT]L00[);/ ]'
+    - regex: 'HWI-[AT]L00(?:[);/ ]|$)'
       model: 'Nova 2S'
-    - regex: 'PAR-(?:[AT]L00|LX[19]|TL20)[);/ ]'
+    - regex: 'PAR-(?:[AT]L00|LX[19]|TL20)(?:[);/ ]|$)'
       model: 'Nova 3'
-    - regex: 'ANE-AL00[);/ ]'
+    - regex: 'ANE-AL00(?:[);/ ]|$)'
       model: 'Nova 3e'
-    - regex: 'INE-(?:AL00|LX1r|LX[12]|TL00)[);/ ]'
+    - regex: 'INE-(?:AL00|LX1r|LX[12]|TL00)(?:[);/ ]|$)'
       model: 'Nova 3i'
-    - regex: 'VCE-(L22|[AT]L00)[);/ ]'
+    - regex: 'VCE-(L22|[AT]L00)(?:[);/ ]|$)'
       model: 'Nova 4'
-    - regex: 'MAR-AL00[);/ ]'
+    - regex: 'MAR-AL00(?:[);/ ]|$)'
       model: 'Nova 4e'
-    - regex: 'SEA-AL00[);/ ]'
+    - regex: 'SEA-AL00(?:[);/ ]|$)'
       model: 'Nova 5'
-    - regex: 'SEA-AL10[);/ ]'
+    - regex: 'SEA-AL10(?:[);/ ]|$)'
       model: 'Nova 5 Pro'
-    - regex: 'GLK-[AT]L00[);/ ]'
+    - regex: 'GLK-[AT]L00(?:[);/ ]|$)'
       model: 'Nova 5i'
-    - regex: 'SPN-TL00[);/ ]'
+    - regex: 'SPN-TL00(?:[);/ ]|$)'
       model: 'Nova 5i Pro'
-    - regex: 'WLZ-AL10[);/ ]'
+    - regex: 'WLZ-AL10(?:[);/ ]|$)'
       model: 'Nova 6'
-    - regex: 'WLZ-AN00[);/ ]'
+    - regex: 'WLZ-AN00(?:[);/ ]|$)'
       model: 'Nova 6 5G'
-    - regex: 'JNY-AL10[);/ ]'
+    - regex: 'JNY-AL10(?:[);/ ]|$)'
       model: 'Nova 6 SE'
-    - regex: 'JEF-[AT]N00[);/ ]'
+    - regex: 'JEF-[AT]N00(?:[);/ ]|$)'
       model: 'Nova 7 5G'
-    - regex: 'JER-[AT]N10[);/ ]'
+    - regex: 'JER-[AT]N10(?:[);/ ]|$)'
       model: 'Nova 7 Pro 5G'
-    - regex: 'CDY-[AT]N00[);/ ]'
+    - regex: 'CDY-[AT]N00(?:[);/ ]|$)'
       model: 'Nova 7 SE 5G'
-    - regex: 'JNY-LX2[);/ ]'
+    - regex: 'JNY-LX2(?:[);/ ]|$)'
       model: 'Nova 7i'
-    - regex: 'DIG-L01[);/ ]'
+    - regex: 'DIG-L01(?:[);/ ]|$)'
       model: 'Nova Smart'
-    - regex: 'WAS-AL00[);/ ]'
+    - regex: 'WAS-AL00(?:[);/ ]|$)'
       model: 'Nova Youth'
-    - regex: 'FIG-L(?:A1|X[123])[);/ ]'
+    - regex: 'FIG-L(?:A1|X[123])(?:[);/ ]|$)'
       model: 'P smart'
-    - regex: 'POT-(?:LX(?:[13]|2J|1AF)|AL00)[);/ ]'
+    - regex: 'POT-(?:LX(?:[13]|2J|1AF)|AL00)(?:[);/ ]|$)'
       model: 'P smart (2019)'
-    - regex: 'STK-LX1[);/ ]'
+    - regex: 'STK-LX1(?:[);/ ]|$)'
       model: 'P smart Z'
-    - regex: 'VTR-(?:L[02]9|AL00|TL00)[);/ ]'
+    - regex: 'VTR-(?:L[02]9|AL00|TL00)(?:[);/ ]|$)'
       model: 'P10'
-    - regex: 'WAS-(?:L(?:X1|X1A|X2|X2J|X3|03T)|TL10)[);/ ]'
+    - regex: 'WAS-(?:L(?:X1|X1A|X2|X2J|X3|03T)|TL10)(?:[);/ ]|$)'
       model: 'P10 Lite'
-    - regex: 'VKY-(?:AL00|L09|L29)[);/ ]'
+    - regex: 'VKY-(?:AL00|L09|L29)(?:[);/ ]|$)'
       model: 'P10 Plus'
-    - regex: 'BAC-L[02]3[);/ ]'
+    - regex: 'BAC-L[02]3(?:[);/ ]|$)'
       model: 'P10 Selfie'
-    - regex: 'EML-(?:[TA]L00|L[02]9)[);/ ]'
+    - regex: 'EML-(?:[TA]L00|L[02]9)(?:[);/ ]|$)'
       model: 'P20'
-    - regex: '(?:ANE-(?:LX[123]|LX2J|TL00)|HWV32)[);/ ]'
+    - regex: '(?:ANE-(?:LX[123]|LX2J|TL00)|HWV32)(?:[);/ ]|$)'
       model: 'P20 Lite'
-    - regex: '(?:CLT-(?:AL0[01]|TL0[01]|L(?:04|[02]9))|HW-01K)[);/ ]'
+    - regex: '(?:CLT-(?:AL0[01]|TL0[01]|L(?:04|[02]9))|HW-01K)(?:[);/ ]|$)'
       model: 'P20 Pro'
-    - regex: '(ELE-L(?:04|09|29)|ELE-[AT]L00)[);/ ]'
+    - regex: '(ELE-L(?:04|09|29)|ELE-[AT]L00)(?:[);/ ]|$)'
       model: 'P30'
-    - regex: '(?:MAR-(?:LX(?:1[BM]|2J?|3BM)|TL00)|NIC-LX1A|HWV33)[);/ ]'
+    - regex: '(?:MAR-(?:LX(?:1[BM]|2J?|3BM)|TL00)|NIC-LX1A|HWV33)(?:[);/ ]|$)'
       model: 'P30 Lite'
-    - regex: 'MAR-LX[13]A[);/ ]'
+    - regex: 'MAR-LX[13]A(?:[);/ ]|$)'
       model: 'P30 Lite Dual SIM'
-    - regex: '(?:VOG-(?:L(?:04|09|29)|TL00|AL10)|HW-02L)[);/ ]'
+    - regex: '(?:VOG-(?:L(?:04|09|29)|TL00|AL10)|HW-02L)(?:[);/ ]|$)'
       model: 'P30 Pro'
-    - regex: 'JNY-LX1[);/ ]'
+    - regex: 'JNY-LX1(?:[);/ ]|$)'
       model: 'P40 Lite'
-    - regex: 'ELS-(?:[AT]N00|NX9)[);/ ]'
+    - regex: 'ART-L29(?:[);/ ]|$)'
+      model: 'P40 Lite E'
+    - regex: 'ART-L29N(?:[);/ ]|$)'
+      model: 'P40 Lite E NFC'
+    - regex: 'ELS-(?:[AT]N00|NX9|N04)(?:[);/ ]|$)'
       model: 'P40 Pro'
-    - regex: 'GRA-(?:L09|UL00)[);/ ]'
+    - regex: 'ELS-(?:AN10|N39)(?:[);/ ]|$)'
+      model: 'P40 Pro Plus'
+    - regex: 'GRA-(?:L09|UL00)(?:[);/ ]|$)'
       model: 'P8'
-    - regex: '(?:ALE-L(?:02|21|23)|ALE-UL00|ALE-TL00)[);/ ]'
+    - regex: '(?:ALE-L(?:02|21|23)|ALE-UL00|ALE-TL00)(?:[);/ ]|$)'
       model: 'P8 Lite (2015)'
-    - regex: '(?:PRA-L(?:A1|X2|X1|X3)|hi6210sft)[);/ ]'
+    - regex: '(?:PRA-L(?:A1|X2|X1|X3)|hi6210sft)(?:[);/ ]|$)'
       model: 'P8 Lite (2017)'
-    - regex: 'EVA-(?:AL[10]0|L[012]9|[TCD]L00)[);/ ]'
+    - regex: 'EVA-(?:AL[10]0|L[012]9|[TCD]L00)(?:[);/ ]|$)'
       model: 'P9'
-    - regex: 'VNS-L(?:[23]1|[26]2)[);/ ]'
+    - regex: 'VNS-L(?:[23]1|[26]2)(?:[);/ ]|$)'
       model: 'P9 Lite'
-    - regex: 'SLA-L(?:02|03|22|23)[);/ ]'
+    - regex: 'SLA-L(?:02|03|22|23)(?:[);/ ]|$)'
       model: 'P9 Lite Mini'
-    - regex: 'DIG-L(?:03|23)[);/ ]'
+    - regex: 'DIG-L(?:03|23)(?:[);/ ]|$)'
       model: 'P9 Lite Smart'
-    - regex: 'VIE-(?:AL10|L[02]9)[);/ ]'
+    - regex: 'VIE-(?:AL10|L[02]9)(?:[);/ ]|$)'
       model: 'P9 Plus'
-    - regex: 'ATH-UL0[16][);/ ]'
+    - regex: 'ATH-UL0[16](?:[);/ ]|$)'
       model: 'ShotX'
-    - regex: 'U(8230|8661|8667)[);/ ]'
+    - regex: 'U(8230|8661|8667)(?:[);/ ]|$)'
       model: 'U$1'
-    - regex: 'ARS-([AT]L00|L22)[);/ ]'
+    - regex: 'ARS-([AT]L00|L22)(?:[);/ ]|$)'
       model: 'Y Max'
-    - regex: 'CRO-(?:L[02]2|U00)[);/ ]'
+    - regex: 'CRO-(?:L[02]2|U00)(?:[);/ ]|$)'
       model: 'Y3 (2017)'
-    - regex: 'CAG-L[02]2[);/ ]'
+    - regex: 'CAG-L[02]2(?:[);/ ]|$)'
       model: 'Y3 (2018)'
-    - regex: 'LUA-(U22|L2[12]|U03)[);/ ]'
+    - regex: 'LUA-(U22|L2[12]|U03)(?:[);/ ]|$)'
       model: 'Y3II'
-    - regex: 'MYA-(?:L(?:02|03|2[23])|U29)[);/ ]'
+    - regex: 'MYA-(?:L(?:02|03|2[23])|U29)(?:[);/ ]|$)'
       model: 'Y5 (2017)'
-    - regex: 'DRA-L(?:01|03|21|23|X3)[);/ ]'
+    - regex: 'DRA-L(?:01|03|21|23|X3)(?:[);/ ]|$)'
       model: 'Y5 (2018)'
-    - regex: 'AMN-LX[129][);/ ]'
+    - regex: 'AMN-LX[129](?:[);/ ]|$)'
       model: 'Y5 (2019)'
-    - regex: 'DRA-LX5[);/ ]'
+    - regex: 'DRA-LX5(?:[);/ ]|$)'
       model: 'Y5 lite'
-    - regex: 'CRO-L[02]3[);/ ]'
+    - regex: 'CRO-L[02]3(?:[);/ ]|$)'
       model: 'Y5 Lite (2017)'
-    - regex: 'CAG-L[02]3[);/ ]'
+    - regex: 'CAG-L[02]3(?:[);/ ]|$)'
       model: 'Y5 Lite (2018)'
-    - regex: 'DRA-(?:LX2|[AT]L00)[);/ ]'
+    - regex: 'DRA-(?:LX2|[AT]L00)(?:[);/ ]|$)'
       model: 'Y5 Prime (2018)'
-    - regex: 'MYA-L13[);/ ]'
+    - regex: 'MYA-L13(?:[);/ ]|$)'
       model: 'Y5 Pro (2017)'
-    - regex: 'CUN-(?:L(?:0[123]|2[123]|33)|U29)[);/ ]'
+    - regex: 'CUN-(?:L(?:0[123]|2[123]|33)|U29)(?:[);/ ]|$)'
       model: 'Y5II'
-    - regex: 'SCC-U21[);/ ]'
+    - regex: 'SCC-U21(?:[);/ ]|$)'
       model: 'Y6'
-    - regex: 'MYA-L11[);/ ]'
+    - regex: 'MYA-L11(?:[);/ ]|$)'
       model: 'Y6 (2016)'
-    - regex: 'MYA-(L41|AL10)[);/ ]'
+    - regex: 'MYA-(L41|AL10)(?:[);/ ]|$)'
       model: 'Y6 (2017)'
-    - regex: 'ATU-L(?:11|21|22|X3)[);/ ]'
+    - regex: 'ATU-L(?:11|21|22|X3)(?:[);/ ]|$)'
       model: 'Y6 (2018)'
-    - regex: 'MRD-L(?:X1[NF]?|X3)[);/ ]'
+    - regex: 'MRD-L(?:X1[NF]?|X3)(?:[);/ ]|$)'
       model: 'Y6 (2019)'
-    - regex: 'ATU-L(?:31|42)[);/ ]'
+    - regex: 'ATU-L(?:31|42)(?:[);/ ]|$)'
       model: 'Y6 Prime (2018)'
-    - regex: 'TIT-(?:AL00|L01|U02)[);/ ]'
+    - regex: 'TIT-(?:AL00|L01|U02)(?:[);/ ]|$)'
       model: 'Y6 Pro'
-    - regex: 'MRD-LX2[);/ ]'
+    - regex: 'MRD-LX2(?:[);/ ]|$)'
       model: 'Y6 Pro (2019)'
-    - regex: 'MED-LX9[);/ ]'
-      model: 'Y6p'
-    - regex: 'Y625-U03[);/ ]'
+    - regex: 'Y625-U03(?:[);/ ]|$)'
       model: 'Y625'
-    - regex: 'Y635-L0[123][);/ ]'
+    - regex: 'Y635-L0[123](?:[);/ ]|$)'
       model: 'Y635'
-    - regex: 'Y635-L21[);/ ]'
+    - regex: 'Y635-L21(?:[);/ ]|$)'
       model: 'Y635 Dual SIM'
-    - regex: 'CAM-L(?:03|21|23|32)[);/ ]'
+    - regex: 'CAM-L(?:03|21|23|32)(?:[);/ ]|$)'
       model: 'Y6II'
-    - regex: 'TRT-LX[123][);/ ]'
+    - regex: 'TRT-LX[123](?:[);/ ]|$)'
       model: 'Y7 (2017)'
-    - regex: 'LDN-L(?:01|X3)[);/ ]'
+    - regex: 'LDN-L(?:01|X3)(?:[);/ ]|$)'
       model: 'Y7 (2018)'
-    - regex: 'DUB-(?:LX[13]|TL00)[);/ ]'
+    - regex: 'DUB-(?:LX[13]|TL00)(?:[);/ ]|$)'
       model: 'Y7 (2019)'
-    - regex: '(LDN-(?:AL00|L21)|TRT-TL10)[);/ ]'
+    - regex: '(LDN-(?:AL00|L21)|TRT-TL10)(?:[);/ ]|$)'
       model: 'Y7 Prime'
-    - regex: '(LDN-(?:LX2|TL10)|TRT-(?:L21A|L53))[);/ ]'
+    - regex: '(LDN-(?:LX2|TL10)|TRT-(?:L21A|L53))(?:[);/ ]|$)'
       model: 'Y7 Prime (2018)'
-    - regex: 'DUB-(?:LX2|AL00)[);/ ]'
+    - regex: 'DUB-(?:LX2|AL00)(?:[);/ ]|$)'
       model: 'Y7 Pro (2019)'
-    - regex: 'DUB-AL20[);/ ]'
+    - regex: 'DUB-AL20(?:[);/ ]|$)'
       model: 'Y7 Pro (2019)'
-    - regex: 'AQM-LX1[);/ ]'
+    - regex: 'AQM-LX1(?:[);/ ]|$)'
       model: 'Y8p'
-    - regex: 'FLA-(LX[123]|AL20|TL10)[);/ ]'
+    - regex: 'FLA-(LX[123]|AL20|TL10)(?:[);/ ]|$)'
       model: 'Y9 (2018)'
-    - regex: 'JKM-(?:[TA]L00|LX[123])[);/ ]'
+    - regex: 'JKM-(?:[TA]L00|LX[123])(?:[);/ ]|$)'
       model: 'Y9 (2019)'
-    - regex: 'STK-(L2[12]|LX3)[);/ ]'
+    - regex: 'STK-(L2[12]|LX3)(?:[);/ ]|$)'
       model: 'Y9 Prime (2019)'
 
-    - regex: 'HWT31[);/ ]'
+    - regex: 'HWT31(?:[);/ ]|$)'
       model: 'Qua Tab 02 10.1"'
       device: 'tablet'
-    - regex: 'HDN-[LW]09[);/ ]'
+    - regex: 'HDN-[LW]09(?:[);/ ]|$)'
       model: 'Honor Water Play 10.1'
       device: 'tablet'
-    - regex: 'BAH3-AL00[);/ ]'
+    - regex: 'BAH3-AL00(?:[);/ ]|$)'
       model: 'MatePad 10.4'
       device: 'tablet'
-    - regex: 'HDL-(?:W09|AL09)[);/ ]'
+    - regex: 'HDL-(?:W09|AL09)(?:[);/ ]|$)'
       model: 'Honor Water Play 8.0'
       device: 'tablet'
-    - regex: 'JDN-(?:AL00|W09)[);/ ]'
+    - regex: 'JDN-(?:AL00|W09)(?:[);/ ]|$)'
       model: 'Honor Pad 2'
       device: 'tablet'
-    - regex: 'MON-(W|AL)19[);/ ]'
+    - regex: 'MON-(W|AL)19(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MatePad C5 8'
-    - regex: 'BZA-W00[);/ ]'
+    - regex: 'BZA-W00(?:[);/ ]|$)'
       device: 'tablet'
       model: 'C3 9.6'
-    - regex: 'M2-801L[);/ ]'
+    - regex: 'M2-801L(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M2 8.0"'
-    - regex: 'MRX-(AL09|W09)[);/ ]'
+    - regex: 'MRX-(AL09|W09)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MatePad Pro'
-    - regex: 'CMR-(?:AL[01]9|W09)[);/ ]'
+    - regex: 'CMR-(?:AL[01]9|W09)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M5 10.8'
-    - regex: 'CMR-W19[);/ ]'
+    - regex: 'CMR-W19(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M5 Pro 10.8'
-    - regex: 'SCM-AL09[);/ ]'
+    - regex: 'SCM-AL09(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M5 Pro'
-    - regex: 'GEM-70[1-3]L[);/ ]'
+    - regex: 'GEM-70[1-3]L(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad X2'
-    - regex: '(?:JDN2-(:?[WL]09|AL[50]0)|BAH2-(?:AL[01]0|L09|W[01]9))[);/ ]'
+    - regex: '(?:JDN2-(:?[WL]09|AL[50]0)|BAH2-(?:AL[01]0|L09|W[01]9))(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M5 Lite'  #8.4
-    - regex: 'SHT-(?:AL|W)09[);/ ]'
+    - regex: 'SHT-(?:AL|W)09(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M5 8.4'
-    - regex: 'VRD-(?:(AL|W)09|AL10|W10)[);/ ]'
+    - regex: 'VRD-(?:(AL|W)09|AL10|W10)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M6 8.4'
-    - regex: 'SCM-W09[);/ ]'
+    - regex: 'SCM-W09(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M6 10'
-    - regex: 'BTV-W09[);/ ]'
+    - regex: 'BTV-W09(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M3 8'
-    - regex: '(BAH-W09|CPN-(?:L|W)09|CPN-AL00)[);/ ]'
+    - regex: '(BAH-W09|CPN-(?:L|W)09|CPN-AL00|701HW)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M3 Lite'
-    - regex: '(BAH-(?:L09|AL00)|BAH3-W09)[);/ ]'
+    - regex: '(BAH-(?:L09|AL00)|BAH3-W09)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad M3 Lite 10'
     - regex: 'BTV-DL09'
       device: 'tablet'
       model: 'MediaPad M3'
-    - regex: '(AGS2-AL00|JDN2-W09)HN[);/ ]'
+    - regex: '(AGS2-AL00|JDN2-W09)HN(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Honor Tab 5'
-    - regex: 'AGS2-(?:[LW]09|L03)[);/ ]'
+    - regex: 'AGS2-(?:[LW]09|L03)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T5 10'
-    - regex: 'AGS-(?:L0[39]|W09)[);/ ]'
+    - regex: 'KOB2-L09(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'MediaPad T 8.0"'
+    - regex: 'AGS-(?:L0[39]|W09)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T3 10'
-    - regex: '(KOB-(?:L|W)09|BZK-[LW]00)[);/ ]'
+    - regex: '(KOB-(?:L|W)09|BZK-[LW]00)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T3 8'
-    - regex: 'BG2-(?:U0[13]|W09)[);/ ]'
+    - regex: 'BG2-(?:U0[13]|W09)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T3 7'
-    - regex: 'BGO-L03[);/ ]'
+    - regex: 'BGO-L03(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T2 7.0'
-    - regex: '(?:BGO-DL09|PLE-70[13]L)[);/ ]'
+    - regex: '(?:BGO-DL09|PLE-70[13]L)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T2 7.0 Pro'
-    - regex: 'JDN-L01[);/ ]'
+    - regex: 'JDN-L01(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T2 8.0 Pro'
-    - regex: '(?:FDR-(A01[LW]|A03L)|605HW)[);/ ]'
+    - regex: '(?:FDR-(A01[LW]|A03L)|605HW)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T2 10.0" Pro'
-    - regex: 'T1-(?:A21[LW]|A23L)[);/ ]'
+    - regex: 'T1-(?:A21[LW]|A23L)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T1 10'
-    - regex: 'T1-701u[);/ ]'
+    - regex: 'T1-701u(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T1 7'
-    - regex: '(?:T1-82(?:3L|1W)|MediaPad T1 8.0)[);/ ]'
+    - regex: '(?:T1-82(?:3L|1W)|MediaPad T1 8.0)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad T1 8'
-    - regex: 'AGS2-AL00[);/ ]'
+    - regex: 'AGS2-AL00(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Enjoy Tablet 10.1'
-    - regex: 'BZT-(W09|AL[01]0)[);/ ]'
+    - regex: 'BZT-(W09|AL[01]0)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'MediaPad C5 10.1'
-    - regex: '(?:d-01J|d-02[HK])[);/ ]'
+    - regex: '(?:d-01J|d-02[HK])(?:[);/ ]|$)'
       device: 'tablet'
       model: 'D Tab Compact'
 
 
       # smart watch regex
-    - regex: 'LEO-BX9[);/ ]'
+    - regex: 'LEO-BX9(?:[);/ ]|$)'
       device: 'wearable'
       model: 'Smart Watch 2'
 
@@ -6236,28 +6360,28 @@ Hyundai:
 
 #i-Joy
 'i-Joy':
-  regex: 'i-Joy|i-Call|(?:Neon[79]|Sygnus|Deox|Elektra (?:M|L|XL|XXL))[);/ ]'
+  regex: 'i-Joy|i-Call|(?:Neon[79]|Sygnus|Deox|Elektra (?:M|L|XL|XXL))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit smartphone models
-    - regex: 'Elektra M[);/ ]'
+    - regex: 'Elektra M(?:[);/ ]|$)'
       model: 'Elektra M'
-    - regex: 'Elektra L[);/ ]'
+    - regex: 'Elektra L(?:[);/ ]|$)'
       model: 'Elektra L'
-    - regex: 'Elektra XL[);/ ]'
+    - regex: 'Elektra XL(?:[);/ ]|$)'
       model: 'Elektra XL'
-    - regex: 'Elektra XXL[);/ ]'
+    - regex: 'Elektra XXL(?:[);/ ]|$)'
       model: 'Elektra XXL'
       device: 'phablet'
 
     # explicit tablet models
-    - regex: 'Neon([79])[);/ ]'
+    - regex: 'Neon([79])(?:[);/ ]|$)'
       model: 'Neon $1'
       device: 'tablet'
-    - regex: 'Sygnus[);/ ]'
+    - regex: 'Sygnus(?:[);/ ]|$)'
       model: 'Sygnus'
       device: 'tablet'
-    - regex: 'Deox[);/ ]'
+    - regex: 'Deox(?:[);/ ]|$)'
       model: 'Deox'
       device: 'tablet'
 
@@ -6268,10 +6392,10 @@ Hyundai:
 
 # iBall
 iBall:
-  regex: 'iBall[ _]([^;/)]+)[ _]Build|(Snap_4G2)[;)\ ]'
+  regex: 'iBall[ _]([^;/)]+)[ _]Build|(Snap_4G2)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: '(Snap_4G2)[;)\ ]'
+    - regex: '(Snap_4G2)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'iBall[ _]([^;/)]+)[ _]Build'
       model: '$1'
@@ -6290,18 +6414,18 @@ iRola:
 
 # iRulu
 iRulu:
-  regex: 'iRULU[ _](X11|V[34])[;)\ ]'
+  regex: 'iRULU[ _](X11|V[34])(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Irbis
 Irbis:
-  regex: 'IRBIS|TZ(1(?:00|42|50|84|65|7[035-89]|8[36]|9[578])|49|7(?:1[2467]|2[01567]|37|4[257]|5[23457]|62|72|7[17]|8[1]|9[47])|8(?:[34]1|5[3-8]|6[45]|7[2478]|8[1-5]|9[0127])|96[0-9])|TZ(?:one|art|HIT|81L)|(SP(?:0[56]|2[01]|4[1-36]|40[12]|45[345]|49[34]|50|51[0147]|531|54[12]|55[0124]|571))[;)\ ]'
+  regex: 'IRBIS|TZ(1(?:0[04]|42|50|84|65|7[01345-89]|8[356]|9[12578])|49|7(?:1[2467]|2[01567]|37|4[257]|5[23457]|6[12]|72|7[17]|8[1]|9[47])|8(?:[34]1|5[3-8]|6[45]|7[2478]|8[1-5]|9[0127])|96[0-9])|TZ(?:one|art|HIT|81L)|(SP(?:0[56]|2[01]|4[1-36]|40[12]|45[345]|49[34]|50|51[0147]|531|54[12]|55[0124]|571))(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: '(TZ(?:[0-9]+)|TZ(?:one|art|HIT|81L))[;)\ ]'
+    - regex: '(TZ(?:[0-9]+)|TZ(?:one|art|HIT|81L))(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(SP[0-9]+)[;)\ ]'
+    - regex: '(SP[0-9]+)(?:[);/ ]|$)'
       device: 'smartphone'
       model: '$1'
 
@@ -6461,12 +6585,12 @@ LYF:
 
 # Lumus
 Lumus:
-  regex: '(?:NEO(SR620|SC600)|Lumus[_ ]Ion)[;)/ ]'
+  regex: '(?:NEO(SR620|SC600)|Lumus[_ ]Ion)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'NEO(SR620|SC600)[;)/ ]'
+    - regex: 'NEO(SR620|SC600)(?:[);/ ]|$)'
       model: 'Neo $1'
-    - regex: 'Lumus[_ ]Ion[;)/ ]'
+    - regex: 'Lumus[_ ]Ion(?:[);/ ]|$)'
       model: 'Ion'
 
 # M4tel
@@ -6521,76 +6645,77 @@ M4tel:
 
 # IMO Mobile
 IMO Mobile:
-  regex: '(?:IMO)[);/ ]'
+  regex: '(?:IMO)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'IMO[ _]Q2 Plus[);/ ]'
+    - regex: 'IMO[ _]Q2 Plus(?:[);/ ]|$)'
       model: 'Q2 Plus'
-    - regex: 'IMO[ _]Q2[);/ ]'
+    - regex: 'IMO[ _]Q2(?:[);/ ]|$)'
       model: 'Q2'
-    - regex: 'IMO[ _]FEEL A2[);/ ]'
+    - regex: 'IMO[ _]FEEL A2(?:[);/ ]|$)'
       model: 'Feel A2'
-    - regex: 'IMO[ _]S50[);/ ]'
+    - regex: 'IMO[ _]S50(?:[);/ ]|$)'
       model: 'S50 Light'
-    - regex: 'IMO[ _]S89[);/ ]'
+    - regex: 'IMO[ _]S89(?:[);/ ]|$)'
       model: 'S89 Miracle'
-    - regex: 'IMO[ _]S88[);/ ]'
+    - regex: 'IMO[ _]S88(?:[);/ ]|$)'
       model: 'S88 Discovery'
-    - regex: 'IMO[ _]S99[);/ ]'
+    - regex: 'IMO[ _]S99(?:[);/ ]|$)'
       model: 'S99 Ocean'
-    - regex: 'IMO[ _]S98[);/ ]'
+    - regex: 'IMO[ _]S98(?:[);/ ]|$)'
       model: 'S98 Champion'
-    - regex: 'IMO[ _]S87[);/ ]'
+    - regex: 'IMO[ _]S87(?:[);/ ]|$)'
       model: 'S87 Raptor'
-    - regex: 'IMO[ _]S67[);/ ]'
+    - regex: 'IMO[ _]S67(?:[);/ ]|$)'
       model: 'S67 Blast'
-    - regex: 'IMO[ _]S78[);/ ]'
+    - regex: 'IMO[ _]S78(?:[);/ ]|$)'
       model: 'S78 Glory'
-    - regex: 'IMO[ _]Q8[);/ ]'
+    - regex: 'IMO[ _]Q8(?:[);/ ]|$)'
       model: 'Q8 Clarity'
-    - regex: 'IMO[ _]Discovery II[);/ ]'
+    - regex: 'IMO[ _]Discovery II(?:[);/ ]|$)'
       model: 'Discovery II'
 
-    - regex: 'IMO[ _](Y5|Z[67])[);/ ]'
+    - regex: 'IMO[ _](Y5|Z[67])(?:[);/ ]|$)'
       model: 'Tab $1'
       device: 'tablet'
-    - regex: 'IMO TAB X9[);/ ]'
+    - regex: 'IMO TAB X9(?:[);/ ]|$)'
       model: 'Tab X9'
       device: 'tablet'
 
 # iLA
 iLA:
-  regex: 'iLA[-_ ](Silk|X)[);/ ]'
+  regex: 'iLA[-_ ](Silk|X)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # iNew
 iNew:
-  regex: 'iNew|(?:V7A|V3 Plus|V3-?E|V3C)[;)/ ]'
+  regex: 'iNew|(?:V7A|V3 Plus|V3-?E|V3C)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'V3C[;)/ ]'
+    - regex: 'V3C(?:[);/ ]|$)'
       model: 'V3C'
-    - regex: 'V3-?E[;)/ ]'
+    - regex: 'V3-?E(?:[);/ ]|$)'
       model: 'V3-E'
-    - regex: 'V3 Plus[;)/ ]'
+    - regex: 'V3 Plus(?:[);/ ]|$)'
       model: 'V3 Plus'
-    - regex: 'V7A[;)/ ]'
+    - regex: 'V7A(?:[);/ ]|$)'
       model: 'V7A'
     - regex: 'iNew[ -_]([^;/]+) Build'
       model: '$1'
 
 # iPro
 iPro:
-  regex: 'Kylin[ _]5.[05]'
+  regex: 'Kylin[ _]5.[05]|Jade7s'
   device: 'smartphone'
   models:
     - regex: 'Kylin_5.0S'
       model: 'Kylin 5.0S'
-    - regex: 'Kylin 5.0'
-      model: 'Kylin 5.0'
-    - regex: 'Kylin 5.5'
-      model: 'Kylin 5.5'
+    - regex: 'Kylin (5.[05])'
+      model: 'Kylin $1'
+    - regex: 'Jade7s'
+      model: 'Jade 7s'
+
 
 # Infinix
 Infinix:
@@ -6736,7 +6861,7 @@ Infinix:
 
 # InFocus
 InFocus:
-  regex: 'IF(9001|9007|9021|9035|9031)[);/ ]'
+  regex: 'IF(9001|9007|9021|9035|9031)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'IF9001'
@@ -6752,11 +6877,31 @@ InFocus:
 
 # InnJoo
 InnJoo:
-  regex: 'InnJoo'
+  regex: 'InnJoo|(?:Halo Plus|Halo X|Halo[ _]4(?:[ _]mini[ _]LTE)?|Halo2 3G)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'InnJoo[ _]X'
+    - regex: 'InnJoo[ _]X3(?:[);/ ]|$)'
+      model: 'X3'
+    - regex: 'Halo[ _]X[ _]LTE(?:[);/ ]|$)'
+      model: 'Halo X LTE'
+    - regex: 'InnJoo[ _]X(?:[);/ ]|$)'
       model: 'X'
+    - regex: 'Halo Plus(?:[);/ ]|$)'
+      model: 'Halo Plus'
+    - regex: 'Halo[ _]4[ _]mini[ _]LTE(?:[);/ ]|$)'
+      model: 'Halo 4 Mini LTE'
+    - regex: 'Halo 4(?:[);/ ]|$)'
+      model: 'Halo 4'
+    - regex: 'Halo2 3G(?:[);/ ]|$)'
+      model: 'Halo 2 3G'
+    - regex: 'InnJoo[ _]Pro2(?:[);/ ]|$)'
+      model: 'Pro 2'
+    - regex: 'Innjoo ONE 3G(?:[);/ ]|$)'
+      model: 'One 3G'
+    - regex: 'Innjoo[ _]2[ _]LTE(?:[);/ ]|$)'
+      model: '2 LTE'
+    - regex: 'InnJoo[ _]([2-4])'
+      model: '$1'
 
 # Inkti
 Inkti:
@@ -6772,7 +6917,7 @@ Innostream:
 
 # Insignia
 Insignia:
-  regex: 'NS-(P11A8100|P10A8100|P10A6100|P16AT08|P16AT10|P16AT785HD|P08A7100|P10A7100)[);/ ]|AFTEAMR311|AFTJMST12'
+  regex: 'NS-(P11A8100|P10A8100|P10A6100|P16AT08|P16AT10|P16AT785HD|P08A7100|P10A7100)(?:[);/ ]|$)|AFTEAMR311|AFTJMST12'
   device: 'tablet'
   models:
     - regex: 'NS-P11A8100'
@@ -6884,7 +7029,7 @@ iView:
 
 # Impression
 Impression:
-  regex: '(?:Impression[ _\-]?([^/;]+)|A502|I10\-LE|ImPad[ _]?(.*)|ImSmart[ _]?(.*))[);/ ]'
+  regex: '(?:Impression[ _\-]?([^/;]+)|A502|I10\-LE|ImPad[ _]?(.*)|ImSmart[ _]?(.*))(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: '(A502)'
@@ -6903,7 +7048,7 @@ Impression:
 
 #iLife or i-life (lifedigital.com)
 iLife:
-  regex: '(ITELL_K3500N)[);/ ]'
+  regex: '(ITELL_K3500N)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
@@ -6916,6 +7061,8 @@ iTel:
       model: 'iNote $1'
     - regex: 'iNote_([a-z0-9\-_]+)'
       model: 'iNote $1'
+    - regex: 'itel-it(1512|1520)(?:[);/ ]|$)'
+      model: 'it$1'
     - regex: 'iTel ([^/;]*)Build'
       model: '$1'
     - regex: 'iTel[_ ]([a-z0-9\-_]*)'
@@ -6923,12 +7070,12 @@ iTel:
 
 # iZotron
 iZotron:
-  regex: '(Mi7_HERO_(?:BETA|TAB))[);/ ]'
+  regex: '(Mi7_HERO_(?:BETA|TAB))(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'Mi7[_ ]HERO[_ ]BETA[);/ ]'
+    - regex: 'Mi7[_ ]HERO[_ ]BETA(?:[);/ ]|$)'
       model: 'MI7 Hero Beta'
-    - regex: 'Mi7[_ ]HERO[_ ]TAB[);/ ]'
+    - regex: 'Mi7[_ ]HERO[_ ]TAB(?:[);/ ]|$)'
       model: 'MI7 Hero Tab'
 
 # JAY-Tech
@@ -6943,14 +7090,14 @@ JAY-Tech:
 
 # Jiayu
 Jiayu:
-  regex: 'JIAYU[ _-]|(?:JY-G4[\\_]G5|(?:JY-[a-z0-9]+))[);/ ]'
+  regex: 'JIAYU[ _-]|(?:JY-G4[\\_]G5|(?:JY-[a-z0-9]+))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(?:JIAYU G4_G5|JY-G4[\\_]G5)[);/ ]'
+    - regex: '(?:JIAYU G4_G5|JY-G4[\\_]G5)(?:[);/ ]|$)'
       model: 'G4/G5'
-    - regex: 'JIAYU[ _-](G4[S]?|G2F|G3[S]?|S[23])[);/ ]'
+    - regex: 'JIAYU[ _-](G4[S]?|G2F|G3[S]?|S[23])(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(JY-[a-z0-9]+)[);/ ]'
+    - regex: '(JY-[a-z0-9]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Jolla
@@ -6991,28 +7138,30 @@ Kalley:
 
 # Kaan
 Kaan:
-  regex: 'KAAN[ _](N[12]|A1)[);/ ]'
+  regex: 'KAAN[ _](N[12]|A1)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Kazam
 Kazam:
-  regex: 'Kazam ([^;/)]+)( Build|\))|Trooper_X[0-9][0-9][);/ ]|Tornado 348'
+  regex: 'Kazam|Trooper_X[0-9][0-9](?:[);/ ]|$)|Tornado 348'
   device: 'smartphone'
   models:
     - regex: 'Tornado 348'
       model: 'Tornado 348'
-    - regex: 'Trooper_X([0-9])([0-9])[);/ ]'
+    - regex: 'Thunder 450W'
+      model: 'Thunder 450W'
+    - regex: 'Trooper_X([0-9])([0-9])(?:[);/ ]|$)'
       model: 'Trooper X$1.$2'
-    - regex: 'Kazam ([^;/)]+)(?: Build|\))'
+    - regex: 'Kazam[; _]([^;/)]+)(?: Build|\))'
       model: '$1'
 
 # Keneksi
 Keneksi:
-  regex: 'KENEKSI|(Hemera|Teta Dual)[);/ ]'
+  regex: 'KENEKSI|(Hemera|Teta Dual)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(Hemera|Teta Dual)[);/ ]'
+    - regex: '(Hemera|Teta Dual)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'KENEKSI[ _-]liberty'
       model: 'Liberty'
@@ -7045,7 +7194,7 @@ Keneksi:
 
 # Kiano
 Kiano:
-  regex: 'Kiano|Elegance_[45]_[015](?:_PRO)?|CORE 10.1 DUAL 3G|Intelect ?(7|8|10)|Slim ?Tab ?\d+(?:[_ ]3GR?)?[);/ ]|Cavion[_ ]'
+  regex: 'Kiano|Elegance_[45]_[015](?:_PRO)?|CORE 10.1 DUAL 3G|Intelect ?(7|8|10)|Slim ?Tab ?\d+(?:[_ ]3GR?)?(?:[);/ ]|$)|Cavion[_ ]'
   device: 'smartphone'
   models:
     - regex: 'Slim ?Tab ?(\d+)(?:[_ ]3GR?)?'
@@ -7079,32 +7228,32 @@ Kingsun:
 
 # Kocaso
 Kocaso:
-  regex: 'Kocaso|M(?:729|7[357][026][hw]?|76[01236][bw]?|83[016]|8[567]0|1050s|106[012368]w?|1070|X736(?:-kit)?|X780)[);/ ]'
+  regex: 'Kocaso|M(?:729|7[357][026][hw]?|76[01236][bw]?|83[016]|8[567]0|1050s|106[012368]w?|1070|X736(?:-kit)?|X780)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'M729[);/ ]'
+    - regex: 'M729(?:[);/ ]|$)'
       model: 'M729'
-    - regex: 'M(7[357][026])[hw]?[);/ ]'
+    - regex: 'M(7[357][026])[hw]?(?:[);/ ]|$)'
       model: 'M$1'
-    - regex: 'M(76[01236])[bw]?[);/ ]'
+    - regex: 'M(76[01236])[bw]?(?:[);/ ]|$)'
       model: 'M$1'
-    - regex: 'MX780[);/ ]'
+    - regex: 'MX780(?:[);/ ]|$)'
       model: 'MX780'
-    - regex: 'M(83[016])[);/ ]'
+    - regex: 'M(83[016])(?:[);/ ]|$)'
       model: 'M$1'
-    - regex: 'M(8[567]0)[);/ ]'
+    - regex: 'M(8[567]0)(?:[);/ ]|$)'
       model: 'M$1'
-    - regex: 'M851[);/ ]'
+    - regex: 'M851(?:[);/ ]|$)'
       model: 'M851'
-    - regex: 'M1050S[);/ ]'
+    - regex: 'M1050S(?:[);/ ]|$)'
       model: 'M1050s'
-    - regex: 'M(106[012368])W?[);/ ]'
+    - regex: 'M(106[012368])W?(?:[);/ ]|$)'
       model: 'M$1'
-    - regex: 'M1070[);/ ]'
+    - regex: 'M1070(?:[);/ ]|$)'
       model: 'M1070'
-    - regex: 'MX736(?:-kit)?[);/ ]'
+    - regex: 'MX736(?:-kit)?(?:[);/ ]|$)'
       model: 'MX736'
-    - regex: 'MX780[);/ ]'
+    - regex: 'MX780(?:[);/ ]|$)'
       model: 'MX780'
     - regex: 'Kocaso[ _\-]?([^;/]+) Build'
       model: '$1'
@@ -7153,7 +7302,7 @@ Kumai:
 
 # KT-Tech
 KT-Tech:
-  regex: '(KM-[a-z0-9]+|EV-[a-z0-9]+)[);/ ]'
+  regex: '(KM-[a-z0-9]+|EV-[a-z0-9]+)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
@@ -7165,12 +7314,12 @@ KDDI:
 
 # Kodak
 Kodak:
-  regex: 'KODAK|IM5|Ektra[);/ ]'
+  regex: 'KODAK|IM5|Ektra(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'IM5'
       model: 'IM5'
-    - regex: 'Ektra[);/ ]'
+    - regex: 'Ektra(?:[);/ ]|$)'
       model: 'Ektra'
     - regex: 'KODAK_SMARTWAY_((M|T)1)'
       model: 'Smartway $1'
@@ -7216,31 +7365,33 @@ K-Touch:
 
 # kyocera (kyocera.co.jp, kyocera.com)
 Kyocera:
-  regex: 'Kyocera|KWC-|QC-|(?:NP501KC|503KC|602KC|705KC|C51[27]0|C5155|C5215|C67[35]0|C6522N?|C6530N|C6740N?|C6743|E6[89]10|KYL2[13]|KYV3[13-9]|KYF3[179]|KYY2[1-4]|S2151|KC-S701|S4-KC|KYV40U|KYV4[1-6]|KYV47-u|KC-S301AE|X3-KC|S6-KC|E6560[CT]|E6782[L]?|E6790(?:TM)?)[;/) ]'
+  regex: 'Kyocera|KWC-|QC-|(?:NP501KC|503KC|602KC|705KC|C51[27]0|C5155|C5215|C67[35]0|C6522N?|C6530N|C6740N?|C6743|E6[89]10|KYL2[13]|KYV3[13-9]|KYT3[123]|KYF3[12579]|KYY2[1-4]|S2151|KC-S701|S4-KC|KYV40U?|KYV4[1-8]|KYV4[47][-_]u|KC-S301AE|X3-KC|S6-KC|E6560[CT]|E6782[L]?|E6790(?:TM)?|704KC)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit smartphone models
-    - regex: 'C5120[;/) ]'
+    - regex: 'C5120(?:[);/ ]|$)'
       model: 'Milano'
-    - regex: 'S4-KC[;/) ]'
+    - regex: 'S4-KC(?:[);/ ]|$)'
       model: 'One S4'
-    - regex: 'S6-KC[;/) ]'
+    - regex: 'S6-KC(?:[);/ ]|$)'
       model: 'One S6'
-    - regex: 'C5155[;/) ]'
+    - regex: 'C5155(?:[);/ ]|$)'
       model: 'Rise'
-    - regex: '602KC[;/) ]'
+    - regex: '602KC(?:[);/ ]|$)'
       model: 'Digno G'
-    - regex: '503KC[;/) ]'
+    - regex: '503KC(?:[);/ ]|$)'
       model: 'Digno E'
-    - regex: 'NP501KC[;/) ]'
+    - regex: '704KC(?:[);/ ]|$)'
+      model: 'Digno J'
+    - regex: 'NP501KC(?:[);/ ]|$)'
       model: 'Digno'
-    - regex: 'KYV36[;/) ]'
+    - regex: 'KYV36(?:[);/ ]|$)'
       model: 'Digno Rafre'
-    - regex: 'KYV39[;/) ]'
+    - regex: 'KYV39(?:[);/ ]|$)'
       model: 'Miraie F'
-    - regex: 'C5170[;/) ]'
+    - regex: 'C5170(?:[);/ ]|$)'
       model: 'Hydro'
-    - regex: 'C5215[;/) ]'
+    - regex: 'C5215(?:[);/ ]|$)'
       model: 'Hydro EDGE'
     - regex: 'C6522N?'
       model: 'Hydro XTRM'
@@ -7262,57 +7413,72 @@ Kyocera:
       model: 'DuraForce Pro 2'
     - regex: 'KC-S701'
       model: 'Torque'
-    - regex: 'KYL21[;/) ]'
+    - regex: 'KYL21(?:[);/ ]|$)'
       model: 'Digno S'
-    - regex: 'KYL23[;/) ]'
+    - regex: 'KYL23(?:[);/ ]|$)'
       model: 'Miraie'
-    - regex: 'KYY24[;/) ]'
+    - regex: 'KYY24(?:[);/ ]|$)'
       model: 'Torque G01'
-    - regex: 'KYF3[179][;/) ]'
+    - regex: 'KYF32(?:[);/ ]|$)'
+      model: 'Easy Mobile Phone'
+    - regex: 'KYF35(?:[);/ ]|$)'
+      model: 'Marvera'
+    - regex: 'KYF3[179](?:[);/ ]|$)'
       model: 'Gratina 4G'
-    - regex: 'KYV35[;/) ]'
+    - regex: 'KYV48(?:[);/ ]|$)'
+      model: 'Gratina KYV48'
+    - regex: 'KYV35(?:[);/ ]|$)'
       model: 'Torque G02'
-    - regex: 'KYV41[;/) ]'
+    - regex: 'KYV41(?:[);/ ]|$)'
       model: 'Torque G03'
-    - regex: 'KYV46[;/) ]'
+    - regex: 'KYV46(?:[);/ ]|$)'
       model: 'Torque G04'
-    - regex: 'KYV47-u[;/) ]'
+    - regex: 'KYV47(?:-u)?(?:[);/ ]|$)'
       model: 'Basio 4'
-    - regex: 'KYV43[;/) ]'
+    - regex: 'KYV43(?:[);/ ]|$)'
       model: 'Basio 3'
-    - regex: '705KC[;/) ]'
+    - regex: '705KC(?:[);/ ]|$)'
       model: 'Kantan Sumaho'
-    - regex: 'KYV37[;/) ]'
+    - regex: 'KYV37(?:[);/ ]|$)'
       model: 'Qua Phone'
-    - regex: 'KYV42[;/) ]'
+    - regex: 'KYV42(?:[);/ ]|$)'
       model: 'Qua Phone QX'
-    - regex: 'KYV44[;/) ]'
+    - regex: 'KYV44(?:_u)?(?:[);/ ]|$)'
       model: 'Qua Phone QZ'
-    - regex: 'KYV40U[;/) ]'
+    - regex: 'KYT33(?:[);/ ]|$)'
+      model: 'Qua Tab QZ10'
+      device: 'tablet'
+    - regex: 'KYT32(?:[);/ ]|$)'
+      model: 'Qua Tab QZ8'
+      device: 'tablet'
+    - regex: 'KYT31(?:[);/ ]|$)'
+      model: 'Qua Tab 01'
+      device: 'tablet'
+    - regex: 'KYV40U?(?:[);/ ]|$)'
       model: 'Rafre'
-    - regex: 'KYV33[;/) ]'
+    - regex: 'KYV33(?:[);/ ]|$)'
       model: 'Infobar A03'
-    - regex: 'KYY21[;/) ]'
+    - regex: 'KYY21(?:[);/ ]|$)'
       model: 'Urbano L01'
-    - regex: 'KYY22[;/) ]'
+    - regex: 'KYY22(?:[);/ ]|$)'
       model: 'Urbano L02'
-    - regex: 'KYY23[;/) ]'
+    - regex: 'KYY23(?:[);/ ]|$)'
       model: 'Urbano L03'
-    - regex: 'KYV31[;/) ]'
+    - regex: 'KYV31(?:[);/ ]|$)'
       model: 'Urbano V01'
-    - regex: 'KYV34[;/) ]'
+    - regex: 'KYV34(?:[);/ ]|$)'
       model: 'Urbano V02'
-    - regex: 'KYV(?:45|38)[;/) ]'
+    - regex: 'KYV(?:45|38)(?:[);/ ]|$)'
       model: 'Urbano V03'
     - regex: '(?:Kyocera-)?E6790(?:TM)?'
       model: 'DuraForce XD'
-    - regex: 'X3-KC[;/) ]'
+    - regex: 'X3-KC(?:[);/ ]|$)'
       model: 'One X3'
-    - regex: 'E6782[;/) ]'
+    - regex: 'E6782(?:[);/ ]|$)'
       model: 'Brigadier'
-    - regex: 'E6782L[;/) ]'
+    - regex: 'E6782L(?:[);/ ]|$)'
       model: 'DuraScout'
-    - regex: '(KC-S301AE)[;/) ]'
+    - regex: '(KC-S301AE)(?:[);/ ]|$)'
       model: '$1'
 
     # explicit feature phone models
@@ -7338,29 +7504,29 @@ Krüger&Matz:
       model: 'MOVE $1'
     - regex: 'DRIVE 4 mini LTE'
       model: 'DRIVE 4 mini LTE'
-    - regex: 'DRIVE (4[S]?)[;/) ]'
+    - regex: 'DRIVE (4[S]?)(?:[);/ ]|$)'
       model: 'DRIVE $1'
-    - regex: 'Drive 5[;/) ]'
+    - regex: 'Drive 5(?:[);/ ]|$)'
       model: 'DRIVE 5'
-    - regex: 'FLOW (4[S]?)[;/) ]'
+    - regex: 'FLOW (4[S]?)(?:[);/ ]|$)'
       model: 'FLOW $1'
-    - regex: 'LIVE4_(KM043[89])[;/) ]'
+    - regex: 'LIVE4_(KM043[89])(?:[);/ ]|$)'
       model: 'LIVE 4 $1'
-    - regex: 'KrugerMatz_LIVE4[;/) ]'
+    - regex: 'KrugerMatz_LIVE4(?:[);/ ]|$)'
       model: 'LIVE 4'
-    - regex: '_LIVE5_(KM0450)[;/) ]'
+    - regex: '_LIVE5_(KM0450)(?:[);/ ]|$)'
       model: 'LIVE 5 $1'
 
-    - regex: 'KM(106[67])[;/) ]'
+    - regex: 'KM(106[67])(?:[);/ ]|$)'
       device: 'tablet'
       model: 'EAGLE $1 10.1"'
-    - regex: 'KM(1065G)[;/) ]'
+    - regex: 'KM(1065G)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'EAGLE $1 10.1"'
-    - regex: 'KM0(701)_1[;/) ]'
+    - regex: 'KM0(701)_1(?:[);/ ]|$)'
       device: 'tablet'
       model: 'EAGLE $1 7.1"'
-    - regex: 'KM0(805)_1[;/) ]'
+    - regex: 'KM0(805)_1(?:[);/ ]|$)'
       device: 'tablet'
       model: 'EAGLE $1 8.0"'
 
@@ -7382,18 +7548,18 @@ AIS:
 
 # Lava
 Lava:
-  regex: 'Lava[ _]|iris[ _]?([^/;]+)(?:\)| Build)|A(?:67|76) Build|X1 Selfie Build|X41 Plus Build|(?:Flair Z1|PixelV1|Z61_2GB|A97 IPS)[/;) ]'
+  regex: 'Lava[ _]|iris[ _]?([^/;]+)(?:\)| Build)|A(?:67|76) Build|X1 Selfie Build|X41 Plus Build|(?:Flair Z1|PixelV1|Z61_2GB|A97 IPS)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Flair Z1[/;) ]'
+    - regex: 'Flair Z1(?:[);/ ]|$)'
       model: 'Flair Z1'
-    - regex: 'A97 IPS[/;) ]'
+    - regex: 'A97 IPS(?:[);/ ]|$)'
       model: 'A97 IPS'
     - regex: 'A67 Build'
       model: 'A67'
     - regex: 'A76 Build'
       model: 'A76'
-    - regex: 'PixelV1[/;) ]'
+    - regex: 'PixelV1(?:[);/ ]|$)'
       model: 'Pixel V1'
     - regex: 'X1 Selfie Build'
       model: 'Iris X1 Selfie'
@@ -7403,7 +7569,7 @@ Lava:
       model: 'A3'
     - regex: 'LAVA_R1'
       model: 'R1'
-    - regex: 'Z61_2GB[/;) ]'
+    - regex: 'Z61_2GB(?:[);/ ]|$)'
       model: 'Z61'
     - regex: 'iris[ _]?([^/;]+)(?:\)| Build)'
       model: 'Iris $1'
@@ -7422,9 +7588,13 @@ Landvo:
 
 # Land Rover
 Land Rover:
-  regex: 'Land[ ]?Rover[d]?[ _-](X1[0-9]|Explore|T878|L15\+|V18|V[168]|X)[;/) ]'
+  regex: 'Land[ ]?Rover[d]?[ _-](?:X1[0-9]|Explore|T878|L15\+|V18|V[168]|X)(?:[);/ ]|$)|Polar3'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: 'Land[ ]?Rover[d]?[ _-](X1[0-9]|Explore|T878|L15\+|V18|V[168]|X)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: 'Polar3'
+      model: 'Ioutdoor Polar 3'
 
 # lanix
 Lanix:
@@ -7498,19 +7668,19 @@ LCT:
       model: 'Le Pan Mini'
     - regex: 'TC970 ([^;/]+)Build'
       model: 'TC970 $1'
-    - regex: 'Le ?Pan ?(II|S)[);/ ]'
+    - regex: 'Le ?Pan ?(II|S)(?:[);/ ]|$)'
       model: 'Le Pan $1'
     - regex: 'Le ?Pan ?([^;/]+) Build'
       model: '$1'
 
 # Leagoo
 Leagoo:
-  regex: 'LEAGOO[ _-]?|(?:M5 EDGE|KIICAA (POWER|MIX)|Leapad[ _]7s|Elite 1|Venture 1)[);/ ]'
+  regex: 'LEAGOO[ _-]?|(?:M5 EDGE|KIICAA (POWER|MIX)|Leapad[ _]7s|Elite 1|Venture 1)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'LEAGOO[- _]M8[_-]?Pro[);/ ]'
+    - regex: 'LEAGOO[- _]M8[_-]?Pro(?:[);/ ]|$)'
       model: 'M8 Pro'
-    - regex: 'LEAGOO[- _](Z[156]|M[58]|T1)[);/ ]'
+    - regex: 'LEAGOO[- _](Z[156]|M[58]|T1)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'M5 EDGE'
       model: 'M5 Edge'
@@ -7520,9 +7690,9 @@ Leagoo:
       model: 'KICCAA Power'
     - regex: 'KIICAA MIX'
       model: 'KICCAA Mix'
-    - regex: 'Elite 1[);/ ]'
+    - regex: 'Elite 1(?:[);/ ]|$)'
       model: 'Elite 1'
-    - regex: 'Venture 1[);/ ]'
+    - regex: 'Venture 1(?:[);/ ]|$)'
       model: 'Venture 1'
 
     - regex: '(Leapad[ _]7s)'
@@ -7536,12 +7706,12 @@ Ledstar:
   models:
     - regex: 'Trendy 5.0'
       model: 'Trendy 5.0'
-    - regex: 'Ledstar_Novus_Premium_6.0[);/ ]'
+    - regex: 'Ledstar_Novus_Premium_6.0(?:[);/ ]|$)'
       model: 'Novus Premium 6.0"'
 
 # LeEco
 LeEco:
-  regex: 'Letv|LeEco|X[89]00\+[;/) ]|Le ?X[0-9][^;/]+|Le Max|Le [12]|X900 Build'
+  regex: 'Letv|LeEco|X[89]00\+(?:[);/ ]|$)|Le ?X[0-9][^;/]+|Le Max|Le [12]|X900 Build'
   device: 'smartphone'
   models:
     - regex: 'X800\+'
@@ -7592,7 +7762,7 @@ Lephone:
     - regex: 'lephone[ _](K7|K10)'
       device: 'feature phone'
       model: '$1'
-    - regex: 'lephone[ _](W(1[0125]|[279])|T2)[/;) ]'
+    - regex: 'lephone[ _](W(1[0125]|[279])|T2)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'lephone_W7_plus'
       model: 'W7 Plus'
@@ -7605,7 +7775,7 @@ Lenco:
 
 # lenovo
 Lenovo:
-  regex: '(?:LNV-)?Lenovo|IdeaTab|IdeaPad|Thinkpad|Yoga Tablet|Tab2A[0-9]-[0-9]{2}[a-z]?|TB2-X30L|TB3-710I|YT3-X50[ML]|ZUK[ -_]|K50a40|TB-(8504F|X304F|X704V|X704A)|A2107A-H|S6000[ ;)]|(Z2 Plus|VIBE Z2|Vibe K5( Plus)?|P2A42|L18011|[67]01LV|Z2131|K350t|VIBE X2|K31-t3|TAB 2 A8-50LC)[/;) ]'
+  regex: '(?:LNV-)?Lenovo|IdeaTab|IdeaPad|Thinkpad|Yoga Tablet|Tab2A[0-9]-[0-9]{2}[a-z]?|ZUK[ -_]|(?:TB2-X30L|TB3-710I|YT3-X50[ML]|K50a40|TB-(?:8504F|X304F|X704V|X704A)|A2107A-H|S6000|Z2 Plus|VIBE Z2|Vibe K5(?: Plus)?|P2A42|L18011|[5-8]01LV|Z2131|K350t|VIBE X2|K31-t3|TAB 2 A8-50LC)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Lenovo ?G780'
@@ -7641,19 +7811,25 @@ Lenovo:
     - regex: 'TAB 2 A8-50LC'
       model: 'TAB2 A8-50LC'
       device: 'tablet'
-    - regex: '(?:TB3-850[FM]|601LV)[/;) ]'
+    - regex: '501LV(?:[);/ ]|$)'
+      model: 'TAB2 8.0"'
+      device: 'tablet'
+    - regex: '(?:TB3-850[FM]|601LV)(?:[);/ ]|$)'
       model: 'TAB3 8'
       device: 'tablet'
     - regex: 'Lenovo TB-X304[FL]'
       model: 'TAB4 10'
       device: 'tablet'
-    - regex: '(?:TB-X704V|701LV)[/;) ]'
+    - regex: '(?:TB-X704[VL]|701LV)(?:[);/ ]|$)'
       model: 'TAB4 10 Plus'
       device: 'tablet'
-    - regex: 'TB-X704A[/;) ]'
+    - regex: '801LV(?:[);/ ]|$)'
+      model: 'TAB5 10.1"'
+      device: 'tablet'
+    - regex: 'TB-X704A(?:[);/ ]|$)'
       model: 'Moto Tab'
       device: 'tablet'
-    - regex: 'TB-X605F[/;) ]'
+    - regex: 'TB-X605F(?:[);/ ]|$)'
       model: 'Tab M10'
       device: 'tablet'
     - regex: 'Lenovo ?B8000(-[FH])?'
@@ -7681,7 +7857,7 @@ Lenovo:
       model: 'Yoga Tab 3 10'
       device: 'tablet'
 
-    - regex: 'S6000[/;) ]'
+    - regex: 'S6000(?:[);/ ]|$)'
       model: 'IdeaTab S6000'
       device: 'tablet'
     - regex: 'Lenovo ([ASB][0-9]{4})[A-Z]?\-[EHF]'
@@ -7729,7 +7905,7 @@ Lenovo:
     - regex: 'Lenovo (TB[0-9]?\-[a-z0-9\-]+) Build'
       model: '$1'
       device: 'tablet'
-    - regex: 'L18011[/;) ]'
+    - regex: 'L18011(?:[);/ ]|$)'
       model: 'A5'
     - regex: 'Z2 Plus'
       model: 'Z2 Plus'
@@ -7741,53 +7917,53 @@ Lenovo:
       model: 'ZUK Z2 Pro'
     - regex: 'ZUK[ -_]([^/;]*)(?: Build|\))'
       model: 'ZUK $1'
-    - regex: 'K10a40[/;) ]'
+    - regex: 'K10a40(?:[);/ ]|$)'
       model: 'C2'
-    - regex: 'k50a40[/;) ]'
+    - regex: 'k50a40(?:[);/ ]|$)'
       model: 'K3 Note'
-    - regex: 'A7010a48[/;) ]'
+    - regex: 'A7010a48(?:[);/ ]|$)'
       model: 'K4 Note'
-    - regex: 'K350t[/;) ]'
+    - regex: 'K350t(?:[);/ ]|$)'
       model: 'K5'
-    - regex: 'A7020a4[08][/;) ]'
+    - regex: 'A7020a4[08](?:[);/ ]|$)'
       model: 'K5 Note'
-    - regex: 'K31-t3[/;) ]'
+    - regex: 'K31-t3(?:[);/ ]|$)'
       model: 'K31'
-    - regex: '(?:A6020a46|Vibe K5 Plus)[/;) ]'
+    - regex: '(?:A6020a46|Vibe K5 Plus)(?:[);/ ]|$)'
       model: 'Vibe K5 Plus'
-    - regex: '(?:Lenovo-)?(?:A6020(?:a40|l36)|Vibe K5)[/;) ]'
+    - regex: '(?:Lenovo-)?(?:A6020(?:a40|l36)|Vibe K5)(?:[);/ ]|$)'
       model: 'Vibe K5'
-    - regex: 'VIBE Z2[);/ ]'
+    - regex: 'VIBE Z2(?:[);/ ]|$)'
       model: 'Vibe Z2'
-    - regex: 'VIBE X2[);/ ]'
+    - regex: 'VIBE X2(?:[);/ ]|$)'
       model: 'Vibe X2'
-    - regex: 'k33a48[/;) ]'
+    - regex: 'k33a48(?:[);/ ]|$)'
       model: 'K6'
-    - regex: 'P2A42[);/ ]'
+    - regex: 'P2A42(?:[);/ ]|$)'
       model: 'P2'
-    - regex: 'k53a48[/;) ]'
+    - regex: 'k53a48(?:[);/ ]|$)'
       model: 'K6 Note'
-    - regex: 'K33a42[/;) ]'
+    - regex: 'K33a42(?:[);/ ]|$)'
       model: 'K6 Power'
-    - regex: 'P1ma40[/;) ]'
+    - regex: 'P1ma40(?:[);/ ]|$)'
       model: 'Vibe P1m'
-    - regex: 'P1a42[/;) ]'
+    - regex: 'P1(?:a42|c72)(?:[);/ ]|$)'
       model: 'Vibe P1'
-    - regex: 'A2016a40[/;) ]'
+    - regex: 'A2016a40(?:[);/ ]|$)'
       model: 'Vibe B'
-    - regex: 'A1010a20[/;) ]'
+    - regex: 'A1010a20(?:[);/ ]|$)'
       model: 'A Plus'
-    - regex: 'Z90a40[/;) ]'
+    - regex: 'Z90a40(?:[);/ ]|$)'
       model: 'Vibe Shot'
-    - regex: 'S1a40[/;) ]'
+    - regex: 'S1a40(?:[);/ ]|$)'
       model: 'Vibe S1'
-    - regex: 'L78071[/;) ]'
+    - regex: 'L78071(?:[);/ ]|$)'
       model: 'Z5s'
-    - regex: 'L58041[/;) ]'
+    - regex: 'L58041(?:[);/ ]|$)'
       model: 'S5 Pro'
-    - regex: 'L18021[/;) ]'
+    - regex: 'L18021(?:[);/ ]|$)'
       model: 'A3'
-    - regex: 'PB2-670M[/;) ]'
+    - regex: 'PB2-670M(?:[);/ ]|$)'
       model: 'Phab 2'
     - regex: 'Lenovo ([^/;]*) Build'
       model: '$1'
@@ -7796,7 +7972,7 @@ Lenovo:
 
 # Lexand
 Lexand:
-  regex: '(?:SC7 PRO HD|S5A[1-4]|S4A[1-5]|S6A1|A811|A802)[);/ ]|Lexand ([^;/]+) Build'
+  regex: '(?:SC7 PRO HD|S5A[1-4]|S4A[1-5]|S6A1|A811|A802)(?:[);/ ]|$)|Lexand ([^;/]+) Build'
   device: 'smartphone'
   models:
     - regex: 'A(811|802)'
@@ -7885,7 +8061,7 @@ Lexibook:
 
 # LG
 LG:
-  regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713|(LM-[A-Z][0-9]{3}[A-Z]{0,3}(?:\(FGN?\)|\(G\)|\.FN|\.F(?:GN?)?)?)|LM-(X625N1|G820QM[0127]))[);/ ]|NetCast|RS98[78]|RS500|VS(?:50[01]|835|876|880|98[0578]|99[056]|(410|415|425|500|880)PP)|Nexsus 5|LML(41[34]D|211B|713D|212V)L|VK810 4G|VK815|X5-LG|L-05D|L-03K|L-01[LK]|L-51A|901LG'
+  regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713|(LM-[A-Z][0-9]{3}[A-Z]{0,3}(?:\(FGN?\)|\(G\)|\.FN|\.F(?:GN?)?)?)|LM-(X625N1|G820QM[0127]))(?:[);/ ]|$)|NetCast|RS98[78]|RS500|VS(?:50[01]|835|876|880|98[0578]|99[056]|(410|415|425|500|880)PP)|Nexsus 5|LML(41[34]D|211B|713D|212V)L|VK810 4G|VK815|X5-LG|L-05D|L-03K|L-01[LJK]|L-[45]1A|901LG|A001LG|802LG'
   device: 'smartphone'
   models:
     - regex: 'LG-D325'
@@ -7932,7 +8108,7 @@ LG:
       model: 'G8'
     - regex: 'LM-G810'
       model: 'G8S ThinQ'
-    - regex: '901LG[);/ ]'
+    - regex: '901LG(?:[);/ ]|$)'
       model: 'G8X ThinQ'
     - regex: 'VS501'
       model: 'K20'
@@ -7946,15 +8122,15 @@ LG:
       model: 'Risio 2'
     - regex: '(?:LG-)?P500H'
       model: 'Optimus One'
-    - regex: 'L-05D[);/ ]'
+    - regex: 'L-05D(?:[);/ ]|$)'
       model: 'Optimus it L-05D'
-    - regex: 'LG-L160L[);/ ]'
+    - regex: 'LG-L160L(?:[);/ ]|$)'
       model: 'Optimus LTE 2'
-    - regex: 'P713[);/ ]'
+    - regex: 'P713(?:[);/ ]|$)'
       model: 'Optimus L7II'
-    - regex: 'L-01D[);/ ]'
+    - regex: 'L-01D(?:[);/ ]|$)'
       model: 'Optimus LTE L-01D'
-    - regex: 'L-02D[);/ ]'
+    - regex: 'L-02D(?:[);/ ]|$)'
       model: 'PRADA phone L-02D'
     - regex: 'L-07C'
       model: 'Optimus Bright L-07C'
@@ -7962,22 +8138,24 @@ LG:
       model: 'V20'
     - regex: 'LM-Q710(?:\(FGN\)|[\.]?FGN)'
       model: 'Q Stylus Plus'
-    - regex: 'LM-Q[67]10\.FG[);/ ]'
+    - regex: 'LM-Q[67]10\.FG(?:[);/ ]|$)'
       model: 'Q7'
-    - regex: 'LM-(Q725[KL]|Q610.FGN)[);/ ]'
+    - regex: 'LM-(Q725[KL]|Q610.FGN)(?:[);/ ]|$)'
       model: 'Q7+'
-    - regex: 'LM-Q815[SL][);/ ]'
+    - regex: 'LM-Q815[SL](?:[);/ ]|$)'
       model: 'Q8+'
-    - regex: 'LM-Q925L[);/ ]'
+    - regex: 'LM-Q925L(?:[);/ ]|$)'
       model: 'Q9'
-    - regex: 'LGV33[);/ ]'
+    - regex: 'LGV33(?:[);/ ]|$)'
       model: 'Qua Phone PX'
-    - regex: 'L-03K[);/ ]'
+    - regex: 'L-03K(?:[);/ ]|$)'
       model: 'Style'
-    - regex: 'L-01L[);/ ]'
+    - regex: 'L-01L(?:[);/ ]|$)'
       model: 'Style 2'
-    - regex: 'VS835[);/ ]'
+    - regex: 'VS835(?:[);/ ]|$)'
       model: 'Stylo 2 V'
+    - regex: 'L-41A(?:[);/ ]|$)'
+      model: 'Style 3'
     - regex: 'LM-Q710|LML713DL'
       model: 'Stylo 4'
     - regex: 'LM-Q720'
@@ -7986,9 +8164,9 @@ LG:
       model: 'G7 ThinQ'
     - regex: 'LM-X210CM'
       model: 'Fortune 2'
-    - regex: 'LM-X410\.F[);/ ]'
+    - regex: 'LM-X410\.F(?:[);/ ]|$)'
       model: 'Premier Pro'
-    - regex: 'LML41[34]DL[);/ ]'
+    - regex: 'LML41[34]DL(?:[);/ ]|$)'
       model: 'Premier Pro LTE'
     - regex: 'LM-X525'
       model: 'Q60'
@@ -8018,6 +8196,8 @@ LG:
       model: 'K5'
     - regex: 'LM-X540'
       model: 'K50S'
+    - regex: '802LG'
+      model: 'K50'
     - regex: '(?:LM-X510[KLS]|X5-LG)'
       model: 'X5'
     - regex: 'LM-X625N1'
@@ -8056,10 +8236,14 @@ LG:
       model: 'V20'
     - regex: 'VS996'
       model: 'V30'
-    - regex: 'L-01K[);/ ]'
+    - regex: 'L-01J(?:[);/ ]|$)'
+      model: 'V20 Pro'
+    - regex: 'L-01K(?:[);/ ]|$)'
       model: 'V30 Plus'
-    - regex: 'L-51A[);/ ]'
+    - regex: 'L-51A(?:[);/ ]|$)'
       model: 'V60'
+    - regex: 'A001LG(?:[);/ ]|$)'
+      model: 'V60 ThinQ 5G'
     - regex: '(?:LG-)?VS410PP'
       model: 'Optimus Zone'
     - regex: 'LM-V350[N]?'
@@ -8202,9 +8386,12 @@ Logicom:
       model: 'L-ixir Tab $1'
     - regex: 'L-ITE[ _]([^;/]+) Build'
       model: 'L-ite Tab $1'
+    - regex: 'L-EMENT (400)(?:[);/ ]|$)'
+      model: 'L-ement $1'
+      device: 'smartphone'
     - regex: 'L-?EMENT[ _](?:TAB)?([^;/]+) Build'
       model: 'L-ement Tab $1'
-    - regex: '(TAB950|TAB1062|E731|E812|E912|E1031)[);/ ]'
+    - regex: '(TAB950|TAB1062|E731|E812|E912|E1031)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'POWER BOT'
       model: 'POWER BOT'
@@ -8213,28 +8400,28 @@ Logicom:
     - regex: 'Le Lift'
       model: 'Le Lift'
       device: 'smartphone'
-    - regex: 'Le Hola FR[);/ ]'
+    - regex: 'Le Hola FR(?:[);/ ]|$)'
       model: 'Le Hola FR'
       device: 'smartphone'
-    - regex: 'Le[ _]Hola[);/ ]'
+    - regex: 'Le[ _]Hola(?:[);/ ]|$)'
       model: 'Le Hola'
       device: 'smartphone'
-    - regex: 'LeMoov2[);/ ]'
+    - regex: 'LeMoov2(?:[);/ ]|$)'
       model: 'Le Moov 2'
       device: 'smartphone'
-    - regex: 'LeMoov[);/ ]'
+    - regex: 'LeMoov(?:[);/ ]|$)'
       model: 'Le Moov'
       device: 'smartphone'
-    - regex: 'Le Fit FR[);/ ]'
+    - regex: 'Le Fit FR(?:[);/ ]|$)'
       model: 'Le Fit FR'
       device: 'smartphone'
-    - regex: 'Le Hop[);/ ]'
+    - regex: 'Le Hop(?:[);/ ]|$)'
       model: 'Le Hop'
       device: 'smartphone'
-    - regex: 'Le Smooth FR[);/ ]'
+    - regex: 'Le Smooth FR(?:[);/ ]|$)'
       model: 'Le Smooth FR'
       device: 'smartphone'
-    - regex: 'Le Smooth[);/ ]'
+    - regex: 'Le Smooth(?:[);/ ]|$)'
       model: 'Le Smooth'
       device: 'smartphone'
 
@@ -8259,18 +8446,18 @@ Konka:
 
 # Konrow
 Konrow:
-  regex: '(?:BIGCOOL|COOLFIVE|COOL-K|Just5|Link5)[);/ ]'
+  regex: '(?:BIGCOOL|COOLFIVE|COOL-K|Just5|Link5)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'BIGCOOL[);/ ]'
+    - regex: 'BIGCOOL(?:[);/ ]|$)'
       model: 'BigCool'
-    - regex: 'COOL-K[);/ ]'
+    - regex: 'COOL-K(?:[);/ ]|$)'
       model: 'Cool-K'
-    - regex: 'COOLFIVE[);/ ]'
+    - regex: 'COOLFIVE(?:[);/ ]|$)'
       model: 'Cool Five'
-    - regex: 'Just5[);/ ]'
+    - regex: 'Just5(?:[);/ ]|$)'
       model: 'Just 5'
-    - regex: 'Link5[);/ ]'
+    - regex: 'Link5(?:[);/ ]|$)'
       model: 'Link 5'
 
 # Karbonn
@@ -8338,20 +8525,20 @@ Sagem:
 
 # Coby Kyros
 Coby Kyros:
-  regex: '(MID(?:1024|1125|1126|1045|1048|1060|1065|4331|7012|7015A?|7016|7022|7032|7035|7036|7042|7047|7048|7052|7065|7120|8024|8042|8048|8065|8125|8127|8128|9724|9740|9742))[);/ ]'
+  regex: '(MID(?:1024|1125|1126|1045|1048|1060|1065|4331|7012|7015A?|7016|7022|7032|7035|7036|7042|7047|7048|7052|7065|7120|8024|8042|8048|8065|8125|8127|8128|9724|9740|9742))(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Mpman
 Mpman:
-  regex: '(?:MPQC|MPDC)[0-9]+|PH(?:150|340|350|360|451|500|520)|(?:MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP100i OCTA|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7)[);/ ]'
+  regex: '(?:MPQC|MPDC)[0-9]+|PH(?:150|340|350|360|451|500|520)|(?:MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP100i OCTA|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: '((?:MPQC|MPDC)[0-9]+[^/;)]+)(?: Build|\))'
       model: '$1'
-    - regex: 'MP100i OCTA[);/ ]'
+    - regex: 'MP100i OCTA(?:[);/ ]|$)'
       model: 'MP100i OCTA'
-    - regex: '(MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7)[);/ ]'
+    - regex: '(MID(?:7C|74C|82C|84C|801|811|701|711|170|77C|43C|102C|103C|104C|114C)|MP(?:843|717|718|1010|7007|7008|843|888|959|969)|MGP7)(?:[);/ ]|$)'
       model: '$1'
     - regex: '(PH(?:150|340|350|360|451|500|520))'
       model: '$1'
@@ -8362,7 +8549,7 @@ Majestic:
   regex: 'MAJESTIC[ _-]|CRONO ?[0-9]+|TAB (?:647|411) 3G|URANO 77LTE'
   device: 'smartphone'
   models:
-      - regex: 'URANO 77LTE[);/ ]'
+      - regex: 'URANO 77LTE(?:[);/ ]|$)'
         model: 'Urano 77 LTE'
       - regex: 'TAB (647|411) 3G'
         model: 'Tab $1 3G'
@@ -8370,24 +8557,24 @@ Majestic:
       - regex: 'MAJESTIC[ _]Tab([^;/]+)Build'
         model: 'Tab$1'
         device: 'tablet'
-      - regex: 'MAJESTIC[ _]Tab([^);/]+)[);/]'
+      - regex: 'MAJESTIC[ _]Tab([^);/]+)(?:[);/]|$)'
         model: 'Tab$1'
         device: 'tablet'
       - regex: 'MAJESTIC[ _]([^;/]+)Build'
         model: '$1'
-      - regex: 'MAJESTIC[ _]([^);/]+)[);/]'
+      - regex: 'MAJESTIC[ _]([^);/]+)(?:(?:[);/ ]|$)|$)'
         model: '$1'
       - regex: 'CRONO ?([0-9]+) Build'
         model: 'Crono $1'
-      - regex: 'CRONO ?([0-9]+)[);/]'
+      - regex: 'CRONO ?([0-9]+)(?:[);/]|$)'
         model: 'Crono $1'
 
 # Manta Multimedia
 Manta Multimedia:
-  regex: 'MSP950(1[45]|2[01])|MSP96017|((?<!/)MID713|MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|901|1001|1002|1003|1004(?: 3G)?|1005|1009|1010|7802|9701|9702))[);/ ]'
+  regex: 'MSP950(1[45]|2[01])|MSP96017|((?<!/)MID713|MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|901|1001|1002|1003|1004(?: 3G)?|1005|1009|1010|7802|9701|9702))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '((?<!/)MID713|MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|901|1001|1002|1003|1004(?: 3G)?|1005|1009|1010|7802|9701|9702))[);/ ]'
+    - regex: '((?<!/)MID713|MID(?:06[SN]|08[S]?|12|13|14|15|701|702|703|704|705(?:DC)?|706[AS]?|707|708|709|711|712|714|717|781|801|802|901|1001|1002|1003|1004(?: 3G)?|1005|1009|1010|7802|9701|9702))(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1'
     - regex: 'MSP95014'
@@ -8406,20 +8593,20 @@ Masstel:
   regex: 'Masstel'
   device: 'smartphone'
   models:
-    - regex: 'Masstel[_ ](Juno[_ ]Q3|X9|N4[56]0|N5[2458]0|N536|M05|M1[29]0|M1[125]|M250|M25)[);/ ]'
+    - regex: 'Masstel[_ ](Juno[_ ]Q3|X9|N4[56]0|N5[2458]0|N536|M05|M1[29]0|M1[125]|M250|M25)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'Masstel[_ ]\((M18)\)'
       model: '$1'
-    - regex: 'Masstel_Tab7LTE[);/ ]'
+    - regex: 'Masstel_Tab7LTE(?:[);/ ]|$)'
       model: 'Tab 7 LTE'
       device: 'tablet'
-    - regex: 'Masstel Tab (840|700i)[);/ ]'
+    - regex: 'Masstel Tab (840|700i)(?:[);/ ]|$)'
       model: 'Tab $1'
       device: 'tablet'
 
 # Maxwest
 Maxwest:
-  regex: '(?:Astro_5N_LTE|Virtue Z5|Astro X55s|Nitro_4)[);/ ]'
+  regex: '(?:Astro_5N_LTE|Virtue Z5|Astro X55s|Nitro_4)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Astro_5N_LTE'
@@ -8433,117 +8620,119 @@ Maxwest:
 
 # Maze
 Maze:
-  regex: '(?:SSB-500|Alpha[_ ]X|SSB504R)[);/ ]'
+  regex: '(?:SSB-500|Alpha[_ ]X|Maze Alpha|SSB504R)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'SSB-500[);/ ]'
+    - regex: 'SSB-500(?:[);/ ]|$)'
       model: 'SSB-500'
-    - regex: 'SSB504R[);/ ]'
+    - regex: 'SSB504R(?:[);/ ]|$)'
       model: 'Speed'
-    - regex: 'Alpha[_ ]X[);/ ]'
+    - regex: 'Alpha[_ ]X(?:[);/ ]|$)'
       model: 'Alpha X'
+    - regex: 'Maze Alpha(?:[);/ ]|$)'
+      model: 'Alpha'
 
 # Mediacom
 Mediacom:
-  regex: '(?:SmartPad7503G|M-SP10MXA|SmartPad970s2(?:3G)?|M[_-][MPS]P[0-9a-z]+|M-IPRO[0-9a-z]+)[);/ ]'
+  regex: '(?:SmartPad7503G|M-SP10MXA|SmartPad970s2(?:3G)?|M[_-][MPS]P[0-9a-z]+|M-IPRO[0-9a-z]+)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'SmartPad7503G[);/ ]'
+    - regex: 'SmartPad7503G(?:[);/ ]|$)'
       model: 'SmartPad 750 3G'
-    - regex: 'SmartPad970s23G[);/ ]'
+    - regex: 'SmartPad970s23G(?:[);/ ]|$)'
       model: 'SmartPad 970 S2 3G'
-    - regex: 'SmartPad970s2[);/ ]'
+    - regex: 'SmartPad970s2(?:[);/ ]|$)'
       model: 'SmartPad 970 S2'
-    - regex: 'M-MP84[02]M[);/ ]'
+    - regex: 'M-MP84[02]M(?:[);/ ]|$)'
       model: 'SmartPad 8.0 Mobile'
-    - regex: 'M-MP940M[);/ ]'
+    - regex: 'M-MP940M(?:[);/ ]|$)'
       model: 'SmartPad 9.7 Mobile'
-    - regex: 'M-SP10MXA[);/ ]'
+    - regex: 'M-SP10MXA(?:[);/ ]|$)'
       model: 'SmartPad MX 10'
-    - regex: 'M-MP(?:710|720|725|726|740)GOx?[);/ ]'
+    - regex: 'M-MP(?:710|720|725|726|740)GOx?(?:[);/ ]|$)'
       model: 'SmartPad 7.0 Go'
-    - regex: 'M-MP876S2[);/ ]'
+    - regex: 'M-MP876S2(?:[);/ ]|$)'
       model: 'SmartPad 8.0 S2'
-    - regex: 'M-MP8S2[AB]?3G[);/ ]'
+    - regex: 'M-MP8S2[AB]?3G(?:[);/ ]|$)'
       model: 'SmartPad 8.0 S2 3G'
-    - regex: 'M-MP(101|102|860|875)S2[BW]?[);/ ]'
+    - regex: 'M-MP(101|102|860|875)S2[BW]?(?:[);/ ]|$)'
       model: 'SmartPad $1 S2'
-    - regex: 'M-MP85S23G[);/ ]'
+    - regex: 'M-MP85S23G(?:[);/ ]|$)'
       model: 'SmartPad 875 S2 3G'
     - regex: 'M-SP1AGO3G'
       model: 'SmartPad 10 Go 3G'
-    - regex: 'M-MP10[45][01]S2[);/ ]'
+    - regex: 'M-MP10[45][01]S2(?:[);/ ]|$)'
       model: 'SmartPad 10.1 S2'
-    - regex: 'M-MP1S2[AB]3G[);/ ]'
+    - regex: 'M-MP1S2[AB]3G(?:[);/ ]|$)'
       model: 'SmartPad 10.1 S2 3G'
-    - regex: 'M-MP8[24]S4[);/ ]'
+    - regex: 'M-MP8[24]S4(?:[);/ ]|$)'
       model: 'SmartPad 8.0 S4'
-    - regex: 'M-MP8S4[AB]3G[);/ ]'
+    - regex: 'M-MP8S4[AB]3G(?:[);/ ]|$)'
       model: 'SmartPad 8.0 S4 3G'
-    - regex: 'M-MP9S4A3G[);/ ]'
+    - regex: 'M-MP9S4A3G(?:[);/ ]|$)'
       model: 'SmartPad 9.7 S4 3G'
-    - regex: 'M-MP1[02]S4[);/ ]'
+    - regex: 'M-MP1[02]S4(?:[);/ ]|$)'
       model: 'SmartPad 10.1 S4'
-    - regex: 'M-MP1040MC?[);/ ]'
+    - regex: 'M-MP1040MC?(?:[);/ ]|$)'
       model: 'SmartPad 10.1 HD S4 3G'
-    - regex: 'M-MP1S4[AB]3G[);/ ]'
+    - regex: 'M-MP1S4[AB]3G(?:[);/ ]|$)'
       model: 'SmartPad 10.1 S4 3G'
-    - regex: 'M-MP8PA3G[);/ ]'
+    - regex: 'M-MP8PA3G(?:[);/ ]|$)'
       model: 'SmartPad 8.0 HD Pro 3G'
-    - regex: 'M-MP10PA[);/ ]'
+    - regex: 'M-MP10PA(?:[);/ ]|$)'
       model: 'SmartPad 10.1 HD Pro'
-    - regex: 'M-MP10PA3G[);/ ]'
+    - regex: 'M-MP10PA3G(?:[);/ ]|$)'
       model: 'SmartPad 10.1 HD Pro 3G'
-    - regex: 'M-IPRO([18][01]0)[BW][);/ ]'
+    - regex: 'M-IPRO([18][01]0)[BW](?:[);/ ]|$)'
       model: 'SmartPad 8.0 HD iPro$1 3G'
 
-    - regex: '(?:M-MP75S23G|M-MP72[01]M)[);/ ]'
+    - regex: '(?:M-MP75S23G|M-MP72[01]M)(?:[);/ ]|$)'
       model: 'SmartPad 7.0 Mobile'
       device: 'phablet'
-    - regex: 'M-MP7S2[ABDK]3G[);/ ]'
+    - regex: 'M-MP7S2[ABDK]3G(?:[);/ ]|$)'
       model: 'SmartPad 7.0 S2 3G'
       device: 'phablet'
-    - regex: 'M-MP5303G[);/ ]'
+    - regex: 'M-MP5303G(?:[);/ ]|$)'
       model: 'SmartPad Mini Mobile'
       device: 'phablet'
-    - regex: 'M-PPxB400[);/ ]'
+    - regex: 'M-PPxB400(?:[);/ ]|$)'
       model: 'PhonePad Duo B400'
       device: 'phablet'
-    - regex: 'M-PPAG550[);/ ]'
+    - regex: 'M-PPAG550(?:[);/ ]|$)'
       model: 'PhonePad Duo G550'
       device: 'phablet'
-    - regex: 'M-PP2G530[);/ ]'
+    - regex: 'M-PP2G530(?:[);/ ]|$)'
       model: 'PhonePad Duo G530'
       device: 'phablet'
-    - regex: 'M-PPG700[);/ ]'
+    - regex: 'M-PPG700(?:[);/ ]|$)'
       model: 'PhonePad Duo G700'
       device: 'phablet'
-    - regex: 'M-PPxS531[);/ ]'
+    - regex: 'M-PPxS531(?:[);/ ]|$)'
       model: 'PhonePad Duo S531'
       device: 'phablet'
-    - regex: 'M-PP2S550[);/ ]'
+    - regex: 'M-PP2S550(?:[);/ ]|$)'
       model: 'PhonePad Duo S550'
       device: 'phablet'
-    - regex: 'M-PP2S650C?[);/ ]'
+    - regex: 'M-PP2S650C?(?:[);/ ]|$)'
       model: 'PhonePad Duo S650'
       device: 'phablet'
-    - regex: 'M-PPxS551U[);/ ]'
+    - regex: 'M-PPxS551U(?:[);/ ]|$)'
       model: 'PhonePad Duo S551U'
       device: 'phablet'
 
-    - regex: 'M-PP[ABC]G500[);/ ]'
+    - regex: 'M-PP[ABC]G500(?:[);/ ]|$)'
       model: 'PhonePad Duo G500'
       device: 'smartphone'
-    - regex: 'M-PP2S500[BC]?[);/ ]'
+    - regex: 'M-PP2S500[BC]?(?:[);/ ]|$)'
       model: 'PhonePad Duo S500'
       device: 'smartphone'
-    - regex: 'M[_-]PP[Ax]X(470|510|520)U[);/ ]'
+    - regex: 'M[_-]PP[Ax]X(470|510|520)U(?:[);/ ]|$)'
       model: 'PhonePad Duo X$1U'
       device: 'smartphone'
-    - regex: 'M-PPxG(400|501)[);/ ]'
+    - regex: 'M-PPxG(400|501)(?:[);/ ]|$)'
       model: 'PhonePad Duo G$1'
       device: 'smartphone'
-    - regex: 'M-PPxS(470|501)[);/ ]'
+    - regex: 'M-PPxS(470|501)(?:[);/ ]|$)'
       model: 'PhonePad Duo S$1'
       device: 'smartphone'
 
@@ -8552,20 +8741,20 @@ Mediacom:
 
 # Medion
 Medion:
-  regex: 'Medion|(?:MD_)?LIFETAB|([SPX]10[0-9]{2}X|E10[45]1X|X5001|P851X|P850X)[);/ ]'
+  regex: 'Medion|(?:MD_)?LIFETAB|([SPX]10[0-9]{2}X|E10[45]1X|X5001|P851X|P850X)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '(?:MD_)?LIFETAB_([a-z0-9]+)'
       device: 'tablet'
       model: 'Lifetab $1'
-    - regex: '(E450[46]|E5004|S5004|X5001|E5020|P5015)[);/ ]'
+    - regex: '(E450[46]|E5004|S5004|X5001|E5020|P5015)(?:[);/ ]|$)'
       model: 'Life $1'
-    - regex: '(B5530)[);/ ]'
+    - regex: '(B5530)(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(E10[45]1X)[);/ ]'
+    - regex: '(E10[45]1X)(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1'
-    - regex: '([SPX]10[0-9]{2}X|P851X|P850X)[);/ ]'
+    - regex: '([SPX]10[0-9]{2}X|P851X|P850X)(?:[);/ ]|$)'
       model: 'Lifetab $1'
       device: 'tablet'
     - regex: 'Medion(?: Smartphone)? ([^/;]+) Build'
@@ -8583,30 +8772,30 @@ MEEG:
 
 # Meizu
 Meizu:
-  regex: 'Meizu|MZ-[a-z]|(M04[05]|MZ-16th(?: Plus)?|MZ-16[st]|M7[12]1C|M35[1356]|M612C|M578CA|M181[36]|M1822|M681C|M6T|MX[ -]?[2345](?: Pro)?|(?:MZ-)?m[1-6] note|M621C|M1852|M57[18]C|M3[ESX]|M031|m1 metal|M1 E|M2|M2 E|M5s Build|PRO 6|PRO 7-H|MZ-15 (?:Lite|Plus)|MZ-16 X)[);/ ]'
+  regex: 'Meizu|MZ-[a-z]|(M04[05]|MZ-16th(?: Plus)?|MZ-16[st]|M7[12]1C|M35[1356]|M612C|M578CA|M181[36]|M1822|M681C|M6T|MX[ -]?[2345](?: Pro)?|(?:MZ-)?m[1-6] note|M621C|M1852|M57[18]C|M3[ESX]|M031|m1 metal|M1 E|M2|M2 E|M5s Build|PRO 6|PRO 7-H|MZ-15 (?:Lite|Plus)|MZ-16 X)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: '(?:MZ-)?M571C'
       device: 'phablet'
       model: 'M2 Note'
-    - regex: '(?:MZ-)?m([1-6]) note[);/ ]'
+    - regex: '(?:MZ-)?m([1-6]) note(?:[);/ ]|$)'
       device: 'phablet'
       model: 'M$1 Note'
-    - regex: 'M1 E[);/ ]'
+    - regex: 'M1 E(?:[);/ ]|$)'
       model: 'M1E'
-    - regex: 'M2 E[);/ ]'
+    - regex: 'M2 E(?:[);/ ]|$)'
       model: 'M2E'
-    - regex: '(?:MZ-)?M578C[A]?|M2[);/ ]'
+    - regex: '(?:MZ-)?M578C[A]?|M2(?:[);/ ]|$)'
       model: 'M2'
-    - regex: 'M681C[);/ ]'
+    - regex: 'M681C(?:[);/ ]|$)'
       model: 'M3 Note'
       device: 'phablet'
-    - regex: 'M621C[);/ ]'
+    - regex: 'M621C(?:[);/ ]|$)'
       model: 'M5 Note'
       device: 'phablet'
-    - regex: 'M711C[);/ ]'
+    - regex: 'M711C(?:[);/ ]|$)'
       model: 'M6'
-    - regex: 'M721C[);/ ]'
+    - regex: 'M721C(?:[);/ ]|$)'
       model: 'M6 Note'
       device: 'phablet'
     - regex: 'M6T'
@@ -8619,45 +8808,45 @@ Meizu:
       model: 'M3X'
     - regex: 'M5S|M612C'
       model: 'M5S'
-    - regex: '(M04[05]|MX[ -]?2)[);/ ]'
+    - regex: '(M04[05]|MX[ -]?2)(?:[);/ ]|$)'
       model: 'MX2'
-    - regex: '(M35[1356]|MX[ -]?3)[);/ ]'
+    - regex: '(M35[1356]|MX[ -]?3)(?:[);/ ]|$)'
       model: 'MX3'
-    - regex: 'MX[ -]?4 Pro[);/ ]'
+    - regex: 'MX[ -]?4 Pro(?:[);/ ]|$)'
       model: 'MX4 Pro'
-    - regex: 'MX[ -]?4[);/ ]'
+    - regex: 'MX[ -]?4(?:[);/ ]|$)'
       model: 'MX4'
-    - regex: 'MX[ -]?5[);/ ]'
+    - regex: 'MX[ -]?5(?:[);/ ]|$)'
       model: 'MX5'
     - regex: 'm1 metal'
       model: 'M1 Metal'
-    - regex: 'M1813[);/ ]'
+    - regex: 'M1813(?:[);/ ]|$)'
       model: 'M8'
-    - regex: 'M1816[);/ ]'
+    - regex: 'M1816(?:[);/ ]|$)'
       model: 'M8 Lite'
     - regex: 'PRO 6'
       model: 'PRO 6'
-    - regex: 'PRO 7-H[);/ ]'
+    - regex: 'PRO 7-H(?:[);/ ]|$)'
       model: 'PRO 7'
-    - regex: 'M031[);/ ]'
+    - regex: 'M031(?:[);/ ]|$)'
       model: 'MX Dual Core'
-    - regex: 'M1852[);/ ]'
+    - regex: 'M1852(?:[);/ ]|$)'
       model: 'X8'
-    - regex: 'M1822[);/ ]'
+    - regex: 'M1822(?:[);/ ]|$)'
       model: 'Note 8'
-    - regex: 'MZ-16T[);/ ]'
+    - regex: 'MZ-16T(?:[);/ ]|$)'
       model: '16T'
-    - regex: 'MZ-16th Plus[);/ ]'
+    - regex: 'MZ-16th Plus(?:[);/ ]|$)'
       model: '16th Plus'
-    - regex: 'MZ-15 Plus[);/ ]'
+    - regex: 'MZ-15 Plus(?:[);/ ]|$)'
       model: '15 Plus'
-    - regex: 'MZ-15 Lite[);/ ]'
+    - regex: 'MZ-15 Lite(?:[);/ ]|$)'
       model: '15 Lite'
-    - regex: 'MZ-16th[);/ ]'
+    - regex: 'MZ-16th(?:[);/ ]|$)'
       model: '16th'
-    - regex: 'MZ-16 X[);/ ]'
+    - regex: 'MZ-16 X(?:[);/ ]|$)'
       model: '16X'
-    - regex: 'Meizu[_ ]note([89])[);/ ]'
+    - regex: 'Meizu[_ ]note([89])(?:[);/ ]|$)'
       device: 'phablet'
       model: 'Note $1'
 
@@ -8670,62 +8859,64 @@ Meizu:
 
 # Meitu
 Meitu:
-  regex: '(?:(?<!MI CC 9 )Meitu[2]?|MP1503|MP1512|MP160[23]|MP170[19]|MP171[138])[ ;/)]'
+  regex: '(?:(?<!MI CC 9 )Meitu[2]?|MP1503|MP1512|MP160[235]|MP170[19]|MP171[138])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'MP1503[ ;/)]'
+    - regex: 'MP1503(?:[);/ ]|$)'
       model: 'M6'
-    - regex: 'MP1512[ ;/)]'
+    - regex: 'MP1512(?:[);/ ]|$)'
       model: 'M6s'
-    - regex: 'MP1602[ ;/)]'
+    - regex: 'MP1602(?:[);/ ]|$)'
       model: 'T8'
-    - regex: 'MP17(?:01|13)[ ;/)]'
+    - regex: 'MP1605(?:[);/ ]|$)'
+      model: 'V6'
+    - regex: 'MP17(?:01|13)(?:[);/ ]|$)'
       model: 'T8s'
-    - regex: 'MP1718[ ;/)]'
+    - regex: 'MP1718(?:[);/ ]|$)'
       model: 'T9'
-    - regex: 'MP1603[ ;/)]'
+    - regex: 'MP1603(?:[);/ ]|$)'
       model: 'M8'
-    - regex: 'MP17(?:09|11)[ ;/)]'
+    - regex: 'MP17(?:09|11)(?:[);/ ]|$)'
       model: 'M8s'
-    - regex: 'Meitu2[ ;/)]'
+    - regex: 'Meitu2(?:[);/ ]|$)'
       model: '2'
-    - regex: 'Meitu (Kiss|[MV]4)[ ;/)]'
+    - regex: 'Meitu (Kiss|[MV]4)(?:[);/ ]|$)'
       model: '$1'
 
 # Memup
 Memup:
-  regex: 'SlidePad ?([^;/]*) Build|SPNG?[0-9]{2,4}[a-z]{0,2}[ ;/)]|SP704CE?'
+  regex: 'SlidePad ?([^;/]*) Build|SPNG?[0-9]{2,4}[a-z]{0,2}(?:[);/ ]|$)|SP704CE?'
   device: 'tablet'
   models:
     - regex: 'SlidePad ?([^;/]*) Build'
       model: 'SlidePad $1'
-    - regex: 'SPNG([0-9]{2,4}[a-z]{0,2})[ ;/)]'
+    - regex: 'SPNG([0-9]{2,4}[a-z]{0,2})(?:[);/ ]|$)'
       model: 'SlidePad NG$1'
     - regex: 'SP704(CE?)'
       model: 'SlidePad 704$1'
 
 # Mecer
 Mecer:
-  regex: '(M785|800P3[12]C|101P51C|X1010)[);/ ]'
+  regex: '(M785|800P3[12]C|101P51C|X1010)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'M785[);/ ]'
+    - regex: 'M785(?:[);/ ]|$)'
       model: 'Xpress Smartlife M785'
-    - regex: 'X1010[);/ ]'
+    - regex: 'X1010(?:[);/ ]|$)'
       model: 'X1010'
-    - regex: '800P31C[);/ ]'
+    - regex: '800P31C(?:[);/ ]|$)'
       model: 'Xpress Smartlife 800P31C'
-    - regex: '800P32C[);/ ]'
+    - regex: '800P32C(?:[);/ ]|$)'
       model: 'Xpress Smartlife 800P32C'
-    - regex: '101P51C[);/ ]'
+    - regex: '101P51C(?:[);/ ]|$)'
       model: 'Xpress Smartlife 101P51C'
 
 # mio
 Mio:
-  regex: 'MIO(?:/)?([a-z0-9]+)|MOBIX M6[);/ ]'
+  regex: 'MIO(?:/)?([a-z0-9]+)|MOBIX M6(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'MOBIX M6[);/ ]'
+    - regex: 'MOBIX M6(?:[);/ ]|$)'
       model: 'Mobix M6'
     - regex: 'MIO(?:/)?([a-z0-9]+)'
       model: '$1'
@@ -8755,12 +8946,12 @@ Mitsubishi:
 
 # MIXC
 MIXC:
-  regex: '(M35|M20|G7106|G7108)[ );/]'
+  regex: '(M35|M20|G7106|G7108)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(M[0-9]{1,2})[ );/]'
+    - regex: '(M[0-9]{1,2})(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(G[0-9]{4})[ );/]'
+    - regex: '(G[0-9]{4})(?:[);/ ]|$)'
       model: '$1'
 
 # Mobiola
@@ -8814,9 +9005,9 @@ Mobiistar:
   regex: 'Mobiistar|Zumbo_|PRIME X MAX|X1 Notch|E1 Selfie'
   device: 'smartphone'
   models:
-    - regex: 'X1 Notch[/;) ]'
+    - regex: 'X1 Notch(?:[);/ ]|$)'
       model: 'X1 Notch'
-    - regex: 'E1 Selfie[/;) ]'
+    - regex: 'E1 Selfie(?:[);/ ]|$)'
       model: 'E1 Selfie'
     - regex: 'mobiistar_LAI_Zumbo Build'
       model: 'Zumbo'
@@ -8889,7 +9080,7 @@ MLLED:
   models:
     - regex: 'MLLED[ _]([^;/]+)Build'
       model: '$1'
-    - regex: 'MLLED[ _]([^);/]+)[);/]'
+    - regex: 'MLLED[ _]([^);/]+)(?:[);/]|$)'
       model: '$1'
 
 # Mobistel
@@ -8900,30 +9091,30 @@ Mobistel:
 
 # Mecool
 Mecool:
-  regex: '(?:KM9PRO|BB2 PRO|KII PRO|KM9_TV_BOX|M8SPROW|M8S (?:PLUS|PRO) (?:DVB|[LW]|PLUS)|M8S (?:MAX|PRO))[);/ ]'
+  regex: '(?:KM9PRO|BB2 PRO|KII PRO|KM9_TV_BOX|M8SPROW|M8S (?:PLUS|PRO) (?:DVB|[LW]|PLUS)|M8S (?:MAX|PRO))(?:[);/ ]|$)'
   device: 'tv'
   models:
-    - regex: 'KM9PRO[);/ ]'
+    - regex: 'KM9PRO(?:[);/ ]|$)'
       model: 'KM9 Pro'
-    - regex: 'KM9_TV_BOX[);/ ]'
+    - regex: 'KM9_TV_BOX(?:[);/ ]|$)'
       model: 'KM9 TV Box'
-    - regex: 'BB2 PRO[);/ ]'
+    - regex: 'BB2 PRO(?:[);/ ]|$)'
       model: 'BB2 Pro'
-    - regex: 'KII PRO[);/ ]'
+    - regex: 'KII PRO(?:[);/ ]|$)'
       model: 'KII Pro'
-    - regex: 'M8SPROW[);/ ]'
+    - regex: 'M8SPROW(?:[);/ ]|$)'
       model: 'M8S Pro W'
-    - regex: 'M8S PLUS DVB[);/ ]'
+    - regex: 'M8S PLUS DVB(?:[);/ ]|$)'
       model: 'M8S Plus DVB'
-    - regex: 'M8S PLUS ([LW])[);/ ]'
+    - regex: 'M8S PLUS ([LW])(?:[);/ ]|$)'
       model: 'M8S Plus $1'
-    - regex: 'M8S PRO ([LW])[);/ ]'
+    - regex: 'M8S PRO ([LW])(?:[);/ ]|$)'
       model: 'M8S Pro $1'
-    - regex: 'M8S PRO PLUS[);/ ]'
+    - regex: 'M8S PRO PLUS(?:[);/ ]|$)'
       model: 'M8S Pro Plus'
-    - regex: 'M8S PRO[);/ ]'
+    - regex: 'M8S PRO(?:[);/ ]|$)'
       model: 'M8S Pro'
-    - regex: 'M8S MAX[);/ ]'
+    - regex: 'M8S MAX(?:[);/ ]|$)'
       model: 'M8S Max'
 
 # Modecom
@@ -8956,7 +9147,7 @@ Mofut:
 
 # motorola
 Motorola:
-  regex: 'MOT(?!TO)|(?<!AN)DROID ?(?:Build|[a-z0-9]+)|portalmmm/2.0 (?:E378i|L6|L7|v3)|XOOM [^;/]*Build|XT1941-2|XT1924-9|XT1925-10|XT1970-5|XT1799-2|XT1021|XT1710-08|XT180[3-5]|XT194[23]-1|XT1929-15|(?:XT|MZ|MB|ME)[0-9]{3,4}[a-z]?(?:\(Defy\)|-0[1-5])?(?:[;]? Build|\))'
+  regex: 'MOT(?!TO)|(?<!AN)DROID ?(?:Build|[a-z0-9]+)|portalmmm/2.0 (?:E378i|L6|L7|v3)|XOOM [^;/]*Build|XT1941-2|XT1924-9|XT1925-10|XT1965-6|XT1970-5|XT1799-2|XT1021|XT1710-08|XT180[3-5]|XT194[23]-1|XT1929-15|(?:XT|MZ|MB|ME)[0-9]{3,4}[a-z]?(?:\(Defy\)|-0[1-5])?(?:[;]? Build|\))'
   device: 'smartphone'
   models:
     # Explicit feature phone models
@@ -9059,6 +9250,8 @@ Motorola:
       model: 'Moto G5'
     - regex: '(?:MOT-|Motorola-)?XT1925-10'
       model: 'Moto G6'
+    - regex: '(?:MOT-|Motorola-)?XT1965-6'
+      model: 'Moto G7 Plus'
     - regex: '(?:MOT-|Motorola-)?XT10(?:49|5[23568]|60|9[23457])'
       model: 'Moto X'
     - regex: '(?:MOT-|Motorola-)?XT1562'
@@ -9116,10 +9309,10 @@ Motorola:
     - regex: '(XOOM [^;/]*)Build'
       device: 'tablet'
       model: '$1'
-    - regex: '(MZ[0-9]{3})[);/ ]'
+    - regex: '(MZ[0-9]{3})(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1'
-    - regex: '((?:ME|MB|XT)[0-9]{3,4}(?:\(Defy\))?)[);/ ]'
+    - regex: '((?:ME|MB|XT)[0-9]{3,4}(?:\(Defy\))?)(?:[);/ ]|$)'
       model: '$1'
 
 # Movic
@@ -9145,12 +9338,12 @@ MTN:
 
 # MyTab
 MyTab:
-  regex: 'MyTAB[ _-](?:8 MINI Dual Core|U55GT)[);/ ]'
+  regex: 'MyTAB[ _-](?:8 MINI Dual Core|U55GT)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'MyTAB[ _-]8 MINI Dual Core[);/ ]'
+    - regex: 'MyTAB[ _-]8 MINI Dual Core(?:[);/ ]|$)'
       model: '8 Mini Dual Core'
-    - regex: 'MyTAB-U55GT[);/ ]'
+    - regex: 'MyTAB-U55GT(?:[);/ ]|$)'
       model: 'U55GT'
 
 # myphone
@@ -9177,11 +9370,11 @@ MyPhone:
       model: 'Hammer Titan 2'
     - regex: 'Hammer Iron 2'
       model: 'Hammer Iron 2'
-    - regex: 'Hammer Active[);/ ]'
+    - regex: 'Hammer Active(?:[);/ ]|$)'
       model: 'Hammer Active'
-    - regex: 'Hammer_Active2[);/ ]'
+    - regex: 'Hammer_Active2(?:[);/ ]|$)'
       model: 'Hammer Active 2'
-    - regex: 'Hammer_Active2_LTE[);/ ]'
+    - regex: 'Hammer_Active2_LTE(?:[);/ ]|$)'
       model: 'Hammer Active 2 LTE'
     - regex: 'Hammer AXE Pro'
       model: 'Hammer Axe Pro'
@@ -9189,7 +9382,7 @@ MyPhone:
       model: 'Hammer Blade 2 Pro'
     - regex: 'C-Smart_pix'
       model: 'C-Smart Pix'
-    - regex: 'myA17[);/ ]'
+    - regex: 'myA17(?:[);/ ]|$)'
       model: 'myA17'
     - regex: 'myPhone_Fun_8'
       model: 'FUN 8'
@@ -9238,26 +9431,26 @@ M.T.T.:
 
 # Navon
 Navon:
-  regex: '(?:Superme_Max|Supreme[_ ](?:Fine|Chief|Pure|Pro)(?:[_ ](?:Mini|Plus))?|Navon[_ ]Infinity)[);/ ]'
+  regex: '(?:Superme_Max|Supreme[_ ](?:Fine|Chief|Pure|Pro)(?:[_ ](?:Mini|Plus))?|Navon[_ ]Infinity)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Superme_Max[);/ ]'
+    - regex: 'Superme_Max(?:[);/ ]|$)'
       model: 'Supreme Max'
-    - regex: 'Supreme_Fine_Mini[);/ ]'
+    - regex: 'Supreme_Fine_Mini(?:[);/ ]|$)'
       model: 'Supreme Fine Mini'
-    - regex: 'Supreme[_ ]Fine[_ ]Plus[);/ ]'
+    - regex: 'Supreme[_ ]Fine[_ ]Plus(?:[);/ ]|$)'
       model: 'Supreme Fine Plus'
-    - regex: 'Supreme_Fine[);/ ]'
+    - regex: 'Supreme_Fine(?:[);/ ]|$)'
       model: 'Supreme Fine'
-    - regex: 'Supreme[_ ]Chief[);/ ]'
+    - regex: 'Supreme[_ ]Chief(?:[);/ ]|$)'
       model: 'Supreme Chief'
-    - regex: 'Supreme[_ ]Pure[ _]Plus[);/ ]'
+    - regex: 'Supreme[_ ]Pure[ _]Plus(?:[);/ ]|$)'
       model: 'Supreme Pure Plus'
-    - regex: 'Supreme Pure[);/ ]'
+    - regex: 'Supreme Pure(?:[);/ ]|$)'
       model: 'Supreme Pure'
-    - regex: 'Supreme[_ ]Pro[);/ ]'
+    - regex: 'Supreme[_ ]Pro(?:[);/ ]|$)'
       model: 'Supreme Pro'
-    - regex: 'Navon[_ ]Infinity[);/ ]'
+    - regex: 'Navon[_ ]Infinity(?:[);/ ]|$)'
       model: 'Infinity'
 
 # NOA
@@ -9295,31 +9488,33 @@ NOA:
       model: '$1'
 
 Nobby:
-  regex: 'Nobby[ ](S500|X800|S300(?: Pro)?)[;/) ]'
+  regex: 'Nobby[ ](S500|X800|S300(?: Pro)?)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # nec
 NEC:
-  regex: 'NEC[ _\-]|KGT/2\.0|PC-TE508HAW|portalmmm/1\.0 (?:DB|N)|(?:portalmmm|o2imode)/2.0[ ,]N'
+  regex: 'NEC[ _\-]|KGT/2\.0|PC-TE508HAW|portalmmm/1\.0 (?:DB|N)|(?:portalmmm|o2imode)/2.0[ ,]N|N-06C(?:[);/ ]|$)'
   device: 'smartphone'
   models:
+    - regex: 'N-06C(?:[);/ ]|$)'
+      model: 'Medias Amadana'
     - regex: '(?:NEC[ _\-]|KGT/2\.0 )([a-z0-9]+)'
       model: '$1'
     - regex: 'portalmmm/1\.0 ((?:DB|N)[a-z0-9]+)'
       model: '$1'
     - regex: '(?:portalmmm|o2imode)/2\.0[ ,](N[a-z0-9]+)'
       model: '$1'
-    - regex: 'PC-TE508HAW[;/) ]'
+    - regex: 'PC-TE508HAW(?:[);/ ]|$)'
       device: 'tablet'
       model: 'LAVIE Tab E TE508'
 
 # Neffos (TP-Link)
 Neffos:
-  regex: 'Neffos|(TP601A)[;)/ ]'
+  regex: 'Neffos|(TP601A)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'TP601A[;)/ ]'
+    - regex: 'TP601A(?:[);/ ]|$)'
       model: 'C5L'
     - regex: 'Neffos[_ ]Y50'
       model: 'Y50'
@@ -9330,9 +9525,11 @@ Neffos:
 
 # Nextbit
 Nextbit:
-  regex: '(Robin) Build'
+  regex: 'Nextbit|(?:Robin)(?: Build|\))'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: '(Robin)(?:[);/ ]|$)'
+      model: '$1'
 
 # newgen
 Newgen:
@@ -9410,7 +9607,7 @@ Noain:
   models:
     - regex: 'NOAIN[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'NOAIN[ _-]([^;/)]+)[;/)]'
+    - regex: 'NOAIN[ _-]([^;/)]+)(?:[;/)]|$)'
       model: '$1'
 
 # Noblex
@@ -9420,65 +9617,65 @@ Noblex:
   models:
     - regex: '(?:Noblex|NBX)[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: '(?:Noblex|NBX)[ _-]([^;/)]+)[;/)]'
+    - regex: '(?:Noblex|NBX)[ _-]([^;/)]+)(?:[;/)]|$)'
       model: '$1'
 
 # Nomu
 Nomu:
-  regex: 'Nomu[ _-](?:T18|S30mini)[;/) ]'
+  regex: 'Nomu[ _-](?:T18|S30mini)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Nomu[ _-]T18[;/) ]'
+    - regex: 'Nomu[ _-]T18(?:[);/ ]|$)'
       model: 'T18'
-    - regex: 'Nomu[ _-]S30mini[;/) ]'
+    - regex: 'Nomu[ _-]S30mini(?:[);/ ]|$)'
       model: 'S30 Mini'
 
 # Nomi
 Nomi:
-  regex: 'Nomi[ _-]|(C101010 Ultra2|i501[234]|i5032|i5050|i5510|i5532|C0(700(?:[02358]|2HD)|7850)|C1010[0-3])[;/) ]'
+  regex: 'Nomi[ _-]|(C101010 Ultra2|i501[234]|i5032|i5050|i5510|i5532|C0(700(?:[02358]|2HD)|7850)|C1010[0-3])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'i501[23][;/) ]'
+    - regex: 'i501[23](?:[);/ ]|$)'
       model: 'Evo M2'
-    - regex: 'i5014[;/) ]'
+    - regex: 'i5014(?:[);/ ]|$)'
       model: 'Evo M4'
-    - regex: 'i5032[;/) ]'
+    - regex: 'i5032(?:[);/ ]|$)'
       model: 'Evo X2'
-    - regex: 'i5050[;/) ]'
+    - regex: 'i5050(?:[);/ ]|$)'
       model: 'Evo Z'
-    - regex: 'Nomi_i4510[;/) ]'
+    - regex: 'Nomi_i4510(?:[);/ ]|$)'
       model: 'Beat M'
-    - regex: 'i5532[;/) ]'
+    - regex: 'i5532(?:[);/ ]|$)'
       model: 'Space X2'
-    - regex: 'i5510[;/) ]'
+    - regex: 'i5510(?:[);/ ]|$)'
       model: 'Space M'
     - regex: 'C101010 Ultra2'
       model: 'Ultra 2'
       device: 'tablet'
-    - regex: '(C0(?:700(?:[02358]|2HD)|7850)|C1010[0-3])[;/) ]'
+    - regex: '(C0(?:700(?:[02358]|2HD)|7850)|C1010[0-3])(?:[);/ ]|$)'
       model: '$1'
       device: 'tablet'
     - regex: 'Nomi[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'Nomi[ _-]([^;/)]+)[;/)]'
+    - regex: 'Nomi[ _-]([^;/)]+)(?:[;/)]|$)'
       model: '$1'
 
 # NUU Mobile
 NUU Mobile:
-  regex: 'NUU_|(?:(?:N(5702|5001)L|S6001L)|A6L-[CG])[;)/ ]'
+  regex: 'NUU_|(?:(?:N(5702|5001)L|S6001L)|A6L-[CG])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'NUU_A([13])'
       model: 'A$1'
-    - regex: 'NUU_M3[;)/ ]'
+    - regex: 'NUU_M3(?:[);/ ]|$)'
       model: 'M3'
-    - regex: 'NUU_X5[;)/ ]'
+    - regex: 'NUU_X5(?:[);/ ]|$)'
       model: 'X5'
     - regex: 'S6001L'
       model: 'G2'
     - regex: 'N5702L'
       model: 'G3'
-    - regex: '(N5001L|A6L-[CG])[;)/ ]'
+    - regex: '(N5001L|A6L-[CG])(?:[);/ ]|$)'
       model: '$1'
 
 # NYX Mobile
@@ -9527,12 +9724,12 @@ NYX Mobile:
 
 # Nous
 Nous:
-  regex: '(?:NS(?:[356]|500[2-68]|5511|5502)|NS 5511)[;/) ]'
+  regex: '(?:NS(?:[356]|500[2-68]|5511|5502)|NS 5511)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'NS 5511[;/) ]'
+    - regex: 'NS 5511(?:[);/ ]|$)'
       model: 'NS5511'
-    - regex: '(NS[0-9]{1,4})[;/) ]'
+    - regex: '(NS[0-9]{1,4})(?:[);/ ]|$)'
       model: '$1'
 
 # Nvidia
@@ -9576,7 +9773,7 @@ O2:
 
 # Odys
 Odys:
-  regex: 'ODYS[ _-]|IEOS[_ ]([^/;]+)|NOON(?:_PRO)? Build|SPACE10_(?:PLUS|PRO)_3G|THOR_?10|TAO_X10|RAPID_?(?:10|7)_?LTE|MAVEN_?10_|CONNECT[78]|ELEMENT10_PLUS_3G|XELIO[_0-9P]|ADM816HC|ADM8000KP|NEO6_LTE|EOS10|AEON|FALCON_10_PLUS_3G|FUSION|THANOS_10|MAVEN_X10_HD(?:_LTE)?'
+  regex: 'ODYS[ _-]|IEOS[_ ]([^/;]+)|NOON(?:_PRO)? Build|SPACE10_(?:PLUS|PRO)_3G|THOR_?10|TAO_X10|RAPID_?(?:10|7)_?LTE|MAVEN_?10_|CONNECT[78]|ELEMENT10_PLUS_3G|XELIO[_0-9P]|ADM816HC|ADM8000KP|NEO6_LTE|EOS10|AEON|FALCON_10_PLUS_3G|FUSION|THANOS_10|MAVEN_X10_HD(?:_LTE)?|JUNIOR_8_PRO'
   device: 'tablet'
   models:
     - regex: 'XELIO[_ ]A10'
@@ -9623,6 +9820,8 @@ Odys:
       model: 'Space 10 Pro 3G'
     - regex: 'THOR_?10 Build'
       model: 'Thor 10'
+    - regex: 'JUNIOR_8_PRO'
+      model: 'Junior 8 Pro'
     - regex: 'ADM816HC'
       model: 'Neo X'
     - regex: 'EOS10'
@@ -9686,12 +9885,12 @@ Obi:
       model: 'Alligator'
     - regex: 'Obi[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'Obi[ _-]([^;/)]+)[;/)]'
+    - regex: 'Obi[ _-]([^;/)]+)(?:[;/)]|$)'
       model: '$1'
 
 # onda
 Onda:
-  regex: 'Onda|(?:(?:V820w|V891[w]?|V919(?: 3G)? Air)[ _-]DualOS|(?:V919 4G Air|V989 Air) Core8|T2101L2B1C| V10 4G|OBOOK (?:20 SE|20 PLUS DUALOS)|OBOOK10 SE|V919 Air CH DualOS)[);/ ]'
+  regex: 'Onda|(?:(?:V820w|V891[w]?|V919(?: 3G)? Air)[ _-]DualOS|(?:V919 4G Air|V989 Air) Core8|T2101L2B1C| V10 4G|OBOOK (?:20 SE|20 PLUS DUALOS)|OBOOK10 SE|V919 Air CH DualOS)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit tablet models
@@ -9725,13 +9924,13 @@ Onda:
     - regex: 'T2101L2B1C|OBOOK 20 PLUS DUALOS'
       model: 'oBook 20 Plus Dual OS'
       device: 'tablet'
-    - regex: ' V10 4G[);/ ]'
+    - regex: ' V10 4G(?:[);/ ]|$)'
       model: 'V10 10.1" 4G'
       device: 'tablet'
-    - regex: 'OBOOK 20 SE[);/ ]'
+    - regex: 'OBOOK 20 SE(?:[);/ ]|$)'
       model: 'oBook 20 SE'
       device: 'tablet'
-    - regex: 'OBOOK10 SE[);/ ]'
+    - regex: 'OBOOK10 SE(?:[);/ ]|$)'
       model: 'oBook 10 SE'
       device: 'tablet'
 
@@ -9745,27 +9944,27 @@ OnePlus:
   regex: '(?:du_)?ONEPLUS|(?:A0001|A200[135]|AC200[13]|A300[03]|A3010|A5000|A600[03]|A601[03]|E100[135]|GM191[03517]|GM190[0135]|GM1920|HD191[013]|HD190[01357]|HD1925|IN201[037]|IN202[03])(?: Build|\))'
   device: 'smartphone'
   models:
-    - regex: 'AC200[13][);/ ]'
+    - regex: 'AC200[13](?:[);/ ]|$)'
       model: 'Nord 5G'
-    - regex: 'IN202[03][);/ ]'
+    - regex: 'IN202[03](?:[);/ ]|$)'
       model: '8 Pro'
-    - regex: 'IN201[037][);/ ]'
+    - regex: 'IN201[037](?:[);/ ]|$)'
       model: '8'
-    - regex: 'GM191[03517][);/ ]'
+    - regex: 'GM191[03517](?:[);/ ]|$)'
       model: '7 Pro'
-    - regex: 'GM190[0135][);/ ]'
+    - regex: 'GM190[0135](?:[);/ ]|$)'
       model: '7'
-    - regex: 'HD190[01357][);/ ]'
+    - regex: 'HD190[01357](?:[);/ ]|$)'
       model: '7T'
-    - regex: 'HD191[013][);/ ]'
+    - regex: 'HD191[013](?:[);/ ]|$)'
       model: '7T Pro'
-    - regex: '(HD1925|GM1920)[);/ ]'
+    - regex: '(?:HD1925|GM1920)(?:[);/ ]|$)'
       model: '7T Pro 5G'
-    - regex: 'A0001[);/ ]'
+    - regex: 'A0001(?:[);/ ]|$)'
       model: 'One'
     - regex: 'A200[135]|OnePlus2'
       model: '2'
-    - regex: 'E100[135][);/ ]'
+    - regex: 'E100[135](?:[);/ ]|$)'
       model: 'X'
     - regex: 'A3010|OnePlus3T'
       model: '3T'
@@ -9777,17 +9976,17 @@ OnePlus:
       model: '5'
     - regex: 'A600[03]|OnePlus6'
       model: '6'
-    - regex: 'A601[03][);/ ]'
+    - regex: 'A601[03](?:[);/ ]|$)'
       model: '6T'
     - regex: '(?:du_)?ONEPLUS ?([^;/]+) Build'
       model: '$1'
 
 # Realme (sub brand Oppo)
 Realme:
-  regex: '(?:RMX(?:19(03|4[1235]|19|9[23]|2[157]|[01379]1)|20[025-7]1|20[03]2|2027|2063|2072|2086|20[234]0|218[059]|18(0[1579]|11|3[13]|2[157]|[45]1|45))|(?:OPPO[ _]?)?CPH1861)[ ;/)]'
+  regex: '(?:RMX(?:19(03|4[1235]|19|9[23]|2[157]|[01379]1|73)|20(?:[025-7]1|[037]2|2[57]|63|76|86|[234]0)|21(?:[12]1|42|76|8[059])|2200|18(0[1579]|11|3[13]|2[157]|[45]1|45))|(?:OPPO[ _]?)?CPH1861)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(?:OPPO[ _]?)?CPH1861[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1861(?:[);/ ]|$)'
       model: '1'
     - regex: 'RMX180[59]'
       model: '2'
@@ -9807,11 +10006,15 @@ Realme:
       model: 'X2 Dual'
     - regex: 'RMX1931'
       model: 'X2 Pro'
+    - regex: 'RMX2176(?:[);/ ]|$)'
+      model: 'X7 5G'
+    - regex: 'RMX2121(?:[);/ ]|$)'
+      model: 'X7 Pro 5G'
     - regex: 'RMX1921'
       model: 'XT'
     - regex: 'RMX19(1[19]|27)'
       model: '5'
-    - regex: 'RMX1971'
+    - regex: 'RMX197[13]'
       model: '5 Pro'
     - regex: 'RMX203[02]'
       model: '5i'
@@ -9821,241 +10024,281 @@ Realme:
       model: '6I'
     - regex: 'RMX2002'
       model: '6S'
-    - regex: 'RMX206[13][);/ ]'
+    - regex: 'RMX206[13](?:[);/ ]|$)'
       model: '6 Pro'
-    - regex: 'RMX1925[);/ ]'
+    - regex: 'RMX1925(?:[);/ ]|$)'
       model: '5S'
-    - regex: 'RMX1811[);/ ]'
+    - regex: 'RMX1811(?:[);/ ]|$)'
       model: 'C1'
-    - regex: 'RMX194[1235][);/ ]'
+    - regex: 'RMX194[1235](?:[);/ ]|$)'
       model: 'C2'
-    - regex: 'RMX202[107][);/ ]'
+    - regex: 'RMX202[107](?:[);/ ]|$)'
       model: 'C3'
-    - regex: 'RMX2185[);/ ]'
+    - regex: 'RMX2185(?:[);/ ]|$)'
       model: 'C11'
-    - regex: 'RMX2189[);/ ]'
+    - regex: 'RMX2189(?:[);/ ]|$)'
       model: 'C12'
-    - regex: 'RMX2180[);/ ]'
+    - regex: 'RMX2180(?:[);/ ]|$)'
       model: 'C15'
-    - regex: 'RMX1831[);/ ]'
+    - regex: 'RMX1831(?:[);/ ]|$)'
       model: 'U1'
-    - regex: 'RMX2051[);/ ]'
+    - regex: 'RMX20(?:51|25)(?:[);/ ]|$)'
       model: 'X50 5G'
-    - regex: 'RMX2071[);/ ]'
+    - regex: 'RMX2071(?:[);/ ]|$)'
       model: 'X50 Pro'
-    - regex: 'RMX2072[);/ ]'
+    - regex: 'RMX2076(?:[);/ ]|$)'
+      model: 'X50 Pro 5G'
+    - regex: 'RMX2072(?:[);/ ]|$)'
       model: 'X50 Pro Player'
-    - regex: 'RMX2086[);/ ]'
+    - regex: 'RMX2142(?:[);/ ]|$)'
+      model: 'X3'
+    - regex: 'RMX2086(?:[);/ ]|$)'
       model: 'X3 Super Zoom'
+    - regex: 'RMX2111'
+      model: 'V5 5G'
+    - regex: 'RMX2200'
+      model: 'V3 5G'
 
-# oppo
+# Oppo (oppo.com)
 OPPO:
-  regex: '(?:OB-)?OPPO[ _]?([a-z0-9]+)|N1T|OPG01|(?:X90[07][0679]|U707T?|X909T?|R(?:10[01]1|2001|201[07]|6007|7005|7007|80[13579]|81[13579]|82[01379]|83[013]|800[067]|8015|810[679]|811[13]|820[057])[KLSTW]?|N520[79]|N5117|A33f|A33fw|A37fw?|PAAM00|PAAT00|PAC[TM]00)[);/ ]|R7kf|R7plusf|R7Plusm|A1601|CPH[0-9]{4}|CPH19(69|79|23|1[179])|PB(A[TM]00|CT10|BT30|CM[13]0|[FD]M00)|P(DAM10|ADM00|AF[TM]00|ADT00|AHM00|BBM[03]0|BBT00|BDT00|BFT00|[CB]E[MT]00|CA[MT]00|C[CDG]M00|CA[MT]10|[CD]PM00|CRM00|CDT00|CD[TM]10|CHM[013]0|CKM[08]0|CLM10|DEM[13]0|DHM00|DK[TM]00|DPT00|DB[TM]00|DCM00|[CD]NM00)'
+  regex: '(?:OB-)?OPPO[ _]?([a-z0-9]+)|N1T|OPG01|(?:X90[07][0679]|U707T?|X909T?|R(?:10[01]1|2001|201[07]|6007|7005|7007|80[13579]|81[13579]|82[01379]|83[013]|800[067]|8015|810[679]|811[13]|820[057])[KLSTW]?|N520[79]|N5117|A33f|A33fw|A37fw?|PAAM00|PAAT00|PAC[TM]00)(?:[);/ ]|$)|R7kf|R7plusf|R7Plusm|A1601|CPH[0-9]{4}|CPH19(69|79|23|1[179])|PB(A[TM]00|CT10|BT30|CM[13]0|[FD]M00)|P(DAM10|ADM00|AF[TM]00|ADT00|AHM00|BBM[03]0|BBT00|BDT00|BFT00|[CB]E[MT]00|CA[MT]00|C[CDG]M00|CA[MT]10|[CD]PM00|CRM00|CDT00|CD[TM]10|CHM[013]0|CKM[08]0|CLM[15]0|DEM[13]0|DHM00|DK[TM]00|DPT00|DB[TM]00|DCM00|[CD]NM00|DVM00|DY[TM]20|DNT00|EA[TM]00)'
   device: 'smartphone'
   models:
-    - regex: 'PCHM10[);/ ]'
+    - regex: 'PCHM10(?:[);/ ]|$)'
       model: 'A11'
-    - regex: 'PCHM00[);/ ]'
+    - regex: '(?:CPH2083|CPH2077)(?:[);/ ]|$)'
+      model: 'A12'
+    - regex: 'PCHM00(?:[);/ ]|$)'
       model: 'A11x'
-    - regex: 'CPH1923[);/ ]'
+    - regex: 'CPH1923(?:[);/ ]|$)'
       model: 'A1K'
-    - regex: '(?:OPPO[ _]?)?(CPH1837|PAD[TM]00)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(CPH1837|PAD[TM]00)(?:[);/ ]|$)'
       model: 'A3'
-    - regex: 'A37f[);/ ]'
-      model: 'A37f'
-    - regex: '(?:OPPO[ _]?)?A37f(w)?(?: Build|\))'
+    - regex: '(?:OPPO[ _]?)?A37f(w)(?:[);/ ]|$)'
       model: 'A37f$1'
-    - regex: '(?:OPPO[ _]?)?CPH1605[);/ ]'
+    - regex: 'A37f(?:[);/ ]|$)'
+      model: 'A37f'
+    - regex: '(?:OPPO[ _]?)?CPH1605(?:[);/ ]|$)'
       model: 'A39'
-    - regex: '(?:OPPO[ _]?)?(?:CPH18(?:0[35]|53)|PBBM30)[);/ ]'
+    - regex: 'CPH20(?:81|73|31|15)(?:[);/ ]|$)'
+      model: 'A31'
+    - regex: '(?:OPPO[ _]?)?(?:CPH18(?:0[35]|53)|PBBM30)(?:[);/ ]|$)'
       model: 'A3s'
-    - regex: '(?:OPPO[ _]?)?(?:CPH1809|PBA[TM]00|PBBT30)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:CPH1809|PBA[TM]00|PBBT30)(?:[);/ ]|$)'
       model: 'A5'
-    - regex: 'CPH19(?:3[13]|43)[);/ ]'
+    - regex: 'CPH19(?:3[13]|43)(?:[);/ ]|$)'
       model: 'A5 (2020)'
-    - regex: 'PDAM10[);/ ]'
+    - regex: 'PDVM00(?:[);/ ]|$)'
+      model: 'A32'
+    - regex: '(?:PDAM10|CPH2069|CPH2061)(?:[);/ ]|$)'
       model: 'A52'
-    - regex: '(?:OPPO[ _]?)?CPH170[15][);/ ]'
+    - regex: 'CPH2127(?:[);/ ]|$)'
+      model: 'A53'
+    - regex: '(?:OPPO[ _]?)?CPH170[15](?:[);/ ]|$)'
       model: 'A57'
-    - regex: 'CPH1909[);/ ]'
+    - regex: 'CPH19(?:09|1[02])(?:[);/ ]|$)'
       model: 'A5S'
-    - regex: '(?:OPPO[ _]?)?(?:CPH1901|PBF[TM]00)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:CPH190[15]|PBF[TM]00)(?:[);/ ]|$)'
       model: 'A7'
-    - regex: '(?:OPPO[ _]?)?(CPH1801|CPH1717)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(CPH1801|CPH1717)(?:[);/ ]|$)'
       model: 'A71'
-    - regex: '(?:OPPO[ _]?)?CPH1715[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:PDY[TM]20|CPH2067)(?:[);/ ]|$)'
+      model: 'A72'
+    - regex: '(?:OPPO[ _]?)?CPH1715(?:[);/ ]|$)'
       model: 'A77'
-    - regex: 'PCD[TM]00[);/ ]'
+    - regex: 'PCD[TM]00(?:[);/ ]|$)'
       model: 'A7n'
-    - regex: '(PBBT00|PBBM00)[);/ ]'
+    - regex: '(PBBT00|PBBM00)(?:[);/ ]|$)'
       model: 'A7x'
-    - regex: '(?:OPPO[ _]?)?(?:PDBM00)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:PDBM00)(?:[);/ ]|$)'
       model: 'A8'
-    - regex: '(?:OPPO[ _]?)?CPH1729[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1729(?:[);/ ]|$)'
       model: 'A83'
-    - regex: '(?:OPPO[ _]?)?CPH1827[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1827(?:[);/ ]|$)'
       model: 'A83 (2018)'
-    - regex: 'PCA[TM]10[);/ ]'
+    - regex: 'PCA[TM]10(?:[);/ ]|$)'
       model: 'A9'
-    - regex: '(CPH1937|CPH1941|PCHM30)[);/ ]'
+    - regex: '(CPH1937|CPH1941|PCHM30)(?:[);/ ]|$)'
       model: 'A9 (2020)'
-    - regex: '(?:OPPO[ _]?)?CPH1938[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1938(?:[);/ ]|$)'
       model: 'A9 (EN)'
-    - regex: 'PCPM00[);/ ]'
+    - regex: '(?:PCPM00|CPH20[02]1)(?:[);/ ]|$)'
       model: 'A91'
-    - regex: 'PDKT00[);/ ]'
+    - regex: 'CPH2059(?:[);/ ]|$)'
+      model: 'A92'
+    - regex: 'PDKT00(?:[);/ ]|$)'
       model: 'A92s'
-    - regex: 'PDKM00[);/ ]'
+    - regex: 'PDKM00(?:[);/ ]|$)'
       model: 'A93s'
-    - regex: 'PCE[TM]00[);/ ]'
+    - regex: 'PCE[TM]00(?:[);/ ]|$)'
       model: 'A9x'
-    - regex: '(?:OPPO[ _]?)?CPH1851[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1851(?:[);/ ]|$)'
       model: 'AX5'
-    - regex: 'CPH1920[);/ ]'
+    - regex: 'CPH1920(?:[);/ ]|$)'
       model: 'AX5s'
-    - regex: '(?:OPPO[ _]?)?CPH1903[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1903(?:[);/ ]|$)'
       model: 'AX7'
-    - regex: '(?:OPPO[ _]?)?X9009[);/ ]'
+    - regex: '(?:OPPO[ _]?)?X9009(?:[);/ ]|$)'
       model: 'F1 Plus'
-    - regex: 'CPH1911[);/ ]'
+    - regex: 'CPH1911(?:[);/ ]|$)'
       model: 'F11'
-    - regex: 'CPH1969[);/ ]'
+    - regex: 'CPH19(?:69|87)(?:[);/ ]|$)'
       model: 'F11 Pro'
-    - regex: '(?:OPPO[ _]?)?A1601[);/ ]'
+    - regex: '(?:OPPO[ _]?)?A1601(?:[);/ ]|$)'
       model: 'F1s'
-    - regex: '(?:OPPO[ _]?)?CPH1609[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1609(?:[);/ ]|$)'
       model: 'F3'
-    - regex: '(?:OPPO[ _]?)?CPH1613[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1613(?:[);/ ]|$)'
       model: 'F3 Plus'
-    - regex: '(?:OPPO[ _]?)?CPH172[37][);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH172[37](?:[);/ ]|$)'
       model: 'F5'
-    - regex: '(?:OPPO[ _]?)?CPH1725[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1725(?:[);/ ]|$)'
       model: 'F5 Youth'
-    - regex: '(?:OPPO[ _]?)?CPH(1859|18(?:19|21))[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH(1859|18(?:19|21))(?:[);/ ]|$)'
       model: 'F7'
-    - regex: '(?:OPPO[ _]?)?(?:CPH1825|CPH1881)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:CPH1825|CPH1881)(?:[);/ ]|$)'
       model: 'F9'
-    - regex: '(?:OPPO[ _]?)?CPH1823[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1823(?:[);/ ]|$)'
       model: 'F9 Pro'
-    - regex: '(?:OPPO[ _]?)?X909T?[);/ ]'
+    - regex: '(?:OPPO[ _]?)?X909T?(?:[);/ ]|$)'
       model: 'Find 5'
-    - regex: '(?:OPPO[ _]?)?R827T?[);/ ]'
+    - regex: '(?:OPPO[ _]?)?R827T?(?:[);/ ]|$)'
       model: 'Find 5 Mini'
-    - regex: '(?:OPPO[ _]?)?X907[067][);/ ]'
+    - regex: '(?:OPPO[ _]?)?X907[067](?:[);/ ]|$)'
       model: 'Find 7'
-    - regex: '(?:OPPO[ _]?)?X900[067][);/ ]'
+    - regex: '(?:OPPO[ _]?)?X900[067](?:[);/ ]|$)'
       model: 'Find 7a'
-    - regex: '(?:OPPO[ _]?)?R815[TW]?[);/ ]'
+    - regex: '(?:OPPO[ _]?)?R815[TW]?(?:[);/ ]|$)'
       model: 'Find Clover'
-    - regex: '(?:OPPO[ _]?)?R8015[);/ ]'
+    - regex: '(?:OPPO[ _]?)?R8015(?:[);/ ]|$)'
       model: 'Find Guitar'
-    - regex: '(?:OPPO[ _]?)?R8111[);/ ]'
+    - regex: '(?:OPPO[ _]?)?R8111(?:[);/ ]|$)'
       model: 'Find Melody'
-    - regex: '(?:OPPO[ _]?)?R821T?[);/ ]'
+    - regex: '(?:OPPO[ _]?)?R821T?(?:[);/ ]|$)'
       model: 'Find Muse'
-    - regex: '(?:OPPO[ _]?)?U707T?[);/ ]'
+    - regex: '(?:OPPO[ _]?)?U707T?(?:[);/ ]|$)'
       model: 'Find Way S'
-    - regex: '(?:OPPO[ _]?)?(?:CPH187[15]|PAF[MT]00)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:CPH187[15]|PAF[MT]00)(?:[);/ ]|$)'
       model: 'Find X'
-    - regex: '(?:OPPO[ _]?)?(?:PAHM00)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:PAHM00)(?:[);/ ]|$)'
       model: 'Find X Lamborghini'
-    - regex: '(?:OPPO[ _]?)?(PDEM10)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:PDEM10|CPH2023)(?:[);/ ]|$)'
       model: 'Find X2'
-    - regex: '(?:OPPO[ _]?)?(PDEM30|OPG01)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH2005(?:[);/ ]|$)'
+      model: 'Find X2 Lite'
+    - regex: '(?:OPPO[ _]?)?(?:PDEM30|OPG01|CPH2025)(?:[);/ ]|$)'
       model: 'Find X2 Pro'
     - regex: '(?:OPPO[ _]?)?R1011 Build'
       model: 'Joy Plus'
-    - regex: '(?:OPPO[ _]?)?(PBC(?:M30|T10))[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(PBC(?:M30|T10))(?:[);/ ]|$)'
       model: 'K1'
-    - regex: '(?:OPPO[ _]?)?(PCNM00)[);/ ]'
+    - regex: 'CPH1955(?:[);/ ]|$)'
+      model: 'K3'
+    - regex: '(?:OPPO[ _]?)?(PCNM00)(?:[);/ ]|$)'
       model: 'K5'
-    - regex: '(?:OPPO[ _]?)?N5117[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(PCLM50)(?:[);/ ]|$)'
+      model: 'K7'
+    - regex: '(?:OPPO[ _]?)?N5117(?:[);/ ]|$)'
       model: 'N1 Mini'
-    - regex: '(?:OPPO[ _]?)?N520[79][);/ ]'
+    - regex: '(?:OPPO[ _]?)?N520[79](?:[);/ ]|$)'
       model: 'N3'
-    - regex: '(?:OPPO[ _]?)?R831T?[);/ ]'
+    - regex: '(?:OPPO[ _]?)?R831T?(?:[);/ ]|$)'
       model: 'Neo'
-    - regex: '(?:OPPO[ _]?)?R831K[);/ ]'
+    - regex: '(?:OPPO[ _]?)?R831K(?:[);/ ]|$)'
       model: 'Neo 3'
-    - regex: '(?:OPPO[ _]?)?R831[SL][);/ ]'
+    - regex: '(?:OPPO[ _]?)?R831[SL](?:[);/ ]|$)'
       model: 'Neo 5'
-    - regex: '(?:OPPO[ _]?)?A33f[);/ ]'
+    - regex: '(?:OPPO[ _]?)?A33f(?:[);/ ]|$)'
       model: 'Neo 7'
-    - regex: '(?:OPPO[ _]?)?A33fw[);/ ]'
+    - regex: '(?:OPPO[ _]?)?A33fw(?:[);/ ]|$)'
       model: 'Neo 7s'
-    - regex: '(?:OPPO[ _]?)?R8113[);/ ]'
+    - regex: '(?:OPPO[ _]?)?R8113(?:[);/ ]|$)'
       model: 'Piano'
-    - regex: '(?:OPPO[ _]?)?CPH1707[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1707(?:[);/ ]|$)'
       model: 'R11'
-    - regex: '(?:OPPO[ _]?)?CPH1719[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1719(?:[);/ ]|$)'
       model: 'R11s'
-    - regex: '(?:OPPO[ _]?)?CPH1721[);/ ]'
+    - regex: '(?:OPPO[ _]?)?CPH1721(?:[);/ ]|$)'
       model: 'R11s Plus'
-    - regex: '(?:OPPO[ _]?)?(?:CPH1835|PAC[TM]00|PAAM00)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:CPH1835|PAC[TM]00|PAAM00)(?:[);/ ]|$)'
       model: 'R15'
-    - regex: '(?:OPPO[ _]?)?(?:CPH1831|PAAT00)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:CPH183[13]|PAAT00)(?:[);/ ]|$)'
       model: 'R15 Pro'
-    - regex: 'PBCM10[);/ ]'
+    - regex: 'PBCM10(?:[);/ ]|$)'
       model: 'R15x'
-    - regex: '(?:OPPO[ _]?)?(?:CPH1879|PBE[MT]00)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:CPH1879|PBE[MT]00)(?:[);/ ]|$)'
       model: 'R17'
-    - regex: '(?:OPPO[ _]?)?(?:CPH1893)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:CPH1893)(?:[);/ ]|$)'
       model: 'R17 Neo'
-    - regex: '(?:OPPO[ _]?)?(?:CPH1877|PBD[MT]00)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:CPH1877|CPH2119|PBD[MT]00)(?:[);/ ]|$)'
       model: 'R17 Pro'
-    - regex: '(?:OPPO[ _]?)?R8006[);/ ]'
+    - regex: '(?:OPPO[ _]?)?R8006(?:[);/ ]|$)'
       model: 'R1L'
-    - regex: '(?:OPPO[ _]?)?R800[07][);/ ]'
+    - regex: '(?:OPPO[ _]?)?R800[07](?:[);/ ]|$)'
       model: 'R1S'
-    - regex: '(?:OPPO[ _]?)?R810[679][);/ ]'
+    - regex: '(?:OPPO[ _]?)?R810[679](?:[);/ ]|$)'
       model: 'R5'
-    - regex: '(?:OPPO[ _]?)?R7kf[);/ ]'
+    - regex: '(?:OPPO[ _]?)?R7kf(?:[);/ ]|$)'
       model: 'R7 Lite'
-    - regex: '(?:OPPO[ _]?)?R7Plusm[);/ ]'
+    - regex: '(?:OPPO[ _]?)?R7Plusm(?:[);/ ]|$)'
       model: 'R7 Plus'
-    - regex: '(?:OPPO[ _]?)?R7Plusf[);/ ]'
+    - regex: '(?:OPPO[ _]?)?R7Plusf(?:[);/ ]|$)'
       model: 'R7 Plus F'
-    - regex: '(?:OPPO[ _]?)?CPH1607[);/ ]'
+    - regex: '(?:OPPO[ _]?)?X9079(?:[);/ ]|$)'
+      model: 'R9 Plus'
+    - regex: '(?:OPPO[ _]?)?CPH1607(?:[);/ ]|$)'
       model: 'R9s'
-    - regex: '(?:OPPO[ _]?)?(?:CPH1611|R9s Plus)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:CPH1611|R9s Plus)(?:[);/ ]|$)'
       model: 'R9s Plus'
-    - regex: '(?:CPH1917|PCA[MT]00)[);/ ]'
+    - regex: '(?:CPH1917|PCA[MT]00)(?:[);/ ]|$)'
       model: 'Reno'
-    - regex: 'CPH1983[);/ ]'
+    - regex: 'CPH1983(?:[);/ ]|$)'
       model: 'Reno A'
-    - regex: 'PCCM00[);/ ]'
+    - regex: 'PCCM00(?:[);/ ]|$)'
       model: 'Reno 10X'
-    - regex: 'CPH1919[);/ ]'
+    - regex: 'CPH1919(?:[);/ ]|$)'
       model: 'Reno 10X Zoom'
-    - regex: '(?:PCKM00|CPH1907)[);/ ]'
+    - regex: '(?:PCKM00|CPH1907)(?:[);/ ]|$)'
       model: 'Reno 2'
-    - regex: 'CPH1989[);/ ]'
+    - regex: 'CPH1989(?:[);/ ]|$)'
       model: 'Reno 2F'
-    - regex: '(?:PCKM80|CPH1945)[);/ ]'
+    - regex: '(?:PCKM80|CPH1945|CPH1951)(?:[);/ ]|$)'
       model: 'Reno 2Z'
-    - regex: 'PDCM00[);/ ]'
+    - regex: 'CPH2043(?:[);/ ]|$)'
+      model: 'Reno 3'
+    - regex: 'CPH2013(?:[);/ ]|$)'
+      model: 'Reno 3A'
+    - regex: 'PDCM00(?:[);/ ]|$)'
       model: 'Reno 3 5G'
-    - regex: 'PCRM00[);/ ]'
+    - regex: '(?:PCRM00|CPH203[57]|CPH2009)'
       model: 'Reno 3 Pro'
-    - regex: 'PDP[TM]00[);/ ]'
+    - regex: 'CPH2113(?:[);/ ]|$)'
+      model: 'Reno 4 4G'
+    - regex: 'CPH2125(?:[);/ ]|$)'
+      model: 'Reno 4 Lite'
+    - regex: 'CPH2109(?:[);/ ]|$)'
+      model: 'Reno 4 Pro 4G'
+    - regex: 'PDP[TM]00(?:[);/ ]|$)'
       model: 'Reno 4 5G'
-    - regex: 'PDNM00[);/ ]'
+    - regex: 'PEA[TM]00(?:[);/ ]|$)'
+      model: 'Reno 4 SE 5G '
+    - regex: 'PDN[TM]00(?:[);/ ]|$)'
       model: 'Reno 4 Pro 5G'
-    - regex: 'CPH1921[);/ ]'
+    - regex: 'CPH192[15]'
       model: 'Reno 5G'
-    - regex: 'PCLM10[);/ ]'
+    - regex: 'PCLM10(?:[);/ ]|$)'
       model: 'Reno Ace'
-    - regex: 'PDHM00[);/ ]'
+    - regex: 'PDHM00(?:[);/ ]|$)'
       model: 'Reno Ace 2'
-    - regex: 'PCGM00[);/ ]'
+    - regex: 'PCGM00(?:[);/ ]|$)'
       model: 'Reno K3'
-    - regex: '(?:OPPO[ _]?)?(?:CPH1979|PCD[TM]10)[);/ ]'
+    - regex: '(?:OPPO[ _]?)?(?:CPH1979|PCD[TM]10)(?:[);/ ]|$)'
       model: 'Reno Z'
 
-    - regex: 'N1T?[);/ ]'
+    - regex: 'N1T?(?:[);/ ]|$)'
       model: 'N1T'
       device: 'phablet'
-    - regex: 'R([0-9]{3,4}[KSTW]?)[);/ ]' # valid model numbers are filtered in main regex
+    - regex: 'R([0-9]{3,4}[KSTW]?)(?:[);/ ]|$)' # valid model numbers are filtered in main regex
       model: 'R$1'
 
     # general detections
@@ -10081,27 +10324,47 @@ Opsson:
 
 # orange
 Orange:
-  regex: 'SPV[ \-]?([a-z0-9]+)|(?<!FBCR/)Orange[ _-](?!Tahiti-LS\))([^/;]+)( Build|\))(?<!Tahiti-LS\))|SC/IHD92|FunTab ([^/;]+) Build'
+  regex: 'SPV[ \-]?([a-z0-9]+)|(?<!FBCR/)Orange[ _-](?!Tahiti-LS\))([^/;]+)( Build|\))(?<!Tahiti-LS\))|SC/IHD92|Nura 2|FunTab ([^/;]+) Build'
   device: 'smartphone'
   models:
     - regex: 'SC/IHD92'
       model: 'Livebox Play'
       device: 'tv' # set top box
+    - regex: 'Nura 2'
+      model: 'Nura 2'
     - regex: 'Sego'
       model: 'Sego'
       device: 'tablet'
     - regex: 'FunTab ([^/;]+) Build'
       model: 'FunTab $1'
       device: 'tablet'
-    - regex: 'Orange[ _-](Rise)(3[12]|5[12])[ ;/)]'
+    - regex: 'Orange[ _-](Rise)(3[12]|5[12])(?:[);/ ]|$)'
       model: '$1 $2'
-    - regex: 'Orange[ _-](Dive)72[ ;/)]'
+    - regex: 'Orange[ _-](Dive)72(?:[);/ ]|$)'
       model: '$1 72'
-    - regex: 'Orange[ _-](Daytona|Dive (30|7[13])|Dublin|Fova|Gova|Hi 4G|Hiro|Kivo|Monte Carlo|Neva 80|Neva play|Nura|Reyo|Rise[_ ](3[034]|40|5[345])|Rono|Roya|San Francisco|Tactile internet 2|Tado|Yomi|Yumo|Zali)[ ;/)]'
+    - regex: 'Orange[ _-](Daytona|Dive (30|7[13])|Dublin|Fova|Gova|Hi 4G|Hiro|Kivo|Monte Carlo|Neva 80|Neva play|Nura|Reyo|Rise[_ ](3[034]|40|5[345])|Rono|Roya|San Francisco|Tactile internet 2|Tado|Yomi|Yumo|Zali)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'SPV[ \-]?([a-z0-9]+)'
       model: 'SPV $1'
 
+# Oukitel
+Oukitel:
+  regex: 'OUKITEL|(?:(?:C15|C16|K10000|K[46]000)(?:[ _]Pro)|U20_Plus|WP5 Pro|K[46]000[ _](?:Plus|Lite)|Y4800|K10000|K[4567]000)(?:[);/ ]|$)'
+  device: 'smartphone'
+  models:
+    - regex: '(C15|C16|K10000|K[46]000|WP5)[ _]Pro(?:[);/ ]|$)'
+      model: '$1 Pro'
+    - regex: 'OUKITEL K3(?:[);/ ]|$)'
+      model: 'K3'
+    - regex: '(K10000)[ _]Max(?:[);/ ]|$)'
+      model: '$1 Max'
+    - regex: '(U20|K[46]000)[_ ]Plus(?:[);/ ]|$)'
+      model: '$1 Plus'
+    - regex: '(K4000)[_ ]Lite(?:[);/ ]|$)'
+      model: '$1 Lite'
+    - regex: '(Y4800|K10000|K[4567]000)(?:[);/ ]|$)'
+      model: '$1'
+
 # Ouki
 Ouki:
   regex: 'OUKI|OK[AU][0-9]+[a-z]* Build'
@@ -10111,27 +10374,11 @@ Ouki:
       model: '$1'
     - regex: '([^;/)]+) Build/OUKI'
       model: '$1'
-    - regex: 'OUKI[ _-]?([^;/)]+)[;/)]'
+    - regex: 'OUKI[ _-]?([^;/)]+)(?:[;/)]|$)'
       model: '$1'
     - regex: '(OK[AU][0-9]+[a-z]*) Build'
       model: '$1'
 
-# Oukitel
-Oukitel:
-  regex: '(?:(?:C15|C16|K10000|K[46]000)(?:[ _]Pro)|U20_Plus|K[46]000[ _](?:Plus|Lite)|Y4800|K10000|K[4567]000)[ ;/)]'
-  device: 'smartphone'
-  models:
-    - regex: '(C15|C16|K10000|K[46]000)[ _]Pro[ ;/)]'
-      model: '$1 Pro'
-    - regex: '(K10000)[ _]Max[ ;/)]'
-      model: '$1 Max'
-    - regex: '(U20|K[46]000)[_ ]Plus[ ;/)]'
-      model: '$1 Plus'
-    - regex: '(K4000)[_ ]Lite[ ;/)]'
-      model: '$1 Lite'
-    - regex: '(Y4800|K10000|K[4567]000)[ ;/)]'
-      model: '$1'
-
 # Overmax
 Overmax:
   regex: 'OV-[a-z]+(?:[^;(/]*)[();/ ]|Qualcore 1010|Vertis 5021 Aim|OV1027[34]G'
@@ -10214,21 +10461,26 @@ Panacom:
 
 # panasonic
 Panasonic:
-  regex: 'Panasonic|PANATV[0-9]+|Viera/|(?:P902i|P-08D)[);/ ]|Eluga[ _]|FZ-N1|P55 Novo 4G|DMC-CM1'
+  regex: 'Panasonic|PANATV[0-9]+|Viera/|(?:P902i|P-08D|FZ-B2D|FZ-[NX]1|DMC-CM1|P-01J)(?:[);/ ]|$)|Eluga[ _]|P55 Novo 4G'
   device: 'smartphone'
   models:
+    - regex: 'P-01J(?:[);/ ]|$)'
+      model: 'P-smart Keitai'
     - regex: 'Eluga[ _-]([^;/]+) Build'
       model: 'Eluga $1'
-    - regex: 'Eluga[ _-]([^;/]+)[;/)]'
+    - regex: 'Eluga[ _-]([^;/]+)(?:[;/)]|$)'
       model: 'Eluga $1'
     - regex: '(DMC-CM1)'
       model: 'Lumix $1'
       device: 'camera'
-    - regex: 'FZ-N1'
-      model: 'Toughpad'
+    - regex: '(FZ-[XN]1)(?:[);/ ]|$)'
+      model: 'Toughpad $1'
+    - regex: 'FZ-B2D(?:[);/ ]|$)'
+      model: 'Toughpad FZ-B2D'
+      device: 'tablet'
     - regex: 'P55 Novo 4G'
       model: 'P55 Novo 4G'
-    - regex: 'P902i[);/ ]'
+    - regex: 'P902i(?:[);/ ]|$)'
       device: 'feature phone'
       model: 'P902i'
     - regex: 'Panasonic MIL DLNA'
@@ -10242,7 +10494,7 @@ Panasonic:
     - regex: 'portalmmm/2.0 (P[a-z0-9]+)'
       model: '$1'
 
-    - regex: 'P-08D[);/ ]'
+    - regex: 'P-08D(?:[);/ ]|$)'
       model: 'Eluga Live 10.1"'
       device: 'tablet'
 
@@ -10282,7 +10534,7 @@ PCD Argentina:
 
 # ArmPhone
 ArmPhone:
-  regex: '(TSD Octa A0520P|TSD Quadra A0509P)[);/ ]'
+  regex: '(TSD Octa A0520P|TSD Quadra A0509P)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
@@ -10308,10 +10560,12 @@ Pentagram:
 
 # philips
 Philips:
-  regex: 'Philips|AND1E[);/ ]|NETTV/|PI3210G|TLE(821L|722G)|TPM1[79]1E|70PUH6774_96|QM16[134]E'
+  regex: 'Philips|AND1E(?:[);/ ]|$)|NETTV/|PI3210G|TLE(821L|722G)|TPM1[79]1E|70PUH6774_96|QM16[134]E|Xenium S[25]66'
   device: 'smartphone'
   models:
-    - regex: 'AND1E(?: TV)?[);/ ]'
+    - regex: 'Xenium S([25]66)(?:[);/ ]|$)'
+      model: 'Xenium S$1'
+    - regex: 'AND1E(?: TV)?(?:[);/ ]|$)'
       model: 'Android TV'
       device: 'tv'
     - regex: '(PI3210G)'
@@ -10326,10 +10580,10 @@ Philips:
     - regex: '(70PUH6774)_96'
       model: '$1/96 4K UHD'
       device: 'tv'
-    - regex: '(TLE821L)[);/ ]'
+    - regex: '(TLE821L)(?:[);/ ]|$)'
       model: '$1 4G LTE'
       device: 'tablet'
-    - regex: '(TLE722G)[);/ ]'
+    - regex: '(TLE722G)(?:[);/ ]|$)'
       model: '$1'
       device: 'tablet'
     - regex: 'Philips, BDP([0-9]{4})'
@@ -10369,7 +10623,7 @@ Pioneer:
       device: 'tablet'
     - regex: 'Pioneer[ _-]?([^;/]+) Build'
       model: '$1'
-    - regex: 'Pioneer[ _-]?([^;/)]+)[;/)]'
+    - regex: 'Pioneer[ _-]?([^;/)]+)(?:[;/)]|$)'
       model: '$1'
     - regex: 'dvr700pi'
       model: 'DVR700PI 7.0"'
@@ -10377,7 +10631,7 @@ Pioneer:
 
 # Pixus
 Pixus:
-  regex: 'Pixus|(Ride[_ ][34]G|Play[ _]Three[ _]v(?:[24].0|3.1))[;)\ ]'
+  regex: 'Pixus|(Ride[_ ][34]G|Play[ _]Three[ _]v(?:[24].0|3.1))(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'Ride[_ ]([34])G'
@@ -10454,7 +10708,7 @@ Pomp:
   models:
     - regex: 'POMP[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'POMP[ _-]([^;/)]+)[;/)]'
+    - regex: 'POMP[ _-]([^;/)]+)(?:[;/)]|$)'
       model: '$1'
 
 # PPTV
@@ -10487,7 +10741,7 @@ Readboy:
   models:
     - regex: 'Readboy[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'Readboy[ _-]([^;/]+)[;/)]'
+    - regex: 'Readboy[ _-]([^;/]+)(?:[;/)]|$)'
       model: '$1'
 
 # Roku
@@ -10506,12 +10760,12 @@ Rokit:
 
 # Rombica
 Rombica:
-  regex: '(Rombica|SSQ-A0500)[);/ ]'
+  regex: '(Rombica|SSQ-A0500)(?:[);/ ]|$)'
   device: 'tv'
   models:
-    - regex: 'SSQ-A0500[);/ ]'
+    - regex: 'SSQ-A0500(?:[);/ ]|$)'
       model: 'Smart Stick 4K'
-    - regex: '(Infinity K8|Smart Box (?:v005|Quad|Ultra HD v002|4K V001))[);/ ]'
+    - regex: '(Infinity K8|Smart Box (?:v005|Quad|Ultra HD v002|4K V001))(?:[);/ ]|$)'
       model: '$1'
 
 # Rover
@@ -10522,15 +10776,15 @@ Rover:
 
 # RoverPad
 RoverPad:
-  regex: '(RoverPad|RoverPhone)[);/ ]'
+  regex: '(RoverPad|RoverPhone)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'RoverPhone[);/ ]'
+    - regex: 'RoverPhone(?:[);/ ]|$)'
       model: ''
       device: 'smartphone'
-    - regex: 'RoverPad sky 7.85[);/ ]'
+    - regex: 'RoverPad sky 7.85(?:[);/ ]|$)'
       model: 'Sky 7.85'
-    - regex: 'RoverPad (10.4|Air S70|9.7 3G|Sky 9.7|3W A73|3W7|3WT70|3W9.4)[);/ ]'
+    - regex: 'RoverPad (10.4|Air S70|9.7 3G|Sky 9.7|3W A73|3W7|3WT70|3W9.4)(?:[);/ ]|$)'
       model: '$1'
 
 # Roadrover
@@ -10561,27 +10815,27 @@ Santin:
   regex: '(?:SANTIN|BiTBiZ_V58|ACTOMA ACE|DREAMPLUS03A|Candy U7 Pro)[);/_ ]'
   device: 'smartphone'
   models:
-    - regex: 'BiTBiZ_V58[);/ ]'
+    - regex: 'BiTBiZ_V58(?:[);/ ]|$)'
       model: 'BiTBiZ V58'
-    - regex: 'Candy U7 Pro[);/ ]'
+    - regex: 'Candy U7 Pro(?:[);/ ]|$)'
       model: 'Candy U7 Pro'
-    - regex: 'DREAMPLUS03A[);/ ]'
+    - regex: 'DREAMPLUS03A(?:[);/ ]|$)'
       model: 'Dream Plus 03A'
-    - regex: 'GreenOrange[);/ ]'
+    - regex: 'GreenOrange(?:[);/ ]|$)'
       model: 'Green Orange'
-    - regex: 'halove[);/ ]'
+    - regex: 'halove(?:[);/ ]|$)'
       model: 'Halove'
-    - regex: 'ACTOMA ACE[);/ ]'
+    - regex: 'ACTOMA ACE(?:[);/ ]|$)'
       model: 'Actoma Ace'
-    - regex: 'monica[);/ ]'
+    - regex: 'monica(?:[);/ ]|$)'
       model: 'Monica'
-    - regex: 'POWER[);/ ]'
+    - regex: 'POWER(?:[);/ ]|$)'
       model: 'Power'
-    - regex: 'GALAZ[);/ ]'
+    - regex: 'GALAZ(?:[);/ ]|$)'
       model: 'Galaz'
-    - regex: 'NEWDUN[);/ ]'
+    - regex: 'NEWDUN(?:[);/ ]|$)'
       model: 'Newdun'
-    - regex: 'SANTIN[ _][#]?(Dante|Candy U7|Armor|YSL-Y7|ANT.W|N[13]|JS|S6|V9)[);/ ]'
+    - regex: 'SANTIN[ _][#]?(Dante|Candy U7|Armor|YSL-Y7|ANT.W|N[13]|JS|S6|V9)(?:[);/ ]|$)'
       model: '$1'
 
 # Siemens
@@ -10600,13 +10854,13 @@ Siemens:
 
 # Soundmax
 Soundmax:
-   regex: '(SM-LED32M(?:11|04)S)(?:_-Ver01)?[);/ ]'
+   regex: '((?:SM-LED32M(?:11|04)S)(?:_-Ver01)?|SM-LED40M04S)(?:[);/ ]|$)'
    device: 'tv'
    model: '$1'
 
 # Samsung
 Samsung:
-  regex: 'SAMSUNG(?! ?Browser)|Maple |SC-(?:02[CHMKJG]|03[JLK]|04[ELJ]|05G|52A|01[HFGLKM])|N[57]100|N5110|N9100|S(?:CH|GH|PH|EC|AM|HV|HW|M)-|SMART-TV|GT-|(?<!GOG|GOG )Galaxy|(?:portalmmm|o2imode)/2\.0 [SZ]|sam[rua]|vollo Vi86[);/ ]|(?:OTV-)?SMT-E5015|ISW11SC|SCV4[0-356]|SCV3[1-9]|40[34]SC|SCL22|SCG0[12]'
+  regex: 'SAMSUNG(?! ?Browser)|Maple |SC-(?:02[CHMKJG]|03[JLK]|04[ELJ]|05G|52A|01[HFGLKM])|N[57]100|N5110|N9100|S(?:CH|GH|PH|EC|AM|HV|HW|M)-|SMART-TV|GT-|(?<!GOG|GOG )Galaxy|(?:portalmmm|o2imode)/2\.0 [SZ]|sam[rua]|vollo Vi86(?:[);/ ]|$)|(?:OTV-)?SMT-E5015|ISW11SC|SCV4[0-35678]|SCV3[1-9]|40[34]SC|SCL22|SCG0[126]|SCT21'
   device: 'smartphone'
   models:
     # explicit tv models
@@ -10624,9 +10878,12 @@ Samsung:
     - regex: '(?:SAMSUNG-)?(?:GT-)?N5100'
       device: 'tablet'
       model: 'GALAXY Note 8.0"'
-    - regex: '(?:SAMSUNG-)?SM-T677A'
+    - regex: '(?:SAMSUNG-)?SM-T677(?:[ATV]|N[KL])?(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY View 18.4" LTE'
+    - regex: '(?:SAMSUNG-)?SM-T670(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'GALAXY View 18.4" WiFi'
     - regex: '(?:SAMSUNG-)?(?:GT-)?N5110'
       device: 'tablet'
       model: 'GALAXY Note 8.0" WiFi'
@@ -10657,6 +10914,9 @@ Samsung:
     - regex: '(?:SAMSUNG-)?GT-P511[03]'
       device: 'tablet'
       model: 'GALAXY Tab 2 10.1" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-T217T'
+      device: 'tablet'
+      model: 'GALAXY Tab 3 7.0" 4G'
     - regex: '(?:SAMSUNG-)?GT-P5200'
       device: 'tablet'
       model: 'GALAXY Tab 3 10.1"'
@@ -10699,46 +10959,46 @@ Samsung:
     - regex: '(?:SAMSUNG-)?SM-P905'
       device: 'tablet'
       model: 'GALAXY NotePRO 12.2" LTE'
-    - regex: '(?:SAMSUNG-)?SM-P587[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-P587(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab A 10.1" with S Pen (2016) LTE'
-    - regex: '(?:SAMSUNG-)?SM-P205[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-P205(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab A 8.0" with S Pen (2019) LTE'
-    - regex: '(?:SAMSUNG-)?SM-P200[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-P200(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab A 8.0" with S Pen (2019) WiFi'
     - regex: '(?:SAMSUNG-)?SM-T11[03]'
       device: 'tablet'
       model: 'GALAXY Tab 3 7.0" Lite WiFi'
-    - regex: '(?:SAMSUNG-)?SM-(?:T830[X]?|T837R4)[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-(?:T830[X]?|T837R4)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab S4 10.5" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-(?:T835[CN]?|T837[VTA])[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-(?:T835[CN]?|T837[VTA])(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab S4 10.5"'
-    - regex: '(?:SAMSUNG-)?SM-(?:T725[N]?|T720X|T727[AV])[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-(?:T725[N]?|T720X|T727[AV])(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab S5e 10.5"'
-    - regex: '(?:SAMSUNG-)?SM-T720[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-T720(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab S5e 10.5" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-T865N?[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-T865N?(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab S6 10.5"'
-    - regex: '(?:SAMSUNG-)?SM-T867[V]?[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-T867[V]?(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab S6 10.5" LTE'
-    - regex: '(?:SAMSUNG-)?SM-P615[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-P615(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab S6 10.4" Lite'
-    - regex: '(?:SAMSUNG-)?SM-P610[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-P610(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab S6 10.4" Lite WiFi'
-    - regex: '(?:SAMSUNG-)?SM-T860[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-T860(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab S6 10.5" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-T111[M]?[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-T111[M]?(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab 3 7.0" Lite'
     - regex: '(?:SAMSUNG-)?SM-T116(?:BU|NU|NY)?'
@@ -10774,16 +11034,16 @@ Samsung:
     - regex: '(?:SAMSUNG-)?SM-T330'
       device: 'tablet'
       model: 'GALAXY Tab 4 8.0" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-T33[15]'
+    - regex: '(?:SAMSUNG-)?SM-(?:T33[215]|T337[AVT])'
       device: 'tablet'
       model: 'GALAXY Tab 4 8.0" LTE'
     - regex: '(?:SAMSUNG-)?SM-T520'
       device: 'tablet'
       model: 'GALAXY TabPRO 10.1" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-T53[15]'
+    - regex: '(?:SAMSUNG-)?SM-(?:T53[15]|T537[AV])'
       device: 'tablet'
       model: 'GALAXY Tab 4 10.1" LTE'
-    - regex: '(?:SAMSUNG-)?SM-T536[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-T536(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab 4 10.1" Advanced'
     - regex: '(?:SAMSUNG-)?SM-T320'
@@ -10795,31 +11055,31 @@ Samsung:
     - regex: '(?:SAMSUNG-)?SM-T525'
       device: 'tablet'
       model: 'GALAXY TabPRO 10.1" LTE'
-    - regex: '(?:SAMSUNG-)?SM-T530(?:NU)?'
+    - regex: '(?:SAMSUNG-)?SM-(?:T530(?:NU)?|T533)'
       device: 'tablet'
       model: 'GALAXY Tab 4 10.1" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T700'
       device: 'tablet'
       model: 'GALAXY Tab S 8.4" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-T705'
+    - regex: '(?:SAMSUNG-)?SM-(?:T705|T707A)'
       device: 'tablet'
       model: 'GALAXY Tab S 8.4" LTE'
     - regex: '(?:SAMSUNG-)?SM-T800'
       device: 'tablet'
       model: 'GALAXY Tab S 10.5" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-(?:T805|T807[VP]?)'
+    - regex: '(?:SAMSUNG-)?(?:SM-(?:T805|T807[VP]?)|SCT21)'
       device: 'tablet'
       model: 'GALAXY Tab S 10.5" LTE'
     - regex: '(?:SAMSUNG-)?SM-(?:T813|T810)'
       device: 'tablet'
       model: 'GALAXY Tab S2 9.7" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-(?:T719[YC]?|T715(?:[YC]|N0)?)[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-(?:T719[YC]?|T715(?:[YC]|N0)?)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab S2 8.0" LTE'
-    - regex: '(?:SAMSUNG-)?SM-(?:T71[03]|T710X)[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-(?:T71[03]|T710X)(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab S2 8.0" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-(?:T815|T817[ATW]?|T819[Y]?)'
+    - regex: '(?:SAMSUNG-)?SM-(?:T815|T817[ATW]?|T818[ATW]|T819[Y]?)'
       device: 'tablet'
       model: 'GALAXY Tab S2 9.7" LTE'
     - regex: '(?:SAMSUNG-)?SM-T820'
@@ -10840,10 +11100,10 @@ Samsung:
     - regex: '(?:SAMSUNG-)?SM-T3[58]0'
       device: 'tablet'
       model: 'GALAXY Tab A 8.0" WiFi'
-    - regex: '(?:SAMSUNG-)?SM-(?:P350|T3[58]5)'
+    - regex: '(?:SAMSUNG-)?SM-(?:P350|T3[58]5|T357[TW])'
       device: 'tablet'
       model: 'GALAXY Tab A 8.0" LTE'
-    - regex: '(?:SAMSUNG-)?SM-T387(?:VK|AA|[WVT])'
+    - regex: '(?:SAMSUNG-)?SM-T387(?:R4|VK|AA|[WVT])'
       device: 'tablet'
       model: 'GALAXY Tab A 8.0" LTE (2018)'
     - regex: '(?:SAMSUNG-)?SM-T295'
@@ -10870,10 +11130,10 @@ Samsung:
     - regex: '(?:SAMSUNG-)?SM-T51[05]'
       device: 'tablet'
       model: 'GALAXY Tab A 10.1" (2019)'
-    - regex: '(?:SAMSUNG-)?SM-(?:T37[57]|T378[LSV])'
+    - regex: '(?:SAMSUNG-)?SM-(?:T37[57]|T378[KLSV])'
       device: 'tablet'
       model: 'GALAXY Tab E 8.0"'
-    - regex: '(?:SAMSUNG-)?SM-T560'
+    - regex: '(?:SAMSUNG-)?SM-T56[02]'
       device: 'tablet'
       model: 'GALAXY Tab E 9.6" WiFi'
     - regex: '(?:SAMSUNG-)?SM-T561'
@@ -10882,13 +11142,16 @@ Samsung:
     - regex: '(?:SAMSUNG-)?SM-T567V'
       device: 'tablet'
       model: 'GALAXY Tab E 9.6" 4G'
-    - regex: '(?:SAMSUNG-)?SM-T365[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-T365(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab Active 8.0"'
-    - regex: '(?:SAMSUNG-)?SM-T39[057][U]?[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-T360(?:[);/ ]|$)'
+      device: 'tablet'
+      model: 'GALAXY Tab Active 8.0" WiFi'
+    - regex: '(?:SAMSUNG-)?SM-T39[057][U]?(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Tab Active 2 8.0"'
-    - regex: '(?:SAMSUNG-)?SM-P902[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-P902(?:[);/ ]|$)'
       device: 'tablet'
       model: 'GALAXY Note Pro 12.2"'
 
@@ -10898,7 +11161,7 @@ Samsung:
       model: 'GALAXY Watch Active 2'
 
     # explicit smartphone models
-    - regex: '(?:SAMSUNG-)?SM-G850[AMSWYKL]'
+    - regex: '(?:SAMSUNG-)?SM-G850[AMSWYKLX]'
       model: 'GALAXY Alpha'
     - regex: '(?:SAMSUNG-)?GT-B5330'
       model: 'GALAXY Chat'
@@ -10922,7 +11185,7 @@ Samsung:
       model: 'Omnia II'
     - regex: '(?:SAMSUNG-)?(?:GT-I8150|SM-T255S)'
       model: 'GALAXY W'
-    - regex: 'SC-01H[);/ ]'
+    - regex: 'SC-01H(?:[);/ ]|$)'
       model: 'GALAXY Active Neo'
     - regex: '(?:SAMSUNG-)?GT-S5830'
       model: 'GALAXY Ace'
@@ -10936,9 +11199,11 @@ Samsung:
       model: 'GALAXY Ace 4 Duos'
     - regex: '(?:SAMSUNG-)?SM-G313[HU]'
       model: 'GALAXY Ace 4 Lite'
-    - regex: '(?:SAMSUNG-)?SM-G318H[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-G318(?:H|ML)(?:[);/ ]|$)'
       model: 'GALAXY Ace 4 Neo'
-    - regex: '(?:SAMSUNG-)?SHV-E120S[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-G9100(?:[);/ ]|$)'
+      model: 'GALAXY S II'
+    - regex: '(?:SAMSUNG-)?SHV-E120S(?:[);/ ]|$)'
       model: 'GALAXY S II HD LTE'
     - regex: '(?:SAMSUNG-)?GT-I8190'
       model: 'GALAXY S III mini'
@@ -10952,6 +11217,8 @@ Samsung:
       model: 'H1'
     - regex: '(?:SAMSUNG-)?GT-I85[23]0'
       model: 'GALAXY Beam'
+    - regex: '(?:SAMSUNG-)?SM-G3858'
+      model: 'GALAXY Beam 2'
     - regex: '(?:SAMSUNG-)?SM-G600S'
       model: 'GALAXY Wide'
     - regex: '(?:SAMSUNG-)?GT-I855[028]'
@@ -10962,7 +11229,7 @@ Samsung:
       model: 'GALAXY Core Advance'
     - regex: '(?:SAMSUNG-)?GT-I8730'
       model: 'GALAXY Express'
-    - regex: '(?:SAMSUNG-)?SM-E500(?:HQ|[0FHM])'
+    - regex: '(?:SAMSUNG-)?SM-(?:E500(?:HQ|YZ|[0FHM])|S978L)'
       model: 'GALAXY E5'
     - regex: '(?:SAMSUNG-)?SM-E700(?:0|9|F|H|M)'
       model: 'GALAXY E7'
@@ -10996,7 +11263,7 @@ Samsung:
       model: 'GALAXY S III'
     - regex: '(?:SAMSUNG-)?(?:GT-I9305|SCH-R530)'
       model: 'GALAXY S III LTE'
-    - regex: '(?:SAMSUNG-)?(?:GT-I9500|GT-I9502|GT-I9505|SCH-I545|SCH-I959|SCH-R970|GALAXY-S4|SGH-M919N?)'
+    - regex: '(?:SAMSUNG-)?(?:SM-S975L|GT-I9500|GT-I9502|GT-I9505|SCH-I545|SCH-I959|SCH-R970|GALAXY-S4|SGH-M919N?)|SC-04E'
       model: 'GALAXY S4'
     - regex: '(?:SAMSUNG-)?GT-I9506'
       model: 'GALAXY S4 with LTE+'
@@ -11024,7 +11291,7 @@ Samsung:
       model: 'GALAXY FAME'
     - regex: '(?:SAMSUNG-)?GT-S6812'
       model: 'GALAXY FAME Duos'
-    - regex: 'SC-04J[);/ ]'
+    - regex: 'SC-04J(?:[);/ ]|$)'
       model: 'GALAXY Feel'
     - regex: '(?:SAMSUNG-)?GT-S7275'
       model: 'GALAXY ACE 3'
@@ -11079,17 +11346,19 @@ Samsung:
     - regex: '(?:SAMSUNG-)?SM-G318[HM]Z'
       model: 'GALAXY V Plus'
     - regex: '(?:SAMSUNG-)?SM-(?:G355[HM]|G3556D)'
-      model: 'GALAXY CORE 2'
+      model: 'GALAXY Core 2'
     - regex: '(?:SAMSUNG-)?SM-G350'
-      model: 'GALAXY CORE Plus'
-    - regex: '(?:SAMSUNG-)?SM-G360[FH]?'
-      model: 'GALAXY CORE Prime'
+      model: 'GALAXY Core Plus'
+    - regex: '(?:SAMSUNG-)?SM-(?:G360[FH]?|S820L)'
+      model: 'GALAXY Core Prime'
     - regex: '(?:SAMSUNG-)?SM-G361[FH]?'
-      model: 'GALAXY CORE Prime Value Edition'
+      model: 'GALAXY Core Prime Value Edition'
     - regex: '(?:SAMSUNG-)?SM-(?:G386F|G3586V)'
-      model: 'GALAXY CORE LTE'
+      model: 'GALAXY Core LTE'
     - regex: '(?:SAMSUNG-)?SM-G3568V'
-      model: 'GALAXY CORE Mini 4G'
+      model: 'GALAXY Core Mini 4G'
+    - regex: '(?:SAMSUNG-)?SM-G5108Q'
+      model: 'GALAXY Core Max'
     - regex: '(?:SAMSUNG-)?SM-G3815'
       model: 'GALAXY EXPRESS II'
     - regex: '(?:SAMSUNG-)?SM-G388F'
@@ -11110,15 +11379,15 @@ Samsung:
       model: 'GALAXY S5 Neo'
     - regex: '(?:SAMSUNG-)?SM-G860P'
       model: 'GALAXY S5 K Sport'
-    - regex: '(?:SAMSUNG-)?SM-G920(?:F[DQ]|W8|[089AFIKLPRSTVX])?|SC-05G'
+    - regex: '(?:SAMSUNG-)?(?:SM-G920(?:F[DQ]|W8|[089AFIKLPRSTVX])?|SM-S907VL)|SC-05G'
       model: 'GALAXY S6'
     - regex: '(?:SAMSUNG-)?SM-G890A'
       model: 'GALAXY S5 Active'
-    - regex: '(?:SAMSUNG-)?SM-G925[0ADFIKLPRSTVW]|SCV31|404SC'
+    - regex: '(?:SAMSUNG-)?SM-G925[0ADFIKLPRSTVWX]|SCV31|404SC'
       model: 'GALAXY S6 Edge'
-    - regex: '(?:SAMSUNG-)?SM-G928(?:7C|R4|W8|[07ACFGIKLPSTV])'
+    - regex: '(?:SAMSUNG-)?SM-G928(?:7C|R4|W8|[07ACFGIKLPSTVX])'
       model: 'GALAXY S6 Edge+'
-    - regex: '(?:SAMSUNG-)?SM-G930(?:FD|W8|[0AFKLPRSTUVX])?[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-G930(?:FD|W8|[0AFKLPRSTUVX8])?(?:[);/ ]|$)'
       model: 'GALAXY S7'
     - regex: '(?:SAMSUNG-)?SM-G935(?:R4|W8|[0AFKLPSTUVX])|SC-02H|SCV33'
       model: 'GALAXY S7 Edge'
@@ -11142,7 +11411,7 @@ Samsung:
       model: 'GALAXY S10 Lite'
     - regex: '(?:SAMSUNG-)?(?:SM-G975[0FUWNX]|SCV42|SC-04L)'
       model: 'GALAXY S10+'
-    - regex: '(?:SAMSUNG-)?SM-G970[08FUNWX][);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-G970[08FUNWX](?:[);/ ]|$)'
       model: 'GALAXY S10e'
     - regex: '(?:SAMSUNG-)?SM-G980F'
       model: 'GALAXY S20'
@@ -11164,7 +11433,7 @@ Samsung:
       model: 'GALAXY Discover'
     - regex: '(?:SAMSUNG-)?SCH-S738'
       model: 'GALAXY Centura'
-    - regex: 'vollo Vi86[);/ ]'
+    - regex: 'vollo Vi86(?:[);/ ]|$)'
       model: 'Vollo Vi86'
     - regex: '(?:SAMSUNG-)?SM-G386(?:T1|T)'
       model: 'GALAXY Avant'
@@ -11172,13 +11441,13 @@ Samsung:
       model: 'GALAXY A01'
     - regex: '(?:SAMSUNG-)?SM-A260[FG]'
       model: 'GALAXY A2 Core'
-    - regex: '(?:SAMSUNG-)?SM-A300(?:FU|YZ|[09FGHMY])'
+    - regex: '(?:SAMSUNG-)?SM-A300(?:FU|YZ|XU|[09FGHMY])'
       model: 'GALAXY A3 (2015)'
     - regex: '(?:SAMSUNG-)?SM-A310(?:N0|[FMYX])'
       model: 'GALAXY A3 (2016)'
     - regex: '(?:SAMSUNG-)?SM-A320(?:FL|[FYX])'
       model: 'GALAXY A3 (2017)'
-    - regex: '(?:SAMSUNG-)?SM-A500[LSWY]?[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-A500[LSWY9]?(?:[);/ ]|$)'
       model: 'GALAXY A5'
     - regex: '(?:SAMSUNG-)?SM-A500[FGHKM0]'
       model: 'GALAXY A5 Duos'
@@ -11186,27 +11455,27 @@ Samsung:
       model: 'GALAXY A5 (2015)'
     - regex: '(?:SAMSUNG-)?SM-A510[08FKLMSYX]'
       model: 'GALAXY A5 (2016)'
-    - regex: '(?:SAMSUNG-)?SM-A520[FKLSW]'
+    - regex: '(?:SAMSUNG-)?SM-A520[FKLSWX]'
       model: 'GALAXY A5 (2017)'
-    - regex: '(?:SAMSUNG-)?SM-A600(?:AZ|FN|GN|T1|[AFGNPTU])'
+    - regex: '(?:SAMSUNG-)?SM-A600(?:AZ|FN|GN|T1|[AFGNPTUX])'
       model: 'GALAXY A6'
-    - regex: '(?:SAMSUNG-)?SM-A605(?:[FG]N|[08FG])'
+    - regex: '(?:SAMSUNG-)?SM-A605(?:[FG]N|[08FGX])'
       model: 'GALAXY A6+'
     - regex: '(?:SAMSUNG-)?SM-G6200'
       model: 'GALAXY A6s (2018)'
     - regex: '(?:SAMSUNG-)?SM-A60(?:60|6Y)'
       model: 'GALAXY A60'
-    - regex: '(?:SAMSUNG-)?SM-A700(?:YD|[09FHKLS])'
+    - regex: '(?:SAMSUNG-)?SM-A700(?:YD|[09FHKLSX])'
       model: 'GALAXY A7'
     - regex: '(?:SAMSUNG-)?SM-A710[08FKLMSYX]'
       model: 'GALAXY A7 (2016)'
-    - regex: '(?:SAMSUNG-)?SM-A720[FS]'
+    - regex: '(?:SAMSUNG-)?SM-A720[FSX]'
       model: 'GALAXY A7 (2017)'
-    - regex: '(?:SAMSUNG-)?SM-A750(?:GN|[FGCN])'
+    - regex: '(?:SAMSUNG-)?SM-A750(?:GN|[FGCNX])'
       model: 'GALAXY A7 (2018)'
-    - regex: '(?:SAMSUNG-)?SM-A71(?:5[FW])?[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-A71(?:5[FW])?(?:[);/ ]|$)'
       model: 'GALAXY A71'
-    - regex: '(?:SAMSUNG-)?SM-A716U[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-A716U(?:[);/ ]|$)'
       model: 'GALAXY A71 5G'
     - regex: '(?:SAMSUNG-)?SM-A(?:530F|800[0FISY])|SCV32'
       model: 'GALAXY A8'
@@ -11216,7 +11485,7 @@ Samsung:
       model: 'GALAXY A8 (2016)'
     - regex: '(?:SAMSUNG-)?SM-G887[0F]'
       model: 'GALAXY A8s'
-    - regex: '(?:SAMSUNG-)?SM-A530[NW]'
+    - regex: '(?:SAMSUNG-)?SM-A530[NWXM]'
       model: 'GALAXY A8 (2018)'
     - regex: '(?:SAMSUNG-)?SM-A730F'
       model: 'GALAXY A8+ (2018)'
@@ -11226,7 +11495,7 @@ Samsung:
       model: 'GALAXY A9 7'
     - regex: '(?:SAMSUNG-)?SM-A920[0FXN]'
       model: 'GALAXY A9 (2018)'
-    - regex: '(?:SAMSUNG-)?SM-G8850'
+    - regex: '(?:SAMSUNG-)?SM-G885[08]'
       model: 'GALAXY A9 Star'
     - regex: '(?:SAMSUNG-)?SM-(?:A910[0F]|G887N)'
       model: 'GALAXY A9 Pro'
@@ -11240,9 +11509,9 @@ Samsung:
       model: 'GALAXY A11'
     - regex: '(?:SAMSUNG-)?SM-(?:A205(?:[FGSWU]|YN|U1)|S205DL)|SC-02M|SCV46'
       model: 'GALAXY A20'
-    - regex: '(?:SAMSUNG-)?SM-A215U[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-A215U(?:[);/ ]|$)'
       model: 'GALAXY A21'
-    - regex: '(?:SAMSUNG-)?SM-A217F[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-A217F(?:[);/ ]|$)'
       model: 'GALAXY A21s'
     - regex: '(?:SAMSUNG-)?SM-A202[FG]'
       model: 'GALAXY A20e'
@@ -11252,17 +11521,17 @@ Samsung:
       model: 'GALAXY A30'
     - regex: '(?:SAMSUNG-)?SM-A307(?:FN|GN|GT|[FG])'
       model: 'GALAXY A30s'
-    - regex: '(?:SAMSUNG-)?SM-A315[FNG][);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-A315[FNG](?:[);/ ]|$)'
       model: 'GALAXY A31'
     - regex: '(?:SAMSUNG-)?SM-A405(?:F[NM]|S)'
       model: 'GALAXY A40'
-    - regex: '(?:SAMSUNG-)?SM-A305[01][);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-A305[01](?:[);/ ]|$)'
       model: 'GALAXY A40s'
-    - regex: '(?:SAMSUNG-)?SM-A415F'
+    - regex: '(?:SAMSUNG-)?(?:SM-A415F|SCV48)(?:[);/ ]|$)'
       model: 'GALAXY A41'
-    - regex: '(?:SAMSUNG-)?SM-(?:A505(?:F[NG]|[FGNWU]|YN|U1?)|S506DL|505FN)'
+    - regex: '(?:SAMSUNG-)?SM-(?:A505(?:F[NG]|[FGNWUX]|YN|U1?)|S506DL|505FN)'
       model: 'GALAXY A50'
-    - regex: '(?:SAMSUNG-)?SM-A5070[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-A5070(?:[);/ ]|$)'
       model: 'GALAXY A50s'
     - regex: '(?:SAMSUNG-)?SM-A507FN'
       model: 'GALAXY A50s'
@@ -11278,35 +11547,43 @@ Samsung:
       model: 'GALAXY A90'
     - regex: '(?:SAMSUNG-)?GT-I9301I'
       model: 'GALAXY S III Neo'
-    - regex: '(?:SAMSUNG-)?SM-J100(?:FN|MU|[FHMY])'
+    - regex: '(?:SAMSUNG-)?SM-S120VL(?:[);/ ]|$)'
+      model: 'GALAXY Luna'
+    - regex: '(?:SAMSUNG-)?SM-J100(?:FN|VPP|MU|[FHMY])'
       model: 'GALAXY J1'
-    - regex: '(?:SAMSUNG-)?SM-J105[BFHY]'
-      model: 'GALAXY J1 mini'
+    - regex: '(?:SAMSUNG-)?SM-J105[BFHYM]'
+      model: 'GALAXY J1 Mini'
     - regex: '(?:SAMSUNG-)?SM-J106[FMHB]'
       model: 'GALAXY J1 mini Prime'
-    - regex: '(?:SAMSUNG-)?SM-J120[AFHGMT]'
+    - regex: '(?:SAMSUNG-)?SM-(?:J120(?:ZN|[AFHGMTW])|J05H)'
       model: 'GALAXY J1 (2016)'
     - regex: '(?:SAMSUNG-)?SM-(?:J110[FHMLG]|J111[FM])'
       model: 'GALAXY J1 Ace'
-    - regex: '(?:SAMSUNG-)?SM-J200[FGHY]'
+    - regex: '(?:SAMSUNG-)?SM-J200[FGHYM]'
       model: 'GALAXY J2'
+    - regex: '(?:SAMSUNG-)?SM-J200BT'
+      model: 'GALAXY J2 Duos'
     - regex: '(?:SAMSUNG-)?SM-J260AZ'
       model: 'GALAXY J2 Pure'
     - regex: '(?:SAMSUNG-)?SM-(?:J260([AFGMY]|T1)|S260DL)'
       model: 'GALAXY J2 Core'
-    - regex: '(?:SAMSUNG-)?SM-J(?:210F|250[FMGY])'
+    - regex: '(?:SAMSUNG-)?SM-J(?:210F|250[FNMGY])'
       model: 'GALAXY J2 Pro'
-    - regex: '(?:SAMSUNG-)?SM-S367VL'
+    - regex: '(?:SAMSUNG-)?SM-(?:S367VL|S357BL)'
       model: 'GALAXY J3 Orbit'
     - regex: '(?:SAMSUNG-)?SM-J311(?:[09]|9S)'
       model: 'GALAXY J3 Pro'
-    - regex: '(?:SAMSUNG-)?SM-J327(?:T1|[ATW])[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-S320VL(?:[);/ ]|$)'
+      model: 'GALAXY J3 Sky'
+    - regex: '(?:SAMSUNG-)?SM-S327VL(?:[);/ ]|$)'
+      model: 'GALAXY J3 Luna Pro'
+    - regex: '(?:SAMSUNG-)?SM-J327(?:T1|[ATW])(?:[);/ ]|$)'
       model: 'GALAXY J3 Prime'
-    - regex: '(?:SAMSUNG-)?SM-J327(?:F|R4)'
+    - regex: '(?:SAMSUNG-)?SM-J327(?:[FP]|R4)'
       model: 'GALAXY J3 Emerge'
-    - regex: '(?:SAMSUNG-)?SM-J337R4[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-J337R4(?:[);/ ]|$)'
       model: 'GALAXY J3 Aura'
-    - regex: '(?:SAMSUNG-)?SM-J337T[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-J337T(?:[);/ ]|$)'
       model: 'GALAXY J3 Star'
     - regex: '(?:SAMSUNG-)?SM-J327V'
       model: 'GALAXY J3 Eclipse'
@@ -11314,17 +11591,17 @@ Samsung:
       model: 'GALAXY J3 Luna Pro'
     - regex: '(?:SAMSUNG-)?SM-J3109'
       model: 'GALAXY J3 (2015)'
-    - regex: '(?:SAMSUNG-)?SM-J320(?:FN|R4|W8|[AFGHMNPV])'
+    - regex: '(?:SAMSUNG-)?SM-J320(?:[ZF]N|R4|W8|YZ|[AFGHMNPVY])'
       model: 'GALAXY J3 (2016)'
-    - regex: '(?:SAMSUNG-)?SM-(?:J330(?:[08FGLN]|FN)|J327(?:R7|U))[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-(?:J330(?:[08FGLN]|FN)|J327(?:R7|U))(?:[);/ ]|$)'
       model: 'GALAXY J3 (2017)'
-    - regex: '(?:SAMSUNG-)?SM-J337(?:[AWPUV]|VPP)[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-J337(?:[AWPUV]|VPP)(?:[);/ ]|$)'
       model: 'GALAXY J3 (2018)'
     - regex: '(?:SAMSUNG-)?SM-J400[FGM]'
       model: 'GALAXY J4'
-    - regex: '(?:SAMSUNG-)?SM-J500(?:[8F]|FN|G|Y|M|H|N0)[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-J500(?:[8F]|FN|[7GYMH]|N0)(?:[);/ ]|$)'
       model: 'GALAXY J5 (2015)'
-    - regex: '(?:SAMSUNG-)?SM-(?:J510(?:[8FHKLS]|[UFMG]N)|5108|G510H)[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-(?:J510(?:[8FHKLSYG]|[UFMG]N)|5108|G510H)(?:[);/ ]|$)'
       model: 'GALAXY J5 (2016)'
     - regex: '(?:SAMSUNG-)?SM-J530'
       model: 'GALAXY J5 (2017)'
@@ -11344,9 +11621,9 @@ Samsung:
       model: 'GALAXY J7 (2015)'
     - regex: '(?:SAMSUNG-)?SM-(?:J700(?:T1|T)|J710GN|J7109)'
       model: 'GALAXY J7 (2016)'
-    - regex: '(?:SAMSUNG-)?SM-(?:J730[K]|J727(?:[USF]|R4))'
+    - regex: '(?:SAMSUNG-)?SM-(?:J730[K]|J727(?:[AUSF]|R4))(?:[);/ ]|$)'
       model: 'GALAXY J7 (2017)'
-    - regex: '(?:SAMSUNG-)?SM-J737(?:[AVPUS]|T1?|VPP|R4)[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-J737(?:[AVPUS]|T1?|VPP|R4)(?:[);/ ]|$)'
       model: 'GALAXY J7 (2018)'
     - regex: '(?:SAMSUNG-)?SM-C710F'
       model: 'GALAXY J7+ (C7)'
@@ -11364,7 +11641,7 @@ Samsung:
       model: 'GALAXY J7 Core' # also GALAXY J7 Nxt and GALAXY J7 Neo
     - regex: '(?:SAMSUNG-)?SM-J720[FM]'
       model: 'GALAXY J7 Duo'
-    - regex: '(?:SAMSUNG-)?SM-S767VL'
+    - regex: '(?:SAMSUNG-)?SM-(?:S767VL|S757BL)'
       model: 'GALAXY J7 Crown'
     - regex: '(?:SAMSUNG-)?SM-J727(?:P|T|V)'
       model: 'GALAXY J7 V'
@@ -11396,19 +11673,23 @@ Samsung:
       model: 'GALAXY M30'
     - regex: '(?:SAMSUNG-)?SM-M315F'
       model: 'GALAXY M31'
+    - regex: '(?:SAMSUNG-)?SM-M317F'
+      model: 'GALAXY M31s'
     - regex: '(?:SAMSUNG-)?SM-M405'
       model: 'GALAXY M40'
+    - regex: '(?:SAMSUNG-)?SM-W201([689])'
+      model: 'GALAXY W201$1'
 
     - regex: '(?:SAMSUNG-)?SM-G850F'
       model: 'GALAXY Alpha'
     - regex: '(?:SAMSUNG-)?SM-G910S'
       model: 'GALAXY Round'
-    - regex: '(?:SAMSUNG-)?SM-(?:G550(?:FY|T[12]?)|G55[01]0|G5520)'
+    - regex: '(?:SAMSUNG-)?SM-(?:G550(?:FY|T[12]?)|S550TL|G55[01]0|G5520)'
       model: 'GALAXY On5'
     - regex: '(?:SAMSUNG-)?SM-G5528'
       model: 'GALAXY On5 (2016)'
     - regex: '(?:SAMSUNG-)?SM-G600(?:FY|[0F])'
-      model: 'GALAXY On7'     
+      model: 'GALAXY On7'
     - regex: '(?:SAMSUNG-)?SM-G610[0KLS]'
       model: 'GALAXY On7 (2016)'
     - regex: '(?:SAMSUNG-)?SM-G611[FSKL]'
@@ -11433,13 +11714,17 @@ Samsung:
       model: 'GALAXY Z3'
     - regex: '(?:SAMSUNG-)?SM-Z400[FY]'
       model: 'GALAXY Z4'
-    - regex: '(?:SAMSUNG-)?SM-(?:G150|G155S)[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-(?:G150|G155S)(?:[);/ ]|$)'
       model: 'GALAXY Folder'
-    - regex: '(?:SAMSUNG-)?(?:SM-G16(?:[05]0?|0N))[);/ ]'
+    - regex: '(?:SAMSUNG-)?(?:SM-G16(?:[05]0?|0N))(?:[);/ ]|$)'
       model: 'GALAXY Folder 2'
-    - regex: '(?:SAMSUNG-)?SM-J321AZ[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-J321AZ(?:[);/ ]|$)'
       model: 'GALAXY Sol'
-    - regex: '(?:SAMSUNG-)?SM-J727AZ[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-J326AZ(?:[);/ ]|$)'
+      model: 'GALAXY Sol 2'
+    - regex: '(?:SAMSUNG-)?SM-J336AZ(?:[);/ ]|$)'
+      model: 'GALAXY Sol 3'
+    - regex: '(?:SAMSUNG-)?SM-J727AZ(?:[);/ ]|$)'
       model: 'GALAXY Halo'
     - regex: '(?:SAMSUNG-)?SM-J327AZ'
       model: 'GALAXY Amp Prime 2'
@@ -11450,7 +11735,7 @@ Samsung:
     - regex: '(?:SAMSUNG-)?SM-(?:F900[0FU]|F907[BN])'
       model: 'GALAXY Fold'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?GT-I9060[);/ ]'
+    - regex: '(?:SAMSUNG-)?GT-I9060(?:[);/ ]|$)'
       model: 'GALAXY Grand Neo'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?GT-I9063'
@@ -11468,54 +11753,54 @@ Samsung:
     - regex: '(?:SAMSUNG-)?GT-N7000'
       model: 'GALAXY Note'
       device: 'phablet'
-    - regex: 'SC-01G[);/ ]'
+    - regex: 'SC-01G(?:[);/ ]|$)'
       model: 'GALAXY Note Edge'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-N935[FSLK][);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-N935[FSLK](?:[);/ ]|$)'
       model: 'GALAXY Note Fan Edition'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?(?:(?:GT-)?N7100|SCH-I605|SCH-N719|SCH-R950|SPH-L900)[);/ ]'
+    - regex: '(?:SAMSUNG-)?(?:(?:GT-)?N7100|SCH-I605|SCH-N719|SCH-R950|SPH-L900)(?:[);/ ]|$)'
       model: 'GALAXY Note II'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?GT-N7105'
       model: 'GALAXY Note II LTE'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-G710[25L]?[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-G710[25L]?(?:[);/ ]|$)'
       model: 'GALAXY Grand 2'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-G720(?:AX|N0|2)[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-G720(?:AX|N0|[02])(?:[);/ ]|$)'
       model: 'GALAXY Grand Max'
-    - regex: '(?:SAMSUNG-)?SM-G53(?:0[FTYHWMP]|0[AF]Z|1[FH]|0[89]W|0MU|0BT|0R4)[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-(?:G53(?:0[AFTYHWMP]|0[AF]Z|1[FH]|0[689]W|0MU|0BT|0R[47])|S920L)(?:[);/ ]|$)'
       model: 'GALAXY Grand Prime'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-G531BT[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-G531(?:BT|[MY])(?:[);/ ]|$)'
       model: 'GALAXY Grand Prime VE Duos'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-G532F[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-G532F(?:[);/ ]|$)'
       model: 'GALAXY Grand Prime Plus' # also GALAXY J2 Prime
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-G532MT[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-G532MT(?:[);/ ]|$)'
       model: 'GALAXY J2 Prime (TV)'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-G532[MG][);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-G532[MG](?:[);/ ]|$)'
       model: 'GALAXY J2 Prime'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-N7502[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-N7502(?:[);/ ]|$)'
       model: 'GALAXY Note 3 Neo Duos'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-N750[QL50]?'
       model: 'GALAXY Note 3 Neo'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-N9002[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-N9002(?:[);/ ]|$)'
       model: 'GALAXY Note 3 Duos'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-9005[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-9005(?:[);/ ]|$)'
       model: 'GALAXY Note 3 LTE'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?(?:SM-N900(?:[05689][VQ]?|[AKLPSTV]|W8)?|SCL22|SC-01F[);/ ])'
+    - regex: '(?:SAMSUNG-)?(?:SM-N900(?:[05689][VQ]?|[AKLPSTV]|W8)?|SCL22|SC-01F(?:[);/ ]|$))'
       model: 'GALAXY Note 3'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-(?:N910|910U)|N9100[);/ ]'
+    - regex: '(?:SAMSUNG-)?SM-(?:N910|910U)|N9100(?:[);/ ]|$)'
       model: 'GALAXY Note 4'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-N916[SKL]'
@@ -11524,7 +11809,7 @@ Samsung:
     - regex: '(?:SAMSUNG-)?SM-N915'
       model: 'GALAXY Note 4 Edge'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?SM-N920(?:[0ACGIKLSTPFV]|R[46]|W8)'
+    - regex: '(?:SAMSUNG-)?SM-N920(?:[0ACGIKLSTPFVX]|R[467]|W8)'
       model: 'GALAXY Note 5'
       device: 'phablet'
     - regex: '(?:SAMSUNG-)?SM-N9208'
@@ -11539,7 +11824,7 @@ Samsung:
     - regex: '(?:SAMSUNG-)?GT-I920[05]'
       model: 'GALAXY Mega 6.3'
       device: 'phablet'
-    - regex: '(?:SAMSUNG-)?(?:SM-N930F|SCV34)'
+    - regex: '(?:SAMSUNG-)?(?:SM-N930[VFST0P]|SCV34)'
       model: 'GALAXY Note 7'
       device: 'phablet'
     - regex: '(?:SAMSUNG[- ])?SM-N950|SCV37|SC-01K'
@@ -11566,10 +11851,15 @@ Samsung:
     - regex: '(?:SAMSUNG[- ])?(?:SM-N985(?:F|F/DS))'
       model: 'GALAXY Note 20 Ultra'
       device: 'phablet'
-    - regex: '(?:SAMSUNG[- ])?(?:SM-N986(?:[B|N|U|W]|B/DS|U1))'
+    - regex: '(?:SAMSUNG[- ])?(?:SM-N986(?:B/DS|U1|[BNWU])|SCG06)'
       model: 'GALAXY Note 20 Ultra 5G'
       device: 'phablet'
 
+    - regex: '(?:SAMSUNG-)?SM-W750V'
+      model: 'Ativ SE'
+    - regex: '(?:SAMSUNG-)?SM-G310R5'
+      model: 'GreatCall Touch 3'
+
     # explicit feature phones
     - regex: '(?:SAMSUNG-)?GT-E2152'
       model: 'E2152'
@@ -11581,8 +11871,6 @@ Samsung:
       model: '$1'
     - regex: 'SC-02C'
       model: 'GALAXY S II'
-    - regex: 'SC-04E'
-      model: 'GALAXY S4'
     - regex: '(?:SAMSUNG-)?((?:SM-[TNP]|GT-P)[a-z0-9_\-]+)'
       device: 'tablet'
       model: '$1'
@@ -11638,7 +11926,7 @@ Selfix:
 
 # Sencor
 Sencor:
-  regex: 'Sencor|ELEMENT[ _]?(?:7|8|9\.7|10[ _]1)(?:[ _]?V[23])?[);/ ]|ELEMENT[ _]?(?:P[0-9]+)[);/ ]'
+  regex: 'Sencor|ELEMENT[ _]?(?:7|8|9\.7|10[ _]1)(?:[ _]?V[23])?(?:[);/ ]|$)|ELEMENT[ _]?(?:P[0-9]+)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     # explicit tablet models
@@ -11691,7 +11979,7 @@ Senwa:
       model: 'V705B'
     - regex: 'Senwa[ _-]*([^;/]+) Build'
       model: '$1'
-    - regex: 'Senwa[ _-]*([^ ;/)]+)[ ;/)]'
+    - regex: 'Senwa[ _-]*([^ ;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Sky
@@ -11867,7 +12155,7 @@ SWISSMOBILITY:
 
 # Thomson
 Thomson:
-  regex: '(?:Primo(7|8)|QM73[45]-8G|QM734-2|QM736-8G\(HD\)|8950|MID1002|5014G)[);/ ]|(?:Tlink|Every)[0-9]+'
+  regex: '(?:Primo(7|8)|QM73[45]-8G|QM734-2|QM736-8G\(HD\)|8950|MID1002|5014G)(?:[);/ ]|$)|(?:Tlink|Every)[0-9]+'
   device: 'tablet'
   models:
     # already detected as manta device
@@ -11883,10 +12171,10 @@ Thomson:
       model: 'QM735-8G'
     - regex: 'QM736-8G\(HD\)'
       model: 'QM736-8G (HD)'
-    - regex: '8950[);/ ]'
+    - regex: '8950(?:[);/ ]|$)'
       model: '3G 8950'
 
-    - regex: '5014G[);/ ]'
+    - regex: '5014G(?:[);/ ]|$)'
       device: 'smartphone'
       model: '5014G'       # EGO-5014G
     - regex: 'Tlink([0-9]+)'
@@ -11898,7 +12186,7 @@ Thomson:
 
 # pantech
 Pantech:
-  regex: 'Pantech|P[GN]-|PT-[a-z0-9]{3,}|TX[T]?[0-9]+|IM-[a-z0-9]+[);/ ]|ADR910L'
+  regex: 'Pantech|P[GN]-|PT-[a-z0-9]{3,}|TX[T]?[0-9]+|IM-[a-z0-9]+(?:[);/ ]|$)|ADR910L'
   device: 'smartphone'
   models:
     # explicit smartphone models
@@ -11915,7 +12203,7 @@ Pantech:
       model: '$1'
     - regex: '(TX[T]?[0-9]+)'
       model: '$1'
-    - regex: '(IM-[a-z0-9]+)[);/ ]'
+    - regex: '(IM-[a-z0-9]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Ployer
@@ -11929,7 +12217,7 @@ Ployer:
       model: 'MOMO Mini 3GS'
     - regex: 'MOMO([0-9][^);/]*) Build'
       model: 'MOMO $1'
-    - regex: 'MOMO([0-9][^);/]*)[);/]'
+    - regex: 'MOMO([0-9][^);/]*)(?:[);/]|$)'
       model: 'MOMO $1'
 
 # Plum
@@ -11942,7 +12230,7 @@ Plum:
 
 # Polaroid
 Polaroid:
-  regex: 'Polaroid|(?:PMID|MIDC)[0-9a-z]+[);/ ]|MID(?:1014|0714)|PRO[VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z])|(?:P(?:400[56]|4526|500[56]|502[56]|504[67]|552[56])A|PSPC(?:505|550|[MZL]20A0|K21NA)|SIGMA 5)[);/ ]'
+  regex: 'Polaroid|(?:PMID|MIDC)[0-9a-z]+(?:[);/ ]|$)|MID(?:1014|0714)|PRO[VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z])|(?:P(?:400[56]|4526|500[56]|502[56]|504[67]|552[56])A|PSPC(?:505|550|[MZL]20A0|K21NA)|SIGMA 5)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit smartphone models
@@ -11984,7 +12272,7 @@ Polaroid:
       model: 'Agate'
     - regex: 'PROV350'
       model: 'ProV350'
-    - regex: 'SIGMA 5[);/ ]'
+    - regex: 'SIGMA 5(?:[);/ ]|$)'
       model: 'Sigma 5'
     - regex: 'PRO([VG]?(?:[0-9]{3,}[a-z]*|[0-9]{2}[a-z]))'
       model: 'Pro$1'
@@ -11992,7 +12280,7 @@ Polaroid:
     - regex: '(MID(?:1014|0714))'
       model: '$1'
       device: 'tablet'
-    - regex: '((?:PMID|MIDC)[0-9a-z]+)[);/ ]'
+    - regex: '((?:PMID|MIDC)[0-9a-z]+)(?:[);/ ]|$)'
       model: '$1'
       device: 'tablet'
     - regex: 'Polaroid'
@@ -12004,7 +12292,7 @@ PolyPad:
   regex: 'POLY ?PAD'
   device: 'tablet'
   models:
-    - regex: 'POLY ?PAD[_ \.]([a-z0-9]+)[);/ ]'
+    - regex: 'POLY ?PAD[_ \.]([a-z0-9]+)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'POLY ?PAD[_\.]([a-z0-9]+)'
       model: '$1'
@@ -12096,14 +12384,14 @@ Positivo:
 
 # Prestigio
 Prestigio:
-  regex: '(?:PMP|PAP|PMT|PSP|PGPS)[0-9]+[a-z0-9_]+[);/ ]|Muze C3'
+  regex: '(?:PMP|PAP|PMT|PSP|PGPS)[0-9]+[a-z0-9_]+(?:[);/ ]|$)|Muze C3'
   device: 'tablet'
   models:
     - regex: 'PMT3277_3G'
       model: 'MultiPad Ranger 7.0 3G'
-    - regex: 'PGPS7799CIS08GBPG[);/ ]'
+    - regex: 'PGPS7799CIS08GBPG(?:[);/ ]|$)'
       model: 'Geo Vision Tour 3'
-    - regex: 'PGPS7797[);/ ]'
+    - regex: 'PGPS7797(?:[);/ ]|$)'
       model: 'Geo Vision Tour 2'
     - regex: 'PMT3201_4G'
       model: 'Grace 4G'
@@ -12117,12 +12405,12 @@ Prestigio:
       model: 'X Pro'
     - regex: 'PSP7610DUO([ _][A-Z]{2})?'
       model: 'S Max'
-    - regex: '(PM[PT][0-9]+[a-z0-9_]+)[);/ ]'
+    - regex: '(PM[PT][0-9]+[a-z0-9_]+)(?:[);/ ]|$)'
       model: '$1'
-    - regex: '((?:PAP|PSP)[0-9]+[a-z0-9_]+(?: DUO)?)[);/ ]'
+    - regex: '((?:PAP|PSP)[0-9]+[a-z0-9_]+(?: DUO)?)(?:[);/ ]|$)'
       model: '$1'
       device: 'smartphone'
-    - regex: 'Muze C3[);/ ]'
+    - regex: 'Muze C3(?:[);/ ]|$)'
       model: 'Muze C3'
       device: 'smartphone'
 
@@ -12197,12 +12485,12 @@ QMobile:
     - regex: 'QTab[ _-]([^;/]+) Build'
       model: '$1 Tab'
       device: 'tablet'
-    - regex: 'QTab[ _-]([^;/)]+)[;/)]'
+    - regex: 'QTab[ _-]([^;/)]+)(?:[;/)]|$)'
       model: '$1 Tab'
       device: 'tablet'
     - regex: '(?:QMobile|Q-Smart)[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: '(?:QMobile|Q-Smart)[ _-]([^;/)]+)[;/)]'
+    - regex: '(?:QMobile|Q-Smart)[ _-]([^;/)]+)(?:[;/)]|$)'
       model: '$1'
     - regex: 'Noir X1S'
       model: 'Noir X1S'
@@ -12213,14 +12501,14 @@ QMobile:
 
 # Quantum
 Quantum:
-  regex: 'Quantum (?:Fit|MUV (?:PRO|UP)|Go|Mini|V|You [2E])[);/ ]'
+  regex: 'Quantum (?:Fit|MUV (?:PRO|UP)|Go|Mini|V|You [2E])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Quantum (Fit|Go|Mini|V|You [2E])[);/ ]'
+    - regex: 'Quantum (Fit|Go|Mini|V|You [2E])(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'Quantum MUV PRO[);/ ]'
+    - regex: 'Quantum MUV PRO(?:[);/ ]|$)'
       model: 'MUV Pro'
-    - regex: 'Quantum MUV UP[);/ ]'
+    - regex: 'Quantum MUV UP(?:[);/ ]|$)'
       model: 'MUV Up'
 
 # Quechua
@@ -12254,14 +12542,14 @@ Turbo-X:
   models:
     - regex: 'Turbox_S3'
       model: 'S3'
-    - regex: 'Turbo-X_A2[);/ ]'
+    - regex: 'Turbo-X_A2(?:[);/ ]|$)'
       model: 'A2'
-    - regex: 'Turbo-X_e3[);/ ]'
+    - regex: 'Turbo-X_e3(?:[);/ ]|$)'
       model: 'E3'
-    - regex: 'Turbo-X Ice[);/ ]'
+    - regex: 'Turbo-X Ice(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Ice'
-    - regex: 'Hive V 3G[);/ ]'
+    - regex: 'Hive V 3G(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Hive V 3G'
 
@@ -12273,22 +12561,22 @@ Turbo-X:
 
 # Turbo
 Turbo:
-  regex: 'Turbo[_ ]?(?:X5[_ ]?(?:Max|Black|Space|Hero)|X8|X6[ _]Z|X[ _]Ray)[);/ ]'
+  regex: 'Turbo[_ ]?(?:X5[_ ]?(?:Max|Black|Space|Hero)|X8|X6[ _]Z|X[ _]Ray)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'TurboX5Space[);/ ]'
+    - regex: 'TurboX5Space(?:[);/ ]|$)'
       model: 'X5 Space'
-    - regex: 'TurboX5Hero[);/ ]'
+    - regex: 'TurboX5Hero(?:[);/ ]|$)'
       model: 'X5 Hero'
-    - regex: 'TurboX[ _]Ray[);/ ]'
+    - regex: 'TurboX[ _]Ray(?:[);/ ]|$)'
       model: 'X Ray'
-    - regex: 'Turbo[ _]?X5[ _]?Black[);/ ]'
+    - regex: 'Turbo[ _]?X5[ _]?Black(?:[);/ ]|$)'
       model: 'X5 Black'
-    - regex: 'Turbo[ _]X5[ _]Max[);/ ]'
+    - regex: 'Turbo[ _]X5[ _]Max(?:[);/ ]|$)'
       model: 'X5 Max'
-    - regex: 'Turbo[ _]X6[ _]Z[);/ ]'
+    - regex: 'Turbo[ _]X6[ _]Z(?:[);/ ]|$)'
       model: 'X6 Z'
-    - regex: 'Turbo[ _]X8[);/ ]'
+    - regex: 'Turbo[ _]X8(?:[);/ ]|$)'
       model: 'X8'
 
 # Silent Circle
@@ -12299,15 +12587,15 @@ Turbo:
 
 # Sigma
 Sigma:
-  regex: 'Sigma|(X[_-]Style[ _]?Tab[_ ]A([0-9]{2,3})|X[-_ ]?treme[-_ ]?PQ[0-9]{2}|X-Style_S5501)[);/ ]'
+  regex: 'Sigma|(X[_-]Style[ _]?Tab[_ ]A([0-9]{2,3})|X[-_ ]?treme[-_ ]?PQ[0-9]{2}|X-Style_S5501)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(?:Sigma[ _])?X[-_ ]?treme[-_ ]?PQ([0-9]{2})[);/ ]'
+    - regex: '(?:Sigma[ _])?X[-_ ]?treme[-_ ]?PQ([0-9]{2})(?:[);/ ]|$)'
       model: 'X-Treme PQ$1'
-    - regex: 'X[_-]Style[ _]?Tab[_ ]A([0-9]{2,3})[);/ ]'
+    - regex: 'X[_-]Style[ _]?Tab[_ ]A([0-9]{2,3})(?:[);/ ]|$)'
       model: 'X-Style Tab A$1'
       device: 'tablet'
-    - regex: '(?:Sigma[ _])?X[-_ ]?Style[-_ ]S([0-9]+)[);/ ]'
+    - regex: '(?:Sigma[ _])?X[-_ ]?Style[-_ ]S([0-9]+)(?:[);/ ]|$)'
       model: 'X-Style S$1'
 
 # Spice
@@ -12322,93 +12610,115 @@ Spice:
 
 # Sharp (jp.sharp)
 Sharp:
-  regex: 'SHARP|SBM|SH-?[0-9]+[a-z]?[);/ ]|AQUOS|(?:SH-M0[589]|S[35]-SH|SH-Z(10|01)|SH-[CL]02|[45]02SH|[36]05SH|70[126]SH|80[138]SH|901SH|50[3679]SH|SHL22|SHV4[0-7]|SHV3[35689]|FS80(?:1[08]|32|28|0[29])|TG-L900S|NP601SH|603SH|SHV40_u)[);/ ]'
+  regex: 'SHARP|SBM|SH-?[0-9]+[a-z]?(?:[);/ ]|$)|AQUOS|(?:SH-M0[45789]|SH-M1[123]|S[357]-SH|SH-Z(10|01)|SH-[CL]02|SH-RM1[12]|404SH|[45]02SH|[36]05SH|70[1246]SH|80[138]SH|90[1678]SH|50[3679]SH|SHL22|SHV4[0-8]|SHV3[13-9](?:[-_]u)?|FS80(?:1[08]|32|28|0[29])|TG-L900S|NP601SH|603SH|SHV4[035][-_]u|SW001SH|SHG01)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit smartphone models
-    - regex: '506SH[);/ ]'
+    - regex: '506SH(?:[);/ ]|$)'
       model: 'Aquos Xx3'
-    - regex: '603SH[);/ ]'
+    - regex: '603SH(?:[);/ ]|$)'
       model: 'Aquos Xx3 Mini'
-    - regex: '50[23]SH[);/ ]'
+    - regex: '50[23]SH(?:[);/ ]|$)'
       model: 'Aquos Xx2'
-    - regex: '507SH[);/ ]'
-      model: 'One'
-    - regex: 'S3-SH[);/ ]'
-      model: 'One S3'
-    - regex: 'S5-SH[);/ ]'
-      model: 'One S5'
-    - regex: 'SH-M05[);/ ]'
+    - regex: '404SH(?:[);/ ]|$)'
+      model: 'Aquos Xx'
+    - regex: '507SH(?:[);/ ]|$)'
+      model: 'Android One'
+    - regex: 'S3-SH(?:[);/ ]|$)'
+      model: 'Android One S3'
+    - regex: 'S5-SH(?:[);/ ]|$)'
+      model: 'Android One S5'
+    - regex: 'S7-SH(?:[);/ ]|$)'
+      model: 'Android One S7'
+    - regex: 'SH-M04(?:[);/ ]|$)'
+      model: 'Aquos SH-M04'
+    - regex: 'SH-M05(?:[);/ ]|$)'
       model: 'Aquos Sense Lite'
-    - regex: '(?:SH-Z10|801SH)[);/ ]'
+    - regex: 'SH-M07(?:[);/ ]|$)'
+      model: 'Aquos Sense Plus'
+    - regex: 'SH-M12(?:[);/ ]|$)'
+      model: 'Aquos S3 Dual SIM'
+    - regex: '(?:SH-Z10|801SH)(?:[);/ ]|$)'
       model: 'Aquos zero'
-    - regex: 'SH-Z01[);/ ]'
+    - regex: '(?:SH-M13|906SH)(?:[);/ ]|$)'
+      model: 'Aquos Zero 2'
+    - regex: 'SH-Z01(?:[);/ ]|$)'
       model: 'Aquos S2 (C10)'
-    - regex: '(?:SH-02E|SH-01[GH]|SH-04H)[);/ ]'
+    - regex: '(?:SH-02E|SH-01[GH]|SH-04H)(?:[);/ ]|$)'
       model: 'Aquos Phone Zeta'
-    - regex: 'SH06D[);/ ]'
+    - regex: 'SH06D(?:[);/ ]|$)'
       model: 'Aquos Phone SH-06D'
-    - regex: 'SHL22[);/ ]'
+    - regex: 'SHL22(?:[);/ ]|$)'
       model: 'Aquos Phone SHL22'
-    - regex: 'SH-L02[);/ ]'
+    - regex: 'SH-L02(?:[);/ ]|$)'
       model: 'Aquos L2'
-    - regex: '(?:605SH|SH-03J|SHV39)[);/ ]'
+    - regex: '(?:605SH|SH-03J|SHV39)(?:[);/ ]|$)'
       model: 'Aquos R'
-    - regex: '(?:701SH|SHV41)[);/ ]'
+    - regex: '(?:605SH|SH-03J|SHV39)(?:[);/ ]|$)'
+      model: 'Aquos R'
+    - regex: '(?:701SH|SHV41)(?:[);/ ]|$)'
       model: 'Aquos R Compact'
-    - regex: '(?:SH-M09|SHV42|706SH|SH-03K)[);/ ]'
+    - regex: '(?:SH-M09|SHV42|706SH|SH-03K)(?:[);/ ]|$)'
       model: 'Aquos R2'
-    - regex: '803SH[);/ ]'
+    - regex: '803SH(?:[);/ ]|$)'
       model: 'Aquos R2 Compact'
-    - regex: 'SH-C02[);/ ]'
+    - regex: '(?:908SH|SHG01)(?:[);/ ]|$)'
+      model: 'Aquos R5G'
+    - regex: 'SH-C02(?:[);/ ]|$)'
       model: 'Aquos V'
-    - regex: '(?:SH-02J|SH-04G)[);/ ]'
+    - regex: '704SH(?:[);/ ]|$)'
+      model: 'Simple Smartphone 4'
+    - regex: '(?:SH-02J|SH-04G)(?:[);/ ]|$)'
       model: 'Aquos Ever'
-    - regex: 'SH-02H[);/ ]'
+    - regex: 'SH-02H(?:[);/ ]|$)'
       model: 'Aquos Compact'
-    - regex: '305SH[);/ ]'
+    - regex: '305SH(?:[);/ ]|$)'
       model: 'Aquos Crystal'
-    - regex: '402SH[);/ ]'
+    - regex: '402SH(?:[);/ ]|$)'
       model: 'Aquos Crystal X'
-    - regex: '509SH[);/ ]'
+    - regex: '509SH(?:[);/ ]|$)'
       model: 'Aquos 3'
-    - regex: 'NP601SH[);/ ]'
+    - regex: 'NP601SH(?:[);/ ]|$)'
       model: 'Aquos 2'
-    - regex: 'SHV40(?:_u)?[);/ ]'
+    - regex: '(?:SHV40|SHV34)(?:_u)?(?:[);/ ]|$)'
       model: 'Aquos S'
-    - regex: '702SH[);/ ]'
+    - regex: '702SH(?:[);/ ]|$)'
       model: 'Aquos S Basic'
-    - regex: 'SHV3[83][);/ ]'
+    - regex: 'SHV3[183](?:[);/ ]|$)'
       model: 'Aquos S Mini'
-    - regex: '(?:FS8010|SH-M08|SHV43|SH-01[KL])[);/ ]'
+    - regex: '(?:FS8010|SH-M08|SHV43(?:-u)?|SH-01[KL])(?:[);/ ]|$)'
       model: 'Aquos S2'
-    - regex: 'SHV46[);/ ]'
+    - regex: '(?:SHV46|SH-R?M11|901SH)(?:[);/ ]|$)'
       model: 'Aquos S3 Plus'
-    - regex: '(?:SHV44|808SH|SH-04L|SH-03G)[);/ ]'
+    - regex: '(?:SHV44|808SH|SH-04L|SH-03G)(?:[);/ ]|$)'
       model: 'Aquos R3'
-    - regex: '(?:FS8032|SH-02M|SHV45)[);/ ]'
+    - regex: '(?:FS8032|SH-02M|SHV45(?:-U)?)(?:[);/ ]|$)'
       model: 'Aquos S3'
-    - regex: 'FS8018[);/ ]'
+    - regex: 'FS8018(?:[);/ ]|$)'
       model: 'Aquos S3 Mini'
-    - regex: '901SH[);/ ]'
-      model: 'Aquos S3 Plus'
-    - regex: 'SH-51A[);/ ]'
+    - regex: '(?:SHV48|907SH)(?:[);/ ]|$)'
+      model: 'Aquos S3 Basic'
+    - regex: 'SH-RM12(?:[);/ ]|$)'
+      model: 'Aquos S3 Lite'
+    - regex: 'SH-51A(?:[);/ ]|$)'
       model: 'Aquos R5G'
-    - regex: 'SHV35[);/ ]'
+    - regex: 'SHV3[57](?:_u)?(?:[);/ ]|$)'
       model: 'Aquos U'
-    - regex: 'TG-L900S[);/ ]'
+    - regex: 'TG-L900S(?:[);/ ]|$)'
       model: 'Luna S'
-    - regex: '(?:FS8002|SHV47)[);/ ]'
+    - regex: '(?:FS8002|SHV47)(?:[);/ ]|$)'
       model: 'Z2'
-    - regex: 'FS8009[);/ ]'
+    - regex: 'FS8009(?:[);/ ]|$)'
       model: 'Z3'
-    - regex: 'FS8028[);/ ]'
+    - regex: 'FS8028(?:[);/ ]|$)'
       model: 'R1S'
-    - regex: 'SHV36[);/ ]'
+    - regex: 'SHV36(?:[);/ ]|$)'
       model: 'Basio 2'
+    - regex: 'SW001SH(?:[);/ ]|$)'
+      model: 'Star Wars'
 
     # explicit tablet models
-    - regex: 'SH-08E[);/ ]'
+    - regex: 'SH-08E(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Sharp Aquos Pad'
 
@@ -12422,7 +12732,7 @@ Sharp:
       model: '$1'
     - regex: '(?:SHARP|SBM)([a-z0-9]+)'
       model: '$1'
-    - regex: '(SH-?[0-9]+[a-z]?)[);/ ]'
+    - regex: '(SH-?[0-9]+[a-z]?)(?:[);/ ]|$)'
       model: '$1'
 
 # Softbank
@@ -12439,31 +12749,31 @@ Softbank:
 
 # Sonim
 Sonim:
-  regex: 'Sonim[ -]|XP[67]700[);/ ]'
+  regex: 'Sonim[ -]|XP[67]700(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Sonim-XP3400'
       model: 'XP3400'
       device: 'feature phone'
-    - regex: 'XP6700[);/ ]'
+    - regex: 'XP6700(?:[);/ ]|$)'
       model: 'XP6700'
-    - regex: 'XP7700[);/ ]'
+    - regex: 'XP7700(?:[);/ ]|$)'
       model: 'XP7700'
 
 # Star
 Star:
-  regex: 'N(9[5678]00|8800|9000|9977)[);/ ]'
+  regex: 'N(9[5678]00|8800|9000|9977)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'N9000'
       model: 'Note 3'
 
-    - regex: 'N(9[5678]00|8800|9977)[);/ ]'
+    - regex: 'N(9[5678]00|8800|9977)(?:[);/ ]|$)'
       model: 'N$1'
 
 # Kindle
 Amazon:
-  regex: 'KF(?:OT|ONWI|TT|JWI|JWA|[DFS]OWI|A[PRSU]WI|T[BH]WI|SAW[IA]|GIWI|KAWI|MAWI|MEWI|MUWI|SUWI)[);/ ]|Kindle|Silk/\d+\.\d+|Amazon (?:Tate|Jem)|AFT[ABMNRST]|SD4930UR|AEO(BC|KN)[);/ ]'
+  regex: 'KF(?:OT|ONWI|TT|JWI|JWA|[DFS]OWI|A[PRSU]WI|T[BH]WI|SAW[IA]|GIWI|KAWI|MAWI|MEWI|MUWI|SUWI)(?:[);/ ]|$)|Kindle|Silk/\d+\.\d+|Amazon (?:Tate|Jem)|AFT[ABMNRST]|SD4930UR|AEO(BC|KN)(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'AFTA'
@@ -12481,51 +12791,51 @@ Amazon:
     - regex: 'AFT[MST]'
       model: 'Fire TV stick'
       device: 'tv'
-    - regex: 'KFFOWI[);/ ]'
+    - regex: 'KFFOWI(?:[);/ ]|$)'
       model: 'Fire 7"'
-    - regex: 'KFMUWI[);/ ]'
+    - regex: 'KFMUWI(?:[);/ ]|$)'
       model: 'Fire 7" (2019)'
-    - regex: 'KFTT[);/ ]'
+    - regex: 'KFTT(?:[);/ ]|$)'
       model: 'Kindle Fire HD'
-    - regex: 'KFJWI[);/ ]|Amazon Jem'
+    - regex: 'KFJWI(?:[);/ ]|$)|Amazon Jem'
       model: 'Kindle Fire HD 8.9" WiFi'
-    - regex: 'KFJWA[);/ ]'
+    - regex: 'KFJWA(?:[);/ ]|$)'
       model: 'Kindle Fire HD 8.9" 4G'
-    - regex: 'KFSOWI[);/ ]|Amazon Tate'
+    - regex: 'KFSOWI(?:[);/ ]|$)|Amazon Tate'
       model: 'Kindle Fire HD 7" WiFi'
-    - regex: 'KFTHWI[);/ ]'
+    - regex: 'KFTHWI(?:[);/ ]|$)'
       model: 'Kindle Fire HDX 7" WiFi'
-    - regex: 'KFTHWA[);/ ]'
+    - regex: 'KFTHWA(?:[);/ ]|$)'
       model: 'Kindle Fire HDX 7" 4G'
-    - regex: 'KFAPWI[);/ ]'
+    - regex: 'KFAPWI(?:[);/ ]|$)'
       model: 'Kindle Fire HDX 8.9" WiFi'
-    - regex: 'KFAPWA[);/ ]'
+    - regex: 'KFAPWA(?:[);/ ]|$)'
       model: 'Kindle Fire HDX 8.9" 4G'
-    - regex: 'KFARWI[);/ ]'
+    - regex: 'KFARWI(?:[);/ ]|$)'
       model: 'Fire HD 6'
-    - regex: 'KFASWI[);/ ]'
+    - regex: 'KFASWI(?:[);/ ]|$)'
       model: 'Fire HD 7'
-    - regex: 'KFAUWI[);/ ]'
+    - regex: 'KFAUWI(?:[);/ ]|$)'
       model: 'Fire HD 7 (2017)'
-    - regex: 'KFMEWI[);/ ]'
+    - regex: 'KFMEWI(?:[);/ ]|$)'
       model: 'Fire HD 8 (2015)'
-    - regex: 'KFGIWI[);/ ]'
+    - regex: 'KFGIWI(?:[);/ ]|$)'
       model: 'Fire HD 8 (2016)'
-    - regex: 'KFDOWI[);/ ]'
+    - regex: 'KFDOWI(?:[);/ ]|$)'
       model: 'Fire HD 8 (2017)'
-    - regex: 'KFKAWI[);/ ]'
+    - regex: 'KFKAWI(?:[);/ ]|$)'
       model: 'Fire HD 8 (2018)'
-    - regex: 'KFONWI[);/ ]'
+    - regex: 'KFONWI(?:[);/ ]|$)'
       model: 'Fire HD 8 (2020)'
-    - regex: 'KFSAWI[);/ ]'
+    - regex: 'KFSAWI(?:[);/ ]|$)'
       model: 'Fire HDX 8.9'
-    - regex: 'KFSAWA[);/ ]'
+    - regex: 'KFSAWA(?:[);/ ]|$)'
       model: 'Fire HDX 8.9 4G'
-    - regex: 'KFTBWI[);/ ]'
+    - regex: 'KFTBWI(?:[);/ ]|$)'
       model: 'Fire HD 10'
-    - regex: 'KFSUWI[);/ ]'
+    - regex: 'KFSUWI(?:[);/ ]|$)'
       model: 'Fire HD 10 (2017)'
-    - regex: 'KFMAWI[);/ ]'
+    - regex: 'KFMAWI(?:[);/ ]|$)'
       model: 'Fire HD 10 (2019)'
     - regex: 'SD4930UR'
       model: 'Fire Phone'
@@ -12537,7 +12847,7 @@ Amazon:
     - regex: 'Kindle'
       model: 'Kindle'
 
-    - regex: 'AEO(BC|KN)[);/ ]'
+    - regex: 'AEO(BC|KN)(?:[);/ ]|$)'
       model: 'Echo'
       device: 'smart speaker'
 
@@ -12555,7 +12865,7 @@ Symphony:
 
 # Syrox
 Syrox:
-  regex: '(SYX-(?:T70[04]|T10[12]))[;)/ ]'
+  regex: '(SYX-(?:T70[04]|T10[12]))(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
@@ -12573,14 +12883,14 @@ Q-Touch:
 
 # T-Mobile
 T-Mobile:
-  regex: 'T-Mobile[ _][a-z0-9 ]+|REVVLRY|REVVL 2( PLUS)?[);/ ]'
+  regex: 'T-Mobile[ _][a-z0-9 ]+|REVVLRY|REVVL 2( PLUS)?(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'REVVL 2 PLUS'
       model: 'REVVL 2 Plus'
     - regex: 'REVVLRY'
       model: 'REVVL Plus'
-    - regex: 'REVVL 2[);/ ]'
+    - regex: 'REVVL 2(?:[);/ ]|$)'
       model: 'REVVL 2'
     - regex: 'T-Mobile[ _]([a-z0-9_ ]+) Build'
       model: '$1'
@@ -12597,33 +12907,33 @@ T-Mobile:
 
 # Tcl
 TCL:
-  regex: 'TCL[_ -][a-z0-9]+|(?:TCL[_ -][^;/]+ Build)|(?:TCLGalaG60(?:\(9108A\))?|A502DL|T780H|5199I|7040N|5133A|5159[AJ]|5152D)[);/ ]'
+  regex: 'TCL[_ -][a-z0-9]+|(?:TCL[_ -][^;/]+ Build)|(?:TCLGalaG60(?:\(9108A\))?|A502DL|T780H|5199I|7040N|5133A|5159[AJ]|5152D)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'TCLGalaG60(?:\(9108A\))?[);/ ]'
+    - regex: 'TCLGalaG60(?:\(9108A\))?(?:[);/ ]|$)'
       model: 'Gala G60'
-    - regex: '5199I[);/ ]'
+    - regex: '5199I(?:[);/ ]|$)'
       model: 'C9'
-    - regex: '5152D[);/ ]'
+    - regex: '5152D(?:[);/ ]|$)'
       model: 'C5'
-    - regex: '5133A[);/ ]'
+    - regex: '5133A(?:[);/ ]|$)'
       model: 'L5'
-    - regex: 'T780H[);/ ]'
+    - regex: 'T780H(?:[);/ ]|$)'
       model: 'Plex'
     - regex: 'TCL[_ -]([^;/]+) Build'
       model: '$1'
     - regex: 'TCL[_ -]([a-z0-9]+)'
       model: '$1'
-    - regex: '(7040N)[);/ ]'
+    - regex: '(7040N)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'A502DL[);/ ]'
+    - regex: 'A502DL(?:[);/ ]|$)'
       model: 'LX'
-    - regex: '5159[AJ][);/ ]'
+    - regex: '5159[AJ](?:[);/ ]|$)'
       model: 'L9'
 
 # Teclast
 Teclast:
-  regex: 'Teclast|X98 Air III|X98 Air II\(HG5N\)|Tbook|X80 Power\(B2N4\)|T30_(ROW|EEA)|T10\(E3C6\)|P10S\(N4H5\)|98\(M1E[45789]\)|98\(M3E3\)'
+  regex: 'Teclast|X98 Air III|X98 Air II\(HG5N\)|Tbook|X80 Power\(B2N4\)|(?:T30|P80X|P20HD)_(?:ROW|EEA)|T10\(E3C6\)|P10S\(N4H5\)|98\(M1E[45789]\)|98\(M3E3\)'
   device: 'tablet'
   models:
     - regex: 'Tbook[_ -]([^;/]+) Build'
@@ -12632,15 +12942,19 @@ Teclast:
       model: 'T10'
     - regex: 'T30_(ROW|EEA)'
       model: 'T30 $1'
+    - regex: 'P80X_(ROW|EEA)'
+      model: 'P80X $1'
     - regex: 'P10S\(N4H5\)'
       model: 'P10S'
+    - regex: 'P20HD_(?:ROW|EEA)'
+      model: 'P20HD'
     - regex: '98\(M1E[45789]\)|98\(M3E3\)'
       model: 'TPad 98 10.1" 4G'
-    - regex: 'X80 Power\(B2N4\)[);/ ]'
+    - regex: 'X80 Power\(B2N4\)(?:[);/ ]|$)'
       model: 'X98 Power'
-    - regex: 'X98 Air III[);/ ]'
+    - regex: 'X98 Air III(?:[);/ ]|$)'
       model: 'X98 Air III'
-    - regex: 'X98 Air II\(HG5N\)[);/ ]'
+    - regex: 'X98 Air II\(HG5N\)(?:[);/ ]|$)'
       model: 'X98 Air II'
     - regex: 'Teclast[_ -]([^;/]+) Build'
       model: '$1'
@@ -12656,25 +12970,25 @@ Tecno Mobile:
       model: 'Phantom 6'
     - regex: 'TECNO-W3'
       model: 'W3'
-    - regex: 'TECNO[ _]F4 Pro[);/ ]'
+    - regex: 'TECNO[ _]F4 Pro(?:[);/ ]|$)'
       model: 'F4 Pro'
-    - regex: 'TECNO[ _]ID6[);/ ]'
+    - regex: 'TECNO[ _]ID6(?:[);/ ]|$)'
       model: 'Camon iClick 2'
-    - regex: 'Tecno[ _]7C[);/ ]'
+    - regex: 'Tecno[ _]7C(?:[);/ ]|$)'
       model: 'DroidPad 7C'
       device: 'tablet'
-    - regex: 'DP7C Pro-SGA1[);/ ]'
+    - regex: 'DP7C Pro-SGA1(?:[);/ ]|$)'
       model: 'DroidPad 7C Pro'
       device: 'tablet'
-    - regex: 'TECNO[ _]DP10A Pro[);/ ]'
+    - regex: 'TECNO[ _]DP10A Pro(?:[);/ ]|$)'
       model: 'DroidPad 10A Pro'
       device: 'tablet'
-    - regex: 'TECNO[ _]P904[);/ ]'
+    - regex: 'TECNO[ _]P904(?:[);/ ]|$)'
       model: 'DroidPad 10D 4G'
       device: 'tablet'
     - regex: 'Tecno[ _]CB7[j]?'
       model: 'Camon i4'
-    - regex: 'Tecno[ _]DP8D[);/ ]'
+    - regex: 'Tecno[ _]DP8D(?:[);/ ]|$)'
       model: 'DroidPad 8D'
       device: 'tablet'
     - regex: 'Tecno[ _]LB8'
@@ -12701,12 +13015,12 @@ TechPad:
 
 # Tesco
 Tesco:
-  regex: 'Hudl ([^/;]+) Build|W032i-C3[);/ ]'
+  regex: 'Hudl ([^/;]+) Build|W032i-C3(?:[);/ ]|$)'
   device: 'tablet'
   models:
     - regex: 'Hudl ([^/;]+) Build'
       model: 'Hudl $1'
-    - regex: 'W032i-C3[);/ ]'
+    - regex: 'W032i-C3(?:[);/ ]|$)'
       model: 'Op3n Dott'
 
 # teXet
@@ -12869,12 +13183,14 @@ Telit:
 
 # ThL
 ThL:
-  regex: 'ThL[ _-]'
+  regex: 'ThL[ _-]|Knight 2'
   device: 'smartphone'
   models:
+    - regex: 'Knight 2'
+      model: 'Knight 2'
     - regex: 'ThL[ _-]*([^;/]+) Build'
       model: '$1'
-    - regex: 'ThL[ _-]*([^ ;/)]+)[ ;/)]'
+    - regex: 'ThL[ _-]*([^ ;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Tianyu
@@ -12908,9 +13224,9 @@ Tooky:
   regex: 'TOOKY'
   device: 'smartphone'
   models:
-    - regex: 'TOOKY (A19|W1|T8[368]|T1982)[);/ ]'
+    - regex: 'TOOKY (A19|W1|T8[368]|T1982)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'TOOKY A9PLUS[);/ ]'
+    - regex: 'TOOKY A9PLUS(?:[);/ ]|$)'
       model: 'A9 Plus'
 
 # Tolino
@@ -13043,12 +13359,12 @@ Uhappy:
       model: 'U580'
     - regex: 'Uhappy[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'Uhappy[ _-]?([^;/)]+)[);/ ]'
+    - regex: 'Uhappy[ _-]?([^;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Unimax (UMX)
 Unimax:
-  regex: 'U((?:67[013]|680)C|(?:452|504)TL|683CL|693CL)[);/ ]'
+  regex: 'U((?:67[013]|680)C|(?:452|504)TL|683CL|693CL)(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'U$1'
 
@@ -13067,7 +13383,7 @@ UTStarcom:
 
 # Ulefone
 Ulefone:
-  regex: 'Ulefone|Gemini Pro|Power_[356]|S10_Pro|(?:Armor(?:(?:[ _])(?:[2367]|X[236]|6S|X))?|U00[78][ _]Pro|Be[ _]X|Be[ _]Touch(?:[ _][23])?|Be[ _](?:One|Pure)(?:[ _]Lite)?)[);\ ]'
+  regex: 'Ulefone|Gemini Pro|Power_[356]|S10_Pro|(?:Armor(?:(?:[ _])(?:[2367]|X[236]|6[SE]|X))?|U00[78][ _]Pro|Be[ _]X|Be[ _]Touch(?:[ _][23])?|Be[ _](?:One|Pure)(?:[ _]Lite)?)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'S10_Pro'
@@ -13088,35 +13404,37 @@ Ulefone:
       model: 'U007 Pro'
     - regex: 'U008 Pro'
       model: 'U008 Pro'
-    - regex: 'Armor[ _]2[);\ ]'
+    - regex: 'Armor[ _]2(?:[);/ ]|$)'
       model: 'Armor 2'
-    - regex: 'Armor[ _]3[);\ ]'
+    - regex: 'Armor[ _]3(?:[);/ ]|$)'
       model: 'Armor 3'
-    - regex: 'Armor[ _]7[);\ ]'
+    - regex: 'Armor[ _]7(?:[);/ ]|$)'
       model: 'Armor 7'
-    - regex: 'Armor[ _]X([236])[);\ ]'
+    - regex: 'Armor[ _]X([236])(?:[);/ ]|$)'
       model: 'Armor X$1'
-    - regex: 'Armor[ _]6S[);\ ]'
+    - regex: 'Armor[ _]6S(?:[);/ ]|$)'
       model: 'Armor 6S'
-    - regex: 'Armor[ _]6[);\ ]'
+    - regex: 'Armor[ _]6E(?:[);/ ]|$)'
+      model: 'Armor 6E'
+    - regex: 'Armor[ _]6(?:[);/ ]|$)'
       model: 'Armor 6'
-    - regex: 'Armor[ _]X5[);\ ]'
+    - regex: 'Armor[ _]X5(?:[);/ ]|$)'
       model: 'Armor X5'
-    - regex: 'Armor[ _]5S[);\ ]'
+    - regex: 'Armor[ _]5S(?:[);/ ]|$)'
       model: 'Armor 5S'
-    - regex: 'Armor[ _]X[);\ ]'
+    - regex: 'Armor[ _]X(?:[);/ ]|$)'
       model: 'Armor X'
-    - regex: 'Armor[);\ ]'
+    - regex: 'Armor(?:[);/ ]|$)'
       model: 'Armor'
-    - regex: 'Gemini Pro[);\ ]'
+    - regex: 'Gemini Pro(?:[);/ ]|$)'
       model: 'Gemini Pro'
     - regex: 'Power_([356])'
       model: 'Power $1'
-    - regex: 'Ulefone[_ ](X|S1[ _]Pro|S[17])[);\ ]'
+    - regex: 'Ulefone[_ ](X|S1[ _]Pro|S[17])(?:[);/ ]|$)'
       model: '$1'
     - regex: 'Ulefone[ _-]?([^;/]+) Build'
       model: '$1'
-    - regex: 'Ulefone[ _-]?([^;/)]+)[;/)]'
+    - regex: 'Ulefone[ _-]?([^;/)]+)(?:[;/)]|$)'
       model: '$1'
 
 # UMIDIGI
@@ -13147,7 +13465,7 @@ Uniscope:
 
 # Unnecto
 Unnecto:
-  regex: 'Unnecto|(?:U513|U5151|U61[1356]|U7[12]0|U-830|U90[35])[);/ ]'
+  regex: 'Unnecto|(?:U513|U5151|U61[1356]|U7[12]0|U-830|U90[35])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'U513'
@@ -13180,7 +13498,7 @@ Unonu:
   models:
     - regex: 'Unonu[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'Unonu[ _-]?([^;/)]+)[);/ ]'
+    - regex: 'Unonu[ _-]?([^;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
 # UTOK
@@ -13191,19 +13509,19 @@ UTOK:
 
 # Vastking
 Vastking:
-  regex: '(M910A|M783K|M783K-16G|M1072R-3G)[);/ ]'
+  regex: '(M910A|M783K|M783K-16G|M1072R-3G)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # ViewSonic
 ViewSonic:
-  regex: 'ViewSonic|VSD[0-9]+[);/ ]|ViewPad|ViewPhone'
+  regex: 'ViewSonic|VSD[0-9]+(?:[);/ ]|$)|ViewPad|ViewPhone'
   device: 'smart display'
   models:
-    - regex: '(?:ViewSonic-)?V500[);/ ]'
+    - regex: '(?:ViewSonic-)?V500(?:[);/ ]|$)'
       model: 'V500'
       device: 'smartphone'
-    - regex: 'ViewSonic A8\+[);/ ]'
+    - regex: 'ViewSonic A8\+(?:[);/ ]|$)'
       model: 'A8 Plus'
       device: 'smartphone'
     - regex: '(?:ViewSonic-)?ViewPhone ?([^;/]+) Build'
@@ -13212,7 +13530,7 @@ ViewSonic:
     - regex: '(?:ViewSonic-)?ViewPad ?([^;/]+) Build'
       model: 'ViewPad $1'
       device: 'tablet'
-    - regex: '(VSD[0-9]+)[);/ ]'
+    - regex: '(VSD[0-9]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Vitelcom
@@ -13263,13 +13581,13 @@ Vernee:
 
 # Vertu
 Vertu:
-  regex: 'Vertu[ ]?([a-z0-9]+)|(?:ASTER P|CONSTELLATION X)[/;) ]'
+  regex: 'Vertu[ ]?([a-z0-9]+)|(?:ASTER P|CONSTELLATION X)(?:[);/ ]|$)'
   device: 'feature phone'
   models:
-    - regex: 'ASTER P[/;) ]'
+    - regex: 'ASTER P(?:[);/ ]|$)'
       device: 'smartphone'
       model: 'Aster P'
-    - regex: 'CONSTELLATION X[/;) ]'
+    - regex: 'CONSTELLATION X(?:[);/ ]|$)'
       device: 'smartphone'
       model: 'Constellation X'
     - regex: 'Vertu[ ]?([a-z0-9]+)'
@@ -13277,7 +13595,7 @@ Vertu:
 
 # Venso mobile
 Venso:
-  regex: '(CX-508|CX-551|Reiv 500|Creon F5)[/;) ]'
+  regex: '(CX-508|CX-551|Reiv 500|Creon F5)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
@@ -13357,15 +13675,15 @@ Videocon:
   models:
     - regex: 'Videocon[_ \-]([a-z0-9]+)'
       model: '$1'
-    - regex: 'VT75C[/;) ]'
+    - regex: 'VT75C(?:[);/ ]|$)'
       model: 'VT75C'
       device: 'tablet'
-    - regex: 'V502430[/;) ]'
+    - regex: 'V502430(?:[);/ ]|$)'
       model: 'Kryton 3'
 
 # Vodafone
 Vodafone:
-  regex: '(?<!FBCR/)Vodafone[ _-]|Smart ?Tab ?(?:III? ?)?(?:|4G|7|10)[);/ -]|VodafoneSmartChat|VFD[ _][0-9]+[;/) ]|VFD320|VF6[89]5|VF-(696|1397|795|895N|1497)'
+  regex: '(?<!FBCR/)Vodafone[ _-]|Smart ?Tab ?(?:III? ?)?(?:|4G|7|10)[);/ -]|VodafoneSmartChat|VFD[ _][0-9]+(?:[);/ ]|$)|VFD320|VF6[89]5|VF-(696|1397|795|895N|1497)'
   device: 'smartphone'
   models:
     - regex: 'VFD 100'
@@ -13398,15 +13716,15 @@ Vodafone:
       model: 'Smart N9'
     - regex: 'VFD 900'
       model: 'Smart Platinum 7'
-    - regex: 'Vodafone[ _]875[);/ ]'
+    - regex: 'Vodafone[ _]875(?:[);/ ]|$)'
       model: 'Smart Mini' # Alcatel
-    - regex: 'Vodafone[ _]975N?[);/ ]'
+    - regex: 'Vodafone[ _]975N?(?:[);/ ]|$)'
       model: 'Smart 3' # Alcatel
-    - regex: 'Vodafone[ _]785[);/ ]'
+    - regex: 'Vodafone[ _]785(?:[);/ ]|$)'
       model: 'Smart 4 Mini'
-    - regex: 'Vodafone[ _]890N[);/ ]'
+    - regex: 'Vodafone[ _]890N(?:[);/ ]|$)'
       model: 'Smart 4 Turbo' # Coolpad 3601U
-    - regex: 'Vodafone[ _]985N[);/ ]'
+    - regex: 'Vodafone[ _]985N(?:[);/ ]|$)'
       model: 'Smart 4 Power'
     - regex: 'VodafoneSmartChat'
       model: 'Smart Chat'
@@ -13461,7 +13779,7 @@ Vodafone:
       model: 'Smart Tab III 10' # Lenovo
       device: 'tablet'
 
-    - regex: 'VFD[ _]([0-9]+)[;/) ]'
+    - regex: 'VFD[ _]([0-9]+)(?:[);/ ]|$)'
       model: 'VFD $1'
     - regex: 'Vodafone[ _-]([^;/]+) Build'
       model: '$1'
@@ -13542,14 +13860,14 @@ Vorago:
 
 # Voto
 Voto:
-  regex: 'VOTO[ _\-]|VT8[89]8[;/) ]'
+  regex: 'VOTO[ _\-]|VT8[89]8(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'VOTO[ _\-]?([^/;]+) Build'
       model: '$1'
     - regex: 'VOTO[ _\-]?([^);/ ]+)'
       model: '$1'
-    - regex: '(VT8[89]8)[;/) ]'
+    - regex: '(VT8[89]8)(?:[);/ ]|$)'
       model: '$1'
 
 # Voxtel
@@ -13593,25 +13911,25 @@ WellcoM:
 
 # Wexler
 Wexler:
-  regex: 'Wexler|ULTIMA 7 TWIST PLUS|TAB[ _]10Q[);/ ]|ZEN[ _](?:4\.5|4\.7|5)'
+  regex: 'Wexler|ULTIMA 7 TWIST PLUS|TAB[ _]10Q(?:[);/ ]|$)|ZEN[ _](?:4\.5|4\.7|5)'
   device: 'tablet'
   models:
-    - regex: '(?:Wexler[ _\-\.])?ZEN[ _]4\.5[);/ ]'
+    - regex: '(?:Wexler[ _\-\.])?ZEN[ _]4\.5(?:[);/ ]|$)'
       model: 'ZEN 4.5'
       device: 'smartphone'
-    - regex: '(?:Wexler[ _\-\.])?ZEN[ _]4\.7[);/ ]'
+    - regex: '(?:Wexler[ _\-\.])?ZEN[ _]4\.7(?:[);/ ]|$)'
       model: 'ZEN 4.7'
       device: 'smartphone'
-    - regex: '(?:Wexler[ _\-\.])?ZEN[ _]5[);/ ]'
+    - regex: '(?:Wexler[ _\-\.])?ZEN[ _]5(?:[);/ ]|$)'
       model: 'ZEN 5'
       device: 'smartphone'
-    - regex: '(?:Wexler[ _\-\.])?TAB[ _]10Q[);/ ]'
+    - regex: '(?:Wexler[ _\-\.])?TAB[ _]10Q(?:[);/ ]|$)'
       model: 'TAB 10Q'
     - regex: 'Wexler[ _\-\.]([^;/]+) Build'
       model: '$1'
-    - regex: 'Wexler[ _\-\.]([^);/]+)[);/]'
+    - regex: 'Wexler[ _\-\.]([^);/]+)(?:[);/]|$)'
       model: '$1'
-    - regex: '(ULTIMA 7 TWIST PLUS)[);/ ]'
+    - regex: '(ULTIMA 7 TWIST PLUS)(?:[);/ ]|$)'
       model: '$1'
 
 # Wiko
@@ -13683,7 +14001,7 @@ Wiko:
       model: 'Kite'
     - regex: 'W_K400'
       model: 'Lenny 5'
-    - regex: 'U307AS[;/) ]'
+    - regex: 'U307AS(?:[);/ ]|$)'
       model: 'Life 2'
     - regex: '(?:WIKO-)?Lenny[ -_]?3 Max'
       model: 'Lenny 3 Max'
@@ -13767,7 +14085,7 @@ Wiko:
       model: 'View 3'
     - regex: 'W-P611-EEA'
       model: 'View 3 Pro'
-    - regex: 'W-U300[;/) ]'
+    - regex: 'W-U300(?:[);/ ]|$)'
       model: 'Ride'
     - regex: 'Wiko ([^/;]+) Build'
       model: '$1'
@@ -13776,7 +14094,7 @@ Wiko:
 
 # Wieppo
 Wieppo:
-  regex: 'Wieppo (S6 Lite|S[658])[;/) ]'
+  regex: 'Wieppo (S6 Lite|S[658])(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
@@ -13798,7 +14116,7 @@ Weimei:
 
 # Wileyfox
 Wileyfox:
-  regex: '(?:Wileyfox [^/]+)|Swift 2[;/) ]'
+  regex: '(?:Wileyfox [^/]+)|Swift 2(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Wileyfox Spark \+'
@@ -13809,9 +14127,9 @@ Wileyfox:
       model: '$1'
     - regex: 'Wileyfox ([^/)]+)(?: Build|\))'
       model: '$1'
-    - regex: 'Swift 2 (X|Plus)[;/) ]'
+    - regex: 'Swift 2 (X|Plus)(?:[);/ ]|$)'
       model: 'Swift 2 $1'
-    - regex: 'Swift 2[;/) ]'
+    - regex: 'Swift 2(?:[);/ ]|$)'
       model: 'Swift 2'
 
 # Wolder
@@ -13831,7 +14149,7 @@ Wolder:
 
 # Wolfgang
 Wolfgang:
-  regex: 'AT[ _-]AS([0-9A-Z]+)[);/ ]'
+  regex: 'AT[ _-]AS([0-9A-Z]+)(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'AT-AS$1'
 
@@ -13863,19 +14181,21 @@ X-View:
     - regex: 'ZEN_U5+'
       model: 'ZEN U5+'
 
-# POCO
+# POCO (sub brand Xiaomi)
 POCO:
-  regex: 'POCO[ _](?:X2|F2 PRO)[);/ ]'
+  regex: '(?:POCO[ _](?:X2|F2 PRO)|M2007J20CG)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'POCO X2[);/ ]'
+    - regex: 'POCO X2(?:[);/ ]|$)'
       model: 'X2'
-    - regex: 'POCO F2 PRO[);/ ]'
+    - regex: 'M2007J20CG(?:[);/ ]|$)'
+      model: 'X3 NFC'
+    - regex: 'POCO F2 PRO(?:[);/ ]|$)'
       model: 'F2 Pro'
 
 # Xiaomi
 Xiaomi:
-  regex: 'Xiaomi(?!/(?:Miui|Mint[ ])Browser)|Mi9 Pro 5G|(?:MI [a-z0-9]+|Mi-4c|MI-One[ _]?[a-z0-9]+|MIX(?: 2S?)?)[);/ ]|HM (?:[^/;]+) (?:Build|MIUI)|(?:2014501|2014011|201481[12378]|201302[23]|2013061) Build|Redmi|MI_NOTE_Pro|POCOPHONE|(?:SHARK )?(KLE|MBU)-A0|SKR-[AH]0|SKW-[AH]0|POCO F1|DLT-[AH]0|MIBOX[234]([_ ]PRO)?|MiTV4[CSX]?|MiTV-(MSSP1|AXSO0)|AWM-A0|MI CC 9 Meitu Edition|MiBOX1S|MiTV4A|M2006C3LG|M2002J9E|HM2014819|WT88047|M2004J(?:7[AB]|19)C|M2003J15SC|HM NOTE 1(?:LTE|W)|MI[_ ]PLAY'
+  regex: 'Xiaomi(?!/(?:Miui|Mint[ ])Browser)|Mi9 Pro 5G|(?:MI [a-z0-9]+|Mi-4c|MI-One[ _]?[a-z0-9]+|MIX(?: 2S?)?)(?:[);/ ]|$)|HM (?:[^/;]+) (?:Build|MIUI)|(?:2014501|2014011|201481[12378]|201302[23]|2013061) Build|Redmi|MI_NOTE_Pro|POCOPHONE|(?:SHARK )?(KLE|MBU)-A0|SKR-[AH]0|SKW-[AH]0|POCO F1|DLT-[AH]0|MIBOX[234]([_ ]PRO)?|MiTV4[CSX]?|MiTV-(MSSP1|AXSO0)|AWM-A0|MI CC 9 Meitu Edition|MiBOX1S|MiTV4A|M2006C3(?:L[GC]|MN?G)|M2007J1SC|M2002J9[EG]|HM2014819|WT88047|M2004J(?:7[AB]|19)C|M2003J15SC|HM NOTE 1(?:LTE|W)|MI[_ ]PLAY|XIG01'
   device: 'smartphone'
   models:
     # specific smartphone models
@@ -13903,101 +14223,107 @@ Xiaomi:
       model: 'Hongmi 2'
     - regex: 'Xiaomi_201481[123]|201481[123] Build'
       model: 'Hongmi 2 4G'
-    - regex: 'MI[_ ]PLAY[);/ ]'
+    - regex: 'MI[_ ]PLAY(?:[);/ ]|$)'
       model: 'MI Play'
-    - regex: 'Mi 9 SE[);/ ]'
+    - regex: 'Mi 9 SE(?:[);/ ]|$)'
       model: 'MI 9 SE'
-    - regex: 'MI CC 9 Meitu Edition[);/ ]'
+    - regex: 'MI CC 9 Meitu Edition(?:[);/ ]|$)'
       model: 'MI CC 9'
-    - regex: 'Xiaomi_M2001J2E_TD-LTE[);/ ]'
+    - regex: 'Xiaomi_M2001J2E_TD-LTE(?:[);/ ]|$)'
       model: 'MI 10'
-    - regex: 'M2002J9E[);/ ]'
+    - regex: 'M2007J1SC(?:[);/ ]|$)'
+      model: 'MI 10 Ultra 5G'
+    - regex: '(?:M2002J9[EG]|XIG01)(?:[);/ ]|$)'
       model: 'MI 10 Lite 5G'
-    - regex: 'Mi 9T Pro[);/ ]'
+    - regex: 'Mi 9T Pro(?:[);/ ]|$)'
       model: 'MI 9T Pro'
-    - regex: 'Mi9 Pro 5G[);/ ]'
+    - regex: 'Mi9 Pro 5G(?:[);/ ]|$)'
       model: 'MI 9 Pro 5G'
-    - regex: 'MI 8 Lite[);/ ]'
+    - regex: 'MI 8 Lite(?:[);/ ]|$)'
       model: 'MI 8 Lite'
-    - regex: 'MI 5s Plus[);/ ]'
+    - regex: 'MI 5s Plus(?:[);/ ]|$)'
       model: 'MI 5s Plus'
     - regex: 'Xiaomi_2013061|2013061 Build'
       model: 'MI 3'
-    - regex: 'Mi-4c[);/ ]'
+    - regex: 'Mi-4c(?:[);/ ]|$)'
       model: 'MI 4C'
-    - regex: 'MI MAX 3[);/ ]'
+    - regex: 'MI MAX 3(?:[);/ ]|$)'
       model: 'MI MAX 3'
-    - regex: 'MI MAX 2[);/ ]'
+    - regex: 'MI MAX 2(?:[);/ ]|$)'
       model: 'MI MAX 2'
-    - regex: 'Mi A2 Lite[);/ ]'
+    - regex: 'Mi A2 Lite(?:[);/ ]|$)'
       model: 'MI A2 Lite'
-    - regex: 'MIX 3[);/ ]'
+    - regex: 'MIX 3(?:[);/ ]|$)'
       model: 'MI MIX 3'
-    - regex: 'MIX 2S[);/ ]'
+    - regex: 'MIX 2S(?:[);/ ]|$)'
       model: 'MI MIX 2S'
-    - regex: 'MIX 2[);/ ]'
+    - regex: 'MIX 2(?:[);/ ]|$)'
       model: 'MI MIX 2'
-    - regex: 'MIX[);/ ]'
+    - regex: 'MIX(?:[);/ ]|$)'
       model: 'MI MIX'
     - regex: 'POCOPHONE[ _]F1|POCO F1'
       model: 'Pocophone F1'
     - regex: 'Redmi 5 Plus'
       model: 'Redmi 5 Plus'
-    - regex: 'WT88047[);/ ]'
+    - regex: 'WT88047(?:[);/ ]|$)'
       model: 'Redmi 2'
-    - regex: 'HM2014819[);/ ]'
+    - regex: 'HM2014819(?:[);/ ]|$)'
       model: 'Redmi 2 Pro'
-    - regex: 'HM 2A[);/ ]'
+    - regex: 'HM 2A(?:[);/ ]|$)'
       model: 'Redmi 2A'
-    - regex: 'HM 1S[CW]?[);/ ]'
+    - regex: 'HM 1S[CW]?(?:[);/ ]|$)'
       model: 'Redmi 1S'
-    - regex: 'HM 1[);/ ]'
+    - regex: 'HM 1(?:[);/ ]|$)'
       model: 'Redmi 1'
-    - regex: 'M2004J7AC[);/ ]'
+    - regex: 'M2004J7AC(?:[);/ ]|$)'
       model: 'Redmi 10X'
-    - regex: 'M2004J19C[);/ ]'
+    - regex: 'M2004J19C(?:[);/ ]|$)'
       model: 'Redmi 9'
-    - regex: 'M2006C3LG[);/ ]'
+    - regex: 'M2006C3L[GC](?:[);/ ]|$)'
       model: 'Redmi 9A'
-    - regex: 'M2004J7BC[);/ ]'
+    - regex: 'M2006C3MG(?:[);/ ]|$)'
+      model: 'Redmi 9C'
+    - regex: 'M2006C3MNG(?:[);/ ]|$)'
+      model: 'Redmi 9C NFC'
+    - regex: 'M2004J7BC(?:[);/ ]|$)'
       model: 'Redmi 10X Pro'
-    - regex: 'Redmi K20 Pro[);/ ]'
+    - regex: 'Redmi K20 Pro(?:[);/ ]|$)'
       model: 'Redmi K20 Pro'
 
-    - regex: 'MI PAD 4 PLUS[);/ ]'
+    - regex: 'MI PAD 4 PLUS(?:[);/ ]|$)'
       model: 'Mi Pad 4 Plus'
       device: 'tablet'
-    - regex: 'MI PAD 4[);/ ]'
+    - regex: 'MI PAD 4(?:[);/ ]|$)'
       model: 'Mi Pad 4'
       device: 'tablet'
-    - regex: 'MI PAD 3[);/ ]'
+    - regex: 'MI PAD 3(?:[);/ ]|$)'
       model: 'Mi Pad 3'
       device: 'tablet'
-    - regex: 'MI PAD 2[);/ ]'
+    - regex: 'MI PAD 2(?:[);/ ]|$)'
       model: 'Mi Pad 2'
       device: 'tablet'
-    - regex: 'MI PAD[);/ ]'
+    - regex: 'MI PAD(?:[);/ ]|$)'
       model: 'Mi Pad'
       device: 'tablet'
-    - regex: 'MIBOX3[ _]Pro[);/ ]'
+    - regex: 'MIBOX3[ _]Pro(?:[);/ ]|$)'
       model: 'Mi Box 3 Pro'
       device: 'tv'
-    - regex: 'MIBOX([234])[);/ ]'
+    - regex: 'MIBOX([234])(?:[);/ ]|$)'
       model: 'Mi Box $1'
       device: 'tv'
-    - regex: 'MiBOX1S[);/ ]'
+    - regex: 'MiBOX1S(?:[);/ ]|$)'
       model: 'Mi Box 1S'
       device: 'tv'
-    - regex: 'MiTV-MSSP1[);/ ]'
+    - regex: 'MiTV-MSSP1(?:[);/ ]|$)'
       model: 'MiTV 4S'
       device: 'tv'
-    - regex: '(?:MiTV-AXSO0|MiTV4(?:A|-ANSM0))[);/ ]'
+    - regex: '(?:MiTV-AXSO0|MiTV4(?:A|-ANSM0))(?:[);/ ]|$)'
       model: 'MiTV 4A'
       device: 'tv'
-    - regex: '(MiTV)(4[CSX]|4)[);/ ]'
+    - regex: '(MiTV)(4[CSX]|4)(?:[);/ ]|$)'
       model: '$1 $2'
       device: 'tv'
-    - regex: 'HM NOTE 1W[);/ ]'
+    - regex: 'HM NOTE 1W(?:[);/ ]|$)'
       device: 'phablet'
       model: 'Redmi Note'
     - regex: 'HM NOTE 1TD (?:Build|MIUI)'
@@ -14015,13 +14341,13 @@ Xiaomi:
     - regex: 'Redmi Note 5A Prime'
       model: 'Redmi Note 5A Prime'
       device: 'phablet'
-    - regex: 'M2003J15SC[);/ ]'
+    - regex: 'M2003J15SC(?:[);/ ]|$)'
       model: 'Redmi Note 9'
       device: 'phablet'
-    - regex: 'Redmi Note 7 Pro[);/ ]'
+    - regex: 'Redmi Note 7 Pro(?:[);/ ]|$)'
       model: 'Redmi Note 7 Pro'
       device: 'phablet'
-    - regex: 'Redmi Note 8 Pro[);/ ]'
+    - regex: 'Redmi Note 8 Pro(?:[);/ ]|$)'
       model: 'Redmi Note 8 Pro'
       device: 'phablet'
 
@@ -14038,7 +14364,7 @@ Xiaomi:
       device: 'phablet'
     - regex: '(MI(?:-One)?[ _](?:[^;/]*))Build'
       model: '$1'
-    - regex: '(MI [a-z0-9]+|MI-One[ _]?[a-z0-9]+)[);/ ]'
+    - regex: '(MI [a-z0-9]+|MI-One[ _]?[a-z0-9]+)(?:[);/ ]|$)'
       model: '$1'
     - regex: 'HM Note ([^/;]+) (?:Build|MIUI)'
       device: 'phablet'
@@ -14058,12 +14384,12 @@ Xion:
 
 # Xolo
 Xolo:
-  regex: 'Xolo|(?:Q600|Q700s?|Q800|Q1000s|Q1000[ _]Opus|Q1010i|Q2000|Omega[ _]5.[05])[);/ ]|BLACK-1XM'
+  regex: 'Xolo|(?:Q600|Q700s?|Q800|Q1000s|Q1000[ _]Opus|Q1010i|Q2000|Omega[ _]5.[05])(?:[);/ ]|$)|BLACK-1XM'
   device: 'smartphone'
   models:
     - regex: 'BLACK-1XM'
       model: 'Black 1X'
-    - regex: '(Q600 Club|Q600|Q700s?|Q800|Q1000s Plus|Q1000s|Q1000[ _]Opus|Q1010i|Q2000|Omega[ _]5.[05])[);/ ]'
+    - regex: '(Q600 Club|Q600|Q700s?|Q800|Q1000s Plus|Q1000s|Q1000[ _]Opus|Q1010i|Q2000|Omega[ _]5.[05])(?:[);/ ]|$)'
       model: '$1'
     - regex: 'Xolo[ _]?([^;/]+) Build'
       model: '$1'
@@ -14171,27 +14497,27 @@ Yezz:
 
 # Yu
 Yu:
-  regex: '(?:YU5[05]10[A]?|YU4711|AO5510|YU5050|YU5014)[);/ ]'
+  regex: '(?:YU5[05]10[A]?|YU4711|AO5510|YU5050|YU5014)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'YU5010[A]?[);/ ]'
+    - regex: 'YU5010[A]?(?:[);/ ]|$)'
       model: 'Yuphoria'
-    - regex: 'YU5050[);/ ]'
+    - regex: 'YU5050(?:[);/ ]|$)'
       model: 'Yutopia'
-    - regex: 'AO5510[);/ ]'
+    - regex: 'AO5510(?:[);/ ]|$)'
       model: 'Yureka'
-    - regex: 'YU5510[A]?[);/ ]'
+    - regex: 'YU5510[A]?(?:[);/ ]|$)'
       model: 'Yureka Plus'
-    - regex: 'YU4711[);/ ]'
+    - regex: 'YU4711(?:[);/ ]|$)'
       model: 'Yunique'
-    - regex: 'YU4711[);/ ]'
+    - regex: 'YU4711(?:[);/ ]|$)'
       model: 'Yunique'
-    - regex: 'YU5014[);/ ]'
+    - regex: 'YU5014(?:[);/ ]|$)'
       model: 'Ace'
 
 # Yuandao
 Yuandao:
-  regex: 'N101[ _]DUAL(?:[ _]CORE)?(?:[ _]?2|\|\|)?(?:[ _]V11)?[);/ ]'
+  regex: 'N101[ _]DUAL(?:[ _]CORE)?(?:[ _]?2|\|\|)?(?:[ _]V11)?(?:[);/ ]|$)'
   device: 'tablet'
   model: 'N101'
 
@@ -14232,7 +14558,7 @@ Zonda:
 
 # ZYQ
 ZYQ:
-  regex: 'ZYQ-Q88|(Q(?:2602|262[436]|638|2688|272[89]|3022|3623|TAB Tab4|328 m9|328|668)|J77|Q[._](?:Up|Boss P99|Dee R09|Good M9|Hi|Hot|Me|Mate R99|Next|TOP-X8|You))[); ]'
+  regex: 'ZYQ-Q88|(Q(?:2602|262[436]|638|2688|272[89]|3022|3623|TAB Tab4|328 m9|328|668)|J77|Q[._](?:Up|Boss P99|Dee R09|Good M9|Hi|Hot|Me|Mate R99|Next|TOP-X8|You))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'Q638'
@@ -14355,173 +14681,175 @@ Toshiba:
     - regex: 'portalmmm/[12].0 (TS[a-z0-9 ]+)'
       model: '$1'
 
-# Vivax
+# Vivax (www.vivax.com)
 Vivax:
-  regex: 'VIVAX|(?:Fly5[_ ]Lite|Fun[_ ]S500)[;)/ ]'
+  regex: 'VIVAX|(?:Fly5[_ ]Lite|Fun[_ ]S500|Point_X2)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Fly5[_ ]Lite[;)/ ]'
+    - regex: 'Fly5[_ ]Lite(?:[);/ ]|$)'
       model: 'Fly 5 Lite'
-    - regex: 'Fun[_ ]S500[;)/ ]'
+    - regex: 'Point_X2'
+      model: 'Point X2'
+    - regex: 'Fun[_ ]S500(?:[);/ ]|$)'
       model: 'Fun S500'
-    - regex: 'VIVAX[ _]Fly3[;)/ ]'
+    - regex: 'VIVAX[ _]Fly3(?:[);/ ]|$)'
       model: 'Fly 3'
-    - regex: 'VIVAX (Point X551)[;)/ ]'
+    - regex: 'VIVAX (Point X551)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'SMART Point X5010[;)/ ]'
+    - regex: 'SMART Point X5010(?:[);/ ]|$)'
       model: 'Smart Point X5010'
 
 # MLS
 MLS:
-  regex: 'IQ(?:0705|L550|1010w?|1012N?|1019N|1025|1380|1401|1436|1452a|1453|1470|1502a|1511|1552|1553|1568|1570|1805N|1806|1808|1810B_M|1832|1850|1890|5017|9610|181011N|E[12]00|EL41|G550|GW516|L30|L5[01]|M801|M1001|N700|P50|R300|S300|S1001|W503|W511T|W553N?|W60[38]|W626|M960|D700|9013_4N)[;)/ ]'
+  regex: 'IQ(?:0705|L550|1010w?|1012N?|1019N|1025|1380|1401|1436|1452a|1453|1470|1502a|1511|1552|1553|1568|1570|1805N|1806|1808|1810B_M|1832|1850|1890|5017|9610|181011N|E[12]00|EL41|G550|GW516|L30|L5[01]|M801|M1001|N700|P50|R300|S300|S1001|W503|W511T|W553N?|W60[38]|W626|M960|D700|9013_4N)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'IQ0705[;)/ ]'
+    - regex: 'IQ0705(?:[);/ ]|$)'
       model: 'iQTalk Twist'
-    - regex: 'IQL550[;)/ ]'
+    - regex: 'IQL550(?:[);/ ]|$)'
       model: 'Notch Lite'
-    - regex: 'IQ1010W?[;)/ ]'
+    - regex: 'IQ1010W?(?:[);/ ]|$)'
       model: 'iQTab 10'
       device: 'tablet'
-    - regex: 'IQ1012N?[;)/ ]'
+    - regex: 'IQ1012N?(?:[);/ ]|$)'
       model: 'iQTab Brave 3G'
       device: 'tablet'
-    - regex: 'IQ1025[;)/ ]'
+    - regex: 'IQ1025(?:[);/ ]|$)'
       model: 'iQTab Action 4G'
       device: 'tablet'
-    - regex: 'iQ9013_4N[;)/ ]'
+    - regex: 'iQ9013_4N(?:[);/ ]|$)'
       model: 'Life 10.1"'
       device: 'tablet'
-    - regex: 'IQ1019N[;)/ ]'
+    - regex: 'IQ1019N(?:[);/ ]|$)'
       model: 'Alu Plus 4G 10.1"'
       device: 'tablet'
-    - regex: 'iQ1805N[;)/ ]'
+    - regex: 'iQ1805N(?:[);/ ]|$)'
       model: 'iQTab Ideal 8.0"'
       device: 'tablet'
-    - regex: 'iQ181011N[;)/ ]'
+    - regex: 'iQ181011N(?:[);/ ]|$)'
       model: 'iQTab Care 8.0"'
       device: 'tablet'
-    - regex: 'IQ1380[;)/ ]'
+    - regex: 'IQ1380(?:[);/ ]|$)'
       model: 'Brain 3G'
-    - regex: 'IQ1401[;)/ ]'
+    - regex: 'IQ1401(?:[);/ ]|$)'
       model: 'iQTalk Verse 4G'
-    - regex: 'IQ1436[;)/ ]'
+    - regex: 'IQ1436(?:[);/ ]|$)'
       model: 'Color mini 4G'
-    - regex: 'IQ1452a[;)/ ]'
+    - regex: 'IQ1452a(?:[);/ ]|$)'
       model: 'TOP-S 4G'
-    - regex: 'IQ1453[;)/ ]'
+    - regex: 'IQ1453(?:[);/ ]|$)'
       model: 'Trend 4G'
-    - regex: 'IQ1470[;)/ ]'
+    - regex: 'IQ1470(?:[);/ ]|$)'
       model: 'iQTalk Onyx'
-    - regex: 'IQ1502a[;)/ ]'
+    - regex: 'IQ1502a(?:[);/ ]|$)'
       model: 'iQTalk Flame'
-    - regex: 'IQ1511[;)/ ]'
+    - regex: 'IQ1511(?:[);/ ]|$)'
       model: 'iQTalk Spicy'
-    - regex: 'IQ1552[;)/ ]'
+    - regex: 'IQ1552(?:[);/ ]|$)'
       model: 'iQTalk Titan 4G'
-    - regex: 'IQ1553[;)/ ]'
+    - regex: 'IQ1553(?:[);/ ]|$)'
       model: 'Color 3 4G'
-    - regex: 'IQ1568[;)/ ]'
+    - regex: 'IQ1568(?:[);/ ]|$)'
       model: 'Range 4G'
-    - regex: 'IQ1570[;)/ ]'
+    - regex: 'IQ1570(?:[);/ ]|$)'
       model: 'iQTalk Color 5.5 4G'
-    - regex: 'IQ1806[;)/ ]'
+    - regex: 'IQ1806(?:[);/ ]|$)'
       model: 'iQTab Rose'
       device: 'tablet'
-    - regex: 'IQ1808[;)/ ]'
+    - regex: 'IQ1808(?:[);/ ]|$)'
       model: 'iQTab Master'
       device: 'tablet'
-    - regex: 'IQ1810B_M[;)/ ]'
+    - regex: 'IQ1810B_M(?:[);/ ]|$)'
       model: 'iQTab Novel 3G'
       device: 'tablet'
-    - regex: 'IQ1832[;)/ ]'
+    - regex: 'IQ1832(?:[);/ ]|$)'
       model: 'Jet 3G'
       device: 'tablet'
-    - regex: 'IQ1850[;)/ ]'
+    - regex: 'IQ1850(?:[);/ ]|$)'
       model: 'Diamond 5.2 4G'
-    - regex: 'IQ1890[;)/ ]'
+    - regex: 'IQ1890(?:[);/ ]|$)'
       model: 'iQTalk Aura'
-    - regex: 'IQ5017[;)/ ]'
+    - regex: 'IQ5017(?:[);/ ]|$)'
       model: 'Slice 4G'
-    - regex: 'IQ9610[;)/ ]'
+    - regex: 'IQ9610(?:[);/ ]|$)'
       model: 'Angel 3G'
       device: 'tablet'
-    - regex: 'iQM960[;)/ ]'
+    - regex: 'iQM960(?:[);/ ]|$)'
       model: 'Angel 3G (2018)'
       device: 'tablet'
-    - regex: 'IQG550[;)/ ]'
+    - regex: 'IQG550(?:[);/ ]|$)'
       model: 'Style 4G'
-    - regex: 'IQGW516[;)/ ]'
+    - regex: 'IQGW516(?:[);/ ]|$)'
       model: 'F5'
-    - regex: 'IQE100[;)/ ]'
+    - regex: 'IQE100(?:[);/ ]|$)'
       model: 'Energy 4G'
-    - regex: 'iQE200[;)/ ]'
+    - regex: 'iQE200(?:[);/ ]|$)'
       model: 'MX 4G'
-    - regex: 'IQEL41[;)/ ]'
+    - regex: 'IQEL41(?:[);/ ]|$)'
       model: 'Fab 4G'
-    - regex: 'IQL30[;)/ ]'
+    - regex: 'IQL30(?:[);/ ]|$)'
       model: 'Status 4G'
-    - regex: 'IQL50[;)/ ]'
+    - regex: 'IQL50(?:[);/ ]|$)'
       model: 'More 4G'
-    - regex: 'IQL51[;)/ ]'
+    - regex: 'IQL51(?:[);/ ]|$)'
       model: 'Wave 4G'
-    - regex: 'IQM801[;)/ ]'
+    - regex: 'IQM801(?:[);/ ]|$)'
       model: 'Brace 2018 4G'
       device: 'tablet'
-    - regex: 'IQM1001[;)/ ]'
+    - regex: 'IQM1001(?:[);/ ]|$)'
       model: 'Level 4G'
       device: 'tablet'
-    - regex: 'IQN700[;)/ ]'
+    - regex: 'IQN700(?:[);/ ]|$)'
       model: 'Inspire 4G'
-    - regex: 'IQP50[;)/ ]'
+    - regex: 'IQP50(?:[);/ ]|$)'
       model: 'Ruby 4G'
-    - regex: 'IQS300[;)/ ]'
+    - regex: 'IQS300(?:[);/ ]|$)'
       model: 'DX 4G'
-    - regex: 'IQS1001[;)/ ]'
+    - regex: 'IQS1001(?:[);/ ]|$)'
       model: 'Vista 4G' ## Gold
       device: 'tablet'
-    - regex: 'IQR300[;)/ ]'
+    - regex: 'IQR300(?:[);/ ]|$)'
       model: 'R3 4G'
-    - regex: 'IQW608[;)/ ]'
+    - regex: 'IQW608(?:[);/ ]|$)'
       model: 'Regal'
-    - regex: 'iQW603[;)/ ]'
+    - regex: 'iQW603(?:[);/ ]|$)'
       model: 'Phab 6.0"'
       device: 'phablet'
-    - regex: 'IQW626[;)/ ]'
+    - regex: 'IQW626(?:[);/ ]|$)'
       model: 'D6 4G'
-    - regex: 'IQW511T[;)/ ]'
+    - regex: 'IQW511T(?:[);/ ]|$)'
       model: 'Liberal'
-    - regex: 'IQW553N?[;)/ ]'
+    - regex: 'IQW553N?(?:[);/ ]|$)'
       model: 'Alu 5.5"'
-    - regex: 'IQW503[;)/ ]'
+    - regex: 'IQW503(?:[);/ ]|$)'
       model: 'Flame 4G (2018)'
-    - regex: 'iQD700[;)/ ]'
+    - regex: 'iQD700(?:[);/ ]|$)'
       model: 'Color Fingerprint 4G'
 
 # Fly
 Fly:
-  regex: 'Fly(?!Flow|touch)|Power Plus 5000|Photo Pro|Slimline|Life (?:Ace|Jet|Sky|Compact 4G)|FS50[1-9]|FS51[0-8]|FS52[0-9]|FS530|FS55[134]|FS40[1-9]|FS45[1-9]|4FS06|MERIDIAN-|(?:IQ(?!10[134]0)[0-9]{3,}[i]?)[ _]?(?:Quad|Firebird|Quattro|Turbo|Magic)?[;)/ ]'
+  regex: 'Fly(?!Flow|touch)|Power Plus 5000|Photo Pro|Slimline|Life (?:Ace|Jet|Sky|Compact 4G)|FS50[1-9]|FS51[0-8]|FS52[0-9]|FS530|FS55[134]|FS40[1-9]|FS45[1-9]|4FS06|MERIDIAN-|(?:IQ(?!10[134]0)[0-9]{3,}[i]?)[ _]?(?:Quad|Firebird|Quattro|Turbo|Magic)?(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(?:Fly_)?IQ310[;)/ ]'
+    - regex: '(?:Fly_)?IQ310(?:[);/ ]|$)'
       model: 'Panorama'
       device: 'tablet'
 
-    - regex: '(?:Fly_)?IQ236[;)/ ]'
+    - regex: '(?:Fly_)?IQ236(?:[);/ ]|$)'
       model: 'Victory'
-    - regex: 'Slimline[;)/ ]'
+    - regex: 'Slimline(?:[);/ ]|$)'
       model: 'Slimline'
-    - regex: 'Power Plus 5000[;)/ ]'
+    - regex: 'Power Plus 5000(?:[);/ ]|$)'
       model: 'Power Plus 5000'
-    - regex: 'Photo Pro[;)/ ]'
+    - regex: 'Photo Pro(?:[);/ ]|$)'
       model: 'Photo Pro'
-    - regex: 'Life Ace[;)/ ]'
+    - regex: 'Life Ace(?:[);/ ]|$)'
       model: 'Life Ace'
-    - regex: 'Life Jet[;)/ ]'
+    - regex: 'Life Jet(?:[);/ ]|$)'
       model: 'Life Jet'
-    - regex: 'Life Sky[;)/ ]'
+    - regex: 'Life Sky(?:[);/ ]|$)'
       model: 'Life Sky'
-    - regex: 'Life Compact 4G[;)/ ]'
+    - regex: 'Life Compact 4G(?:[);/ ]|$)'
       model: 'Life Compact 4G'
     - regex: 'FS506'
       model: 'Cirrus 3'
@@ -14613,93 +14941,93 @@ Fly:
       model: 'Nimbus 16'
     - regex: 'FS458'
       model: 'Stratus 7'
-    - regex: '(?:Fly_)?IQ237[;)/ ]'
+    - regex: '(?:Fly_)?IQ237(?:[);/ ]|$)'
       model: 'Dynamic'
-    - regex: '(?:Fly_)?IQ238[;)/ ]'
+    - regex: '(?:Fly_)?IQ238(?:[);/ ]|$)'
       model: 'Jazz'
-    - regex: '(?:Fly_)?IQ240[;)/ ]'
+    - regex: '(?:Fly_)?IQ240(?:[);/ ]|$)'
       model: 'Whizz'
-    - regex: '(?:Fly_)?IQ255[;)/ ]'
+    - regex: '(?:Fly_)?IQ255(?:[);/ ]|$)'
       model: 'Pride'
-    - regex: '(?:Fly_)?IQ270(?: Firebird)?[;)/ ]'
+    - regex: '(?:Fly_)?IQ270(?: Firebird)?(?:[);/ ]|$)'
       model: 'Firebird'
-    - regex: '(?:Fly_)?IQ275[;)/ ]'
+    - regex: '(?:Fly_)?IQ275(?:[);/ ]|$)'
       model: 'Marathon'
-    - regex: '(?:Fly_)?IQ285(?: Turbo)?[;)/ ]'
+    - regex: '(?:Fly_)?IQ285(?: Turbo)?(?:[);/ ]|$)'
       model: 'Turbo'
-    - regex: '(?:Fly_)?IQ430[;)/ ]'
+    - regex: '(?:Fly_)?IQ430(?:[);/ ]|$)'
       model: 'Evoke'
-    - regex: '(?:Fly_)?IQ431[;)/ ]'
+    - regex: '(?:Fly_)?IQ431(?:[);/ ]|$)'
       model: 'Glory'
-    - regex: '(?:Fly_)?IQ432[;)/ ]'
+    - regex: '(?:Fly_)?IQ432(?:[);/ ]|$)'
       model: 'Era Nano 1'
-    - regex: '(?:Fly_)?IQ436[;)/ ]'
+    - regex: '(?:Fly_)?IQ436(?:[);/ ]|$)'
       model: 'Era Nano 3'
-    - regex: '(?:Fly_)?IQ4490[;)/ ]'
+    - regex: '(?:Fly_)?IQ4490(?:[);/ ]|$)'
       model: 'Era Nano 4'
-    - regex: '(?:Fly_)?IQ434[;)/ ]'
+    - regex: '(?:Fly_)?IQ434(?:[);/ ]|$)'
       model: 'Era Nano 5'
-    - regex: '(?:Fly_)?IQ4406[;)/ ]'
+    - regex: '(?:Fly_)?IQ4406(?:[);/ ]|$)'
       model: 'Era Nano 6'
-    - regex: '(?:Fly_)?IQ436i[;)/ ]'
+    - regex: '(?:Fly_)?IQ436i(?:[);/ ]|$)'
       model: 'Era Nano 9'
-    - regex: '(?:Fly_)?IQ440[;)/ ]'
+    - regex: '(?:Fly_)?IQ440(?:[);/ ]|$)'
       model: 'Energy'
-    - regex: '(?:Fly_)?IQ4401[;)/ ]'
+    - regex: '(?:Fly_)?IQ4401(?:[);/ ]|$)'
       model: 'Era Energy 2'
-    - regex: '(?:Fly_)?IQ441[;)/ ]'
+    - regex: '(?:Fly_)?IQ441(?:[);/ ]|$)'
       model: 'Radiance'
-    - regex: '(?:Fly_)?IQ442 Quad[;)/ ]'
+    - regex: '(?:Fly_)?IQ442 Quad(?:[);/ ]|$)'
       model: 'Miracle 2'
-    - regex: '(?:Fly_)?IQ442[;)/ ]'
+    - regex: '(?:Fly_)?IQ442(?:[);/ ]|$)'
       model: 'Miracle'
-    - regex: '(?:Fly_)?IQ443[;)/ ]'
+    - regex: '(?:Fly_)?IQ443(?:[);/ ]|$)'
       model: 'Trend'
-    - regex: '(?:Fly_)?IQ444(?: Quattro)?[;)/ ]'
+    - regex: '(?:Fly_)?IQ444(?: Quattro)?(?:[);/ ]|$)'
       model: 'Diamond 2'
-    - regex: '(?:Fly_)?IQ445[;)/ ]'
+    - regex: '(?:Fly_)?IQ445(?:[);/ ]|$)'
       model: 'Genius'
-    - regex: '(?:Fly_)?IQ446(?: Magic)?[;)/ ]'
+    - regex: '(?:Fly_)?IQ446(?: Magic)?(?:[);/ ]|$)'
       model: 'Magic'
-    - regex: '(?:Fly_)?IQ447[;)/ ]'
+    - regex: '(?:Fly_)?IQ447(?:[);/ ]|$)'
       model: 'Era Life 1'
-    - regex: '(?:Fly_)?IQ456[;)/ ]'
+    - regex: '(?:Fly_)?IQ456(?:[);/ ]|$)'
       model: 'Era Life 2'
-    - regex: '(?:Fly_)?IQ4409 Quad[;)/ ]'
+    - regex: '(?:Fly_)?IQ4409 Quad(?:[);/ ]|$)'
       model: 'Era Life 4'
-    - regex: '(?:Fly_)?IQ448[;)/ ]'
+    - regex: '(?:Fly_)?IQ448(?:[);/ ]|$)'
       model: 'Chic'
-    - regex: '(?:Fly_)?IQ449[;)/ ]'
+    - regex: '(?:Fly_)?IQ449(?:[);/ ]|$)'
       model: 'Pronto'
-    - regex: '(?:Fly_)?IQ450[;)/ ]'
+    - regex: '(?:Fly_)?IQ450(?:[);/ ]|$)'
       model: 'Horizon'
-    - regex: '(?:Fly_)?IQ450[ _]Quattro[;)/ ]'
+    - regex: '(?:Fly_)?IQ450[ _]Quattro(?:[);/ ]|$)'
       model: 'Horizon 2'
-    - regex: '(?:Fly_)?IQ451[;)/ ]'
+    - regex: '(?:Fly_)?IQ451(?:[);/ ]|$)'
       model: 'Vista'
-    - regex: '(?:Fly_)?IQ452 Quad[;)/ ]'
+    - regex: '(?:Fly_)?IQ452 Quad(?:[);/ ]|$)'
       model: 'Ego Vision 1'
-    - regex: '(?:Fly_)?IQ454[;)/ ]'
+    - regex: '(?:Fly_)?IQ454(?:[);/ ]|$)'
       model: 'Evo Tech 1'
-    - regex: '(?:Fly_)?IQ4403[;)/ ]'
+    - regex: '(?:Fly_)?IQ4403(?:[);/ ]|$)'
       model: 'Energy 3'
-    - regex: '(?:Fly_)?IQ4404[;)/ ]'
+    - regex: '(?:Fly_)?IQ4404(?:[);/ ]|$)'
       model: 'Spark'
-    - regex: '(?:Fly_)?IQ4410 Quad[;)/ ]'
+    - regex: '(?:Fly_)?IQ4410 Quad(?:[);/ ]|$)'
       model: 'Phoenix'
-    - regex: '(?:Fly_)?IQ4411[;)/ ]'
+    - regex: '(?:Fly_)?IQ4411(?:[);/ ]|$)'
       model: 'Energy 2'
-    - regex: '(?:Fly_)?IQ4412 Quad[;)/ ]'
+    - regex: '(?:Fly_)?IQ4412 Quad(?:[);/ ]|$)'
       model: 'Coral'
-    - regex: '(?:Fly_)?IQ4413[ _]Quad[;)/ ]'
+    - regex: '(?:Fly_)?IQ4413[ _]Quad(?:[);/ ]|$)'
       model: 'Evo Chic 3'
-    - regex: '(?:Fly_)?IQ4414 Quad[;)/ ]'
+    - regex: '(?:Fly_)?IQ4414 Quad(?:[);/ ]|$)'
       model: 'Evo Tech 3'
-    - regex: '(?:Fly_)?IQ4415 Quad[;)/ ]'
+    - regex: '(?:Fly_)?IQ4415 Quad(?:[);/ ]|$)'
       model: 'Era Style 3'
-    - regex: '(?:Fly_)?IQ4504 Quad[;)/ ]'
+    - regex: '(?:Fly_)?IQ4504 Quad(?:[);/ ]|$)'
       model: 'Evo Energy 5'
-    - regex: '(?:Fly_)?IQ([0-9]+[i]? ?(?:Quad|Firebird|Quattro)?)[;)/ ]'
+    - regex: '(?:Fly_)?IQ([0-9]+[i]? ?(?:Quad|Firebird|Quattro)?)(?:[);/ ]|$)'
       model: 'IQ$1'
     - regex: 'Fly[ _\-]?([a-z0-9_]+)/'
       model: '$1'
@@ -14714,23 +15042,23 @@ Fly:
 
 # FinePower
 FinePower:
-  regex: 'FinePower[_ ]?([AB][1-9]|[CD][1-9])[;)/ ]'
+  regex: 'FinePower[_ ]?([AB][1-9]|[CD][1-9])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'FinePower[_ ]?([AB][1-9])[;)/ ]'
+    - regex: 'FinePower[_ ]?([AB][1-9])(?:[);/ ]|$)'
       model: '$1'
       device: 'tablet'
-    - regex: 'FinePower[_ ]?([CD][1-9])[;)/ ]'
+    - regex: 'FinePower[_ ]?([CD][1-9])(?:[);/ ]|$)'
       model: '$1'
 
 # Freetel
 Freetel:
-  regex: '(?:FTJ17A00|FTJ152[ABCD]|FT141B|FT142D_LTEXM|FT142A?|FTJ161[AB]|FTJ1[56]2E|FTJ162D|FTE161[GE])[;)/ ]'
+  regex: '(?:FTJ17A00|FTJ152[ABCD]|FT141B|FT142D_LTEXM|FT142A?|FTJ161[AB]|FTJ1[56]2E|FTJ162D|FTE161[GE])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
    - regex: 'FTJ152C'
      model: 'Samurai Miyabi'
-   - regex: 'FTJ17A00[;)/ ]'
+   - regex: 'FTJ17A00(?:[);/ ]|$)'
      model: 'Rei 2 Dual'
    - regex: 'FTJ161A'
      model: 'Musashi'
@@ -14766,7 +15094,7 @@ Zeemi:
   models:
     - regex: 'ZEEMI[ _-]([^/;]+) Build'
       model: '$1'
-    - regex: 'ZEEMI[ _-]([^/;)]+)[/;)]'
+    - regex: 'ZEEMI[ _-]([^/;)]+)(?:[);/]|$)'
       model: '$1'
 
 # Zenek
@@ -14790,176 +15118,182 @@ Zopo:
   regex: 'ZOPO|(?:ZOPO[_ ])?(Flash X3|ZP[0-9]{2,}[^/;]+)(?:\)| Build)'
   device: 'smartphone'
   models:
-    - regex: '(ZOPO_C2_MOD|ZP998)[);/ ]'
+    - regex: '(ZOPO_C2_MOD|ZP998)(?:[);/ ]|$)'
       model: 'C2 II'
-    - regex: '(?:ZOPO_)?ZP980[+][);/ ]'
+    - regex: '(?:ZOPO_)?ZP980[+](?:[);/ ]|$)'
       model: 'ZP980+'
-    - regex: '(?:ZOPO_)?ZP980[);/ ]'
+    - regex: '(?:ZOPO_)?ZP980(?:[);/ ]|$)'
       model: 'Scorpio'
-    - regex: 'ZP952[);/ ]'
+    - regex: 'ZP952(?:[);/ ]|$)'
       model: 'Speed 7 Plus'
-    - regex: 'ZP951[);/ ]'
+    - regex: 'ZP951(?:[);/ ]|$)'
       model: 'Speed 7'
-    - regex: 'ZP955[);/ ]'
+    - regex: 'ZP955(?:[);/ ]|$)'
       model: 'Speed 8'
-    - regex: 'ZP950[+h]?[);/ ]'
+    - regex: 'ZP950[+h]?(?:[);/ ]|$)'
       model: 'Leader Max'
-    - regex: 'ZP(?:900H?|910)[);/ ]'
+    - regex: 'ZP(?:900H?|910)(?:[);/ ]|$)'
       model: 'Leader'
-    - regex: 'ZP(?:800H|810)[);/ ]'
+    - regex: 'ZP(?:800H|810)(?:[);/ ]|$)'
       model: 'Libero HD'
-    - regex: 'ZP500[+]?[);/ ]'
+    - regex: 'ZP500[+]?(?:[);/ ]|$)'
       model: 'Libero'
-    - regex: 'ZP330[);/ ]'
+    - regex: 'ZP330(?:[);/ ]|$)'
       model: 'Color C'
-    - regex: 'ZP370[);/ ]'
+    - regex: 'ZP370(?:[);/ ]|$)'
       model: 'Color S'
-    - regex: 'ZP5(63|86)[);/ ]'
+    - regex: 'ZP5(63|86)(?:[);/ ]|$)'
       model: 'Color X'
-    - regex: 'ZP567[);/ ]'
+    - regex: 'ZP567(?:[);/ ]|$)'
       model: 'Color C5i'
-    - regex: 'ZP300[S+]?[);/ ]'
+    - regex: 'ZP300[S+]?(?:[);/ ]|$)'
       model: 'Field'
-    - regex: 'ZP200[+]?[);/ ]'
+    - regex: 'ZP200[+]?(?:[);/ ]|$)'
       model: 'Shining'
-    - regex: 'ZP100[);/ ]'
+    - regex: 'ZP100(?:[);/ ]|$)'
       model: 'Pilot'
-    - regex: 'ZP1790[);/ ]'
+    - regex: 'ZP1790(?:[);/ ]|$)'
       model: 'Flash X2'
-    - regex: 'ZP781[);/ ]'
+    - regex: 'ZP781(?:[);/ ]|$)'
       model: 'Flash G5 Plus'
     - regex: '(Flash X3|ZP[0-9]{2,}[^/;)]+)(?: Build|\))'
       model: '$1'
 
 # ZTE
 ZTE:
-  regex: 'ZTE|AxonPhone|([a-z0-9]+)_USA_Cricket|(?:Blade (?:L110|L[2357]|L7A|S6|V[6789]|V8Q|V8 SE|V9 VITA|X7|A(310|460|465|475|520|530|602)|V580|V Ultra|Q Lux)|N9[15]8St|NX(?:403A|404H|406E|40[X2]|507J|503A|505J|506J|508J|510J|512J|511J|513J|521J|523J_V1|529J|531J|541J|5[48]9J|551J|563J|569[HJ]|573J|575J|59[157]J|60[1689]J|61[12679]J|62[79]J|659J|907J)|N818S|N951[0579]|N91[38]0|N9101|N913[267]|N952[01]|N9560|N9810|N799D|[UV]9180|[UV]9815|Z(?:233V|331|5031O|559DL|6621O|667T|768G|792|81[25]|818L|82[08]|83[12359]|85[125]|851M|(557|71[67]|798|836|861|916)BL|986DL|(232|718|828)TL|(?:233|353|558|717|799|837|862|899|917|963)VL|955A|95[678]|965|97[018]|98[1237]|986U|999|936L)|Apex2|G (LTE|Lux)|Vec|Z959|V865M|Z3001S|902ZT|KIS II Max|Kis 3|K3DX-V5G|Z930L|Optus X|Blade[ _](A510|A[35] 2019-T|A6 MAX|A0622|X9)|Nubia Z(?:9|11)|Ctyon-A9|602ZT|MO-01J|Z963U|402ZT|P545|P609|dandelion)[);/ ]'
+  regex: 'ZTE|AxonPhone|([a-z0-9]+)_USA_Cricket|(?:Blade (?:L110|L[2357]|L7A|S6|V[6789]|V8Q|V8 SE|V9 VITA|X7|A(310|460|465|475|520|530|602)|V580|V Ultra|Q Lux)|N9[15]8St|NX(?:403A|404H|406E|40[X2]|507J|503A|505J|506J|508J|510J|512J|511J|513J|521J|523J_V1|529J|531J|541J|5[48]9J|551J|563J|569[HJ]|573J|575J|59[157]J|60[1689]J|61[12679]J|62[79]J|65[19]J|907J)|N818S|N951[0579]|N91[38]0|N9101|N913[267]|N952[01]|N9560|N9810|N799D|[UV]9180|[UV]9815|Z(?:233V|331|5031O|559DL|6621O|667T|768G|792|81[25]|818L|82[08]|83[12359]|85[125]|851M|(557|71[67]|798|836|861|916)BL|986DL|(232|718|828)TL|(?:233|353|558|717|799|837|862|899|917|963)VL|955A|95[678]|965|97[018]|98[1237]|986U|999|936L)|Apex2|G (LTE|Lux)|Vec|Z959|V865M|Z3001S|902ZT|KIS II Max|Kis 3|K3DX-V5G|Z930L|Optus X|Blade[ _](A510|A[35] 2019-T|A6 MAX|A0622|X9)|Nubia Z(?:9|11)|Ctyon-A9|602ZT|MO-01[JK]|Z963U|402ZT|P545|P609|dandelion|901ZT|A001ZT|Z-01K)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     # explicit smartphone models
-    - regex: '602ZT[);/ ]'
+    - regex: '602ZT(?:[);/ ]|$)'
       model: 'Libero 2'
-    - regex: 'ZTE 2050[);/ ]'
+    - regex: 'A001ZT(?:[);/ ]|$)'
+      model: 'Libero 3'
+    - regex: '901ZT(?:[);/ ]|$)'
+      model: 'Libero S10'
+    - regex: 'ZTE 2050(?:[);/ ]|$)'
       model: 'Blade 20 Smart'
-    - regex: '902ZT[);/ ]'
+    - regex: '902ZT(?:[);/ ]|$)'
       model: 'Axon 10 Pro 5G'
-    - regex: 'N799D[);/ ]'
+    - regex: 'N799D(?:[);/ ]|$)'
       model: 'Blade Eg'
-    - regex: 'Z818L[);/ ]'
+    - regex: 'Z818L(?:[);/ ]|$)'
       model: 'Allstar'
-    - regex: 'Z3001S[);/ ]'
+    - regex: 'Z3001S(?:[);/ ]|$)'
       model: 'Quest Plus'
-    - regex: 'Ctyon-A9[);/ ]'
+    - regex: 'Ctyon-A9(?:[);/ ]|$)'
       model: 'Ctyon A9'
-    - regex: 'K3DX-V5G[);/ ]'
+    - regex: 'K3DX-V5G(?:[);/ ]|$)'
       model: 'V5G'
-    - regex: 'N918St[);/ ]'
+    - regex: 'N918St(?:[);/ ]|$)'
       model: 'V5S'
-    - regex: 'N958St[);/ ]'
+    - regex: 'N958St(?:[);/ ]|$)'
       model: 'V5 Max'
-    - regex: 'N9101[);/ ]'
+    - regex: 'N9101(?:[);/ ]|$)'
       model: 'Imperial'
-    - regex: 'Z963U[);/ ]'
+    - regex: 'Z963U(?:[);/ ]|$)'
       model: 'Imperial Max'
-    - regex: 'N9120[);/ ]'
+    - regex: 'N9120(?:[);/ ]|$)'
       model: 'Avid'
-    - regex: 'N9130[);/ ]'
+    - regex: 'N9130(?:[);/ ]|$)'
       model: 'Speed'
-    - regex: 'N9132[);/ ]'
+    - regex: 'N9132(?:[);/ ]|$)'
       model: 'Prestige'
-    - regex: 'N9136[);/ ]'
+    - regex: 'N9136(?:[);/ ]|$)'
       model: 'Prestige 2'
-    - regex: 'N9137[);/ ]'
+    - regex: 'N9137(?:[);/ ]|$)'
       model: 'Tempo X'
-    - regex: 'N9180[);/ ]'
+    - regex: 'N9180(?:[);/ ]|$)'
       model: 'V5'
-    - regex: 'N9510[);/ ]'
+    - regex: 'N9510(?:[);/ ]|$)'
       model: 'Warp 4G'
-    - regex: 'N9517[);/ ]'
+    - regex: 'N9517(?:[);/ ]|$)'
       model: 'Blade Force'
-    - regex: 'Z559DL[);/ ]'
+    - regex: 'Z559DL(?:[);/ ]|$)'
       model: 'Blade T2'
-    - regex: '402ZT[);/ ]'
+    - regex: '402ZT(?:[);/ ]|$)'
       model: 'Blade Q+'
-    - regex: 'Blade Q Lux[);/ ]'
+    - regex: 'Blade Q Lux(?:[);/ ]|$)'
       model: 'Blade Q Lux'
-    - regex: 'N9515[);/ ]'
+    - regex: 'N9515(?:[);/ ]|$)'
       model: 'Warp Sync'
-    - regex: 'N9519[);/ ]'
+    - regex: 'N9519(?:[);/ ]|$)'
       model: 'Warp 7'
-    - regex: 'N9520[);/ ]'
+    - regex: 'N9520(?:[);/ ]|$)'
       model: 'Boost Max'
-    - regex: 'N9521[);/ ]'
+    - regex: 'N9521(?:[);/ ]|$)'
       model: 'Boost Max+'
-    - regex: 'N9560[);/ ]'
+    - regex: 'N9560(?:[);/ ]|$)'
       model: 'Max XL'
-    - regex: 'N9810[);/ ]'
+    - regex: 'N9810(?:[);/ ]|$)'
       model: 'Vital'
-    - regex: 'NX40[X2][);/ ]'
+    - regex: 'NX40[X2](?:[);/ ]|$)'
       model: 'Nubia Z5 mini'
-    - regex: 'NX(403[AE]|406E|404H)[);/ ]'
+    - regex: 'NX(403[AE]|406E|404H)(?:[);/ ]|$)'
       model: 'Nubia Z5S Mini'
-    - regex: 'NX503A[);/ ]'
+    - regex: 'NX503A(?:[);/ ]|$)'
       model: 'Nubia Z5S'
-    - regex: 'NX506J[);/ ]'
+    - regex: 'NX506J(?:[);/ ]|$)'
       model: 'Nubia Z7'
-    - regex: 'NX507J[);/ ]'
+    - regex: 'NX507J(?:[);/ ]|$)'
       model: 'Nubia Z7 mini'
-    - regex: 'NX505J[);/ ]'
+    - regex: 'NX505J(?:[);/ ]|$)'
       model: 'Nubia Z7 max'
-    - regex: 'NX508J[);/ ]'
+    - regex: 'NX508J(?:[);/ ]|$)'
       model: 'Nubia Z9'
-    - regex: '(NX5[12]1J|Nubia Z9 mini)[);/ ]'
+    - regex: '(NX5[12]1J|Nubia Z9 mini)(?:[);/ ]|$)'
       model: 'Nubia Z9 mini'
-    - regex: '(NX510J|Nubia Z9 Max)[);/ ]'
+    - regex: '(NX510J|Nubia Z9 Max)(?:[);/ ]|$)'
       model: 'Nubia Z9 max'
-    - regex: 'NX512J[);/ ]'
+    - regex: 'NX512J(?:[);/ ]|$)'
       model: 'Nubia Z9 max dual'
-    - regex: 'NX531J[);/ ]'
+    - regex: 'NX531J(?:[);/ ]|$)'
       model: 'Nubia Z11'
     - regex: 'NX523J_V1'
       model: 'Nubia Z11 Max'
-    - regex: 'NX529J[);/ ]'
+    - regex: 'NX529J(?:[);/ ]|$)'
       model: 'Nubia Z11 mini'
-    - regex: '(?:NX549J|Nubia Z11 mini S)[);/ ]'
+    - regex: '(?:NX549J|Nubia Z11 mini S)(?:[);/ ]|$)'
       model: 'Nubia Z11 mini S'
-    - regex: 'NX606J[);/ ]'
+    - regex: 'NX606J(?:[);/ ]|$)'
       model: 'Nubia Z18'
-    - regex: 'NX616J[);/ ]'
+    - regex: 'NX616J(?:[);/ ]|$)'
       model: 'Nubia Z18S'
-    - regex: 'NX611J[);/ ]'
+    - regex: 'NX611J(?:[);/ ]|$)'
       model: 'Nubia Z18 mini'
-    - regex: 'NX551J[);/ ]'
+    - regex: 'NX551J(?:[);/ ]|$)'
       model: 'Nubia M2'
-    - regex: 'NX563J[);/ ]'
+    - regex: 'NX563J(?:[);/ ]|$)'
       model: 'Nubia Z17'
-    - regex: 'NX569[HJ][);/ ]'
+    - regex: 'NX569[HJ](?:[);/ ]|$)'
       model: 'Nubia Z17 Mini'
-    - regex: 'NX589J[);/ ]'
+    - regex: 'NX589J(?:[);/ ]|$)'
       model: 'Nubia Z17 Mini S'
-    - regex: 'NX591J[);/ ]'
+    - regex: 'NX591J(?:[);/ ]|$)'
       model: 'Nubia Z17 Lite'
     - regex: 'NX595J'
       model: 'Nubia Z17S'
-    - regex: 'NX612J[);/ ]'
+    - regex: 'NX612J(?:[);/ ]|$)'
       model: 'Nubia V18'
     - regex: 'NX627J'
       model: 'Nubia Z20'
-    - regex: 'NX513J[);/ ]'
+    - regex: 'NX513J(?:[);/ ]|$)'
       model: 'Nubia My Prague'
-    - regex: 'NX601J[);/ ]'
+    - regex: 'NX601J(?:[);/ ]|$)'
       model: 'Nubia X6'
-    - regex: 'NX609J[);/ ]'
+    - regex: 'NX609J(?:[);/ ]|$)'
       model: 'Nubia Red Magic'
-    - regex: 'NX659J[);/ ]'
+    - regex: 'NX659J(?:[);/ ]|$)'
       model: 'Nubia Red Magic 5G'
-    - regex: 'NX619J[);/ ]'
+    - regex: 'NX651J(?:[);/ ]|$)'
+      model: 'Nubia Play'
+    - regex: 'NX619J(?:[);/ ]|$)'
       model: 'Nubia Red Magic Mars'
-    - regex: 'NX629J[);/ ]'
+    - regex: 'NX629J(?:[);/ ]|$)'
       model: 'Nubia Red Magic 3'
     - regex: 'NX573J'
       model: 'Nubia M2 Lite'
-    - regex: 'NX907J[);/ ]'
+    - regex: 'NX907J(?:[);/ ]|$)'
       model: 'Nubia M2 Play'
     - regex: 'NX541J'
       model: 'Nubia N1'
@@ -14967,11 +15301,11 @@ ZTE:
       model: 'Nubia N1 Lite'
     - regex: 'NX575J'
       model: 'Nubia N2'
-    - regex: 'NX6(08|17)J[);/ ]'
+    - regex: 'NX6(08|17)J(?:[);/ ]|$)'
       model: 'Nubia N3'
-    - regex: '[UV]9180[);/ ]'
+    - regex: '[UV]9180(?:[);/ ]|$)'
       model: 'V5 Red Bull'
-    - regex: '[UV]9815[);/ ]'
+    - regex: '[UV]9815(?:[);/ ]|$)'
       model: 'Grand Memo LTE'
     - regex: 'V779M'
       model: 'Joey Jump 2'
@@ -14987,7 +15321,7 @@ ZTE:
       model: 'Grand X2'
     - regex: 'V970M?|V987'
       model: 'Grand X'
-    - regex: 'Z959[);/ ]'
+    - regex: 'Z959(?:[);/ ]|$)'
       model: 'Grand X3'
     - regex: 'V8000'
       model: 'Nova 4'
@@ -14999,89 +15333,89 @@ ZTE:
       model: 'Grand Era'
     - regex: 'V788D'
       model: 'Kis Plus'
-    - regex: 'Z331[);/ ]'
+    - regex: 'Z331(?:[);/ ]|$)'
       model: 'Z331'
-    - regex: 'N818S[);/ ]'
+    - regex: 'N818S(?:[);/ ]|$)'
       model: 'N818S'
-    - regex: 'Z5031O[);/ ]'
+    - regex: 'Z5031O(?:[);/ ]|$)'
       model: 'Optus X Spirit 2'
-    - regex: 'P545[);/ ]'
+    - regex: 'P545(?:[);/ ]|$)'
       model: 'Optus X Power 2'
-    - regex: 'P609[);/ ]'
+    - regex: 'P609(?:[);/ ]|$)'
       model: 'Optus X Wave'
-    - regex: 'Optus X Start[);/ ]'
+    - regex: 'Optus X Start(?:[);/ ]|$)'
       model: 'Optus X Start'
-    - regex: 'Blade (A(0620|310|452|460|462|465|475|510|512|520|530|602|612|910)|L110|V0730|V0800|V580|V1000)[);/ ]'
+    - regex: 'Blade (A(0620|310|452|460|462|465|475|510|512|520|530|602|612|910)|L110|V0730|V0800|V580|V1000)(?:[);/ ]|$)'
       model: 'Blade $1'
-    - regex: 'Blade L2 Plus[);/ ]'
+    - regex: 'Blade L2 Plus(?:[);/ ]|$)'
       model: 'Blade L2 Plus'
-    - regex: 'Blade L2[);/ ]'
+    - regex: 'Blade L2(?:[);/ ]|$)'
       model: 'Blade L2'
-    - regex: 'Blade L3 Plus[);/ ]'
+    - regex: 'Blade L3 Plus(?:[);/ ]|$)'
       model: 'Blade L3 Plus'
-    - regex: 'Blade L3 Apex[);/ ]'
+    - regex: 'Blade L3 Apex(?:[);/ ]|$)'
       model: 'Blade L3 Apex'
-    - regex: 'Blade L3[);/ ]'
+    - regex: 'Blade L3(?:[);/ ]|$)'
       model: 'Blade L3'
-    - regex: 'Blade L5 Plus[);/ ]'
+    - regex: 'Blade L5 Plus(?:[);/ ]|$)'
       model: 'Blade L5 Plus'
-    - regex: 'Blade L5[);/ ]'
+    - regex: 'Blade L5(?:[);/ ]|$)'
       model: 'Blade L5'
-    - regex: 'Blade L6[);/ ]'
+    - regex: 'Blade L6(?:[);/ ]|$)'
       model: 'Blade L6'
-    - regex: 'Blade L7A[);/ ]'
+    - regex: 'Blade L7A(?:[);/ ]|$)'
       model: 'Blade L7A'
-    - regex: 'Blade L7[);/ ]'
+    - regex: 'Blade L7(?:[);/ ]|$)'
       model: 'Blade L7'
-    - regex: 'Blade L8(?:RU)?[);/ ]'
+    - regex: 'Blade L8(?:RU)?(?:[);/ ]|$)'
       model: 'Blade L8'
-    - regex: 'Blade A3 2019-T[);/ ]'
+    - regex: 'Blade A3 2019-T(?:[);/ ]|$)'
       model: 'Blade A3 (2019)'
-    - regex: 'Blade A5 2019-T[);/ ]'
+    - regex: 'Blade A5 2019-T(?:[);/ ]|$)'
       model: 'Blade A5 (2019)'
-    - regex: 'BLADE A0622[);/ ]'
+    - regex: 'BLADE A0622(?:[);/ ]|$)'
       model: 'Blade A6'
-    - regex: 'BLADE A6 MAX[);/ ]'
+    - regex: 'BLADE A6 MAX(?:[);/ ]|$)'
       model: 'Blade A6 Max'
-    - regex: 'Blade S6 Plus[);/ ]'
+    - regex: 'Blade S6 Plus(?:[);/ ]|$)'
       model: 'Blade S6 Plus'
-    - regex: 'Blade S6[);/ ]'
+    - regex: 'Blade S6(?:[);/ ]|$)'
       model: 'Blade S6'
-    - regex: 'T920[);/ ]'
+    - regex: 'T920(?:[);/ ]|$)'
       model: 'Blade S7'
-    - regex: 'BLADE V Ultra[);/ ]'
+    - regex: 'BLADE V Ultra(?:[);/ ]|$)'
       model: 'Blade V Ultra'
-    - regex: 'Blade V6 MAX[);/ ]'
+    - regex: 'Blade V6 MAX(?:[);/ ]|$)'
       model: 'Blade V6 Max'
-    - regex: 'Blade V6 Plus[);/ ]'
+    - regex: 'Blade V6 Plus(?:[);/ ]|$)'
       model: 'Blade V6 Plus'
-    - regex: 'Blade V6[);/ ]'
+    - regex: 'Blade V6(?:[);/ ]|$)'
       model: 'Blade V6'
-    - regex: 'Blade (?:V7 Lite|V0720)[);/ ]'
+    - regex: 'Blade (?:V7 Lite|V0720)(?:[);/ ]|$)'
       model: 'Blade V7 Lite'
-    - regex: 'Blade V7[);/ ]'
+    - regex: 'Blade V7(?:[);/ ]|$)'
       model: 'Blade V7'
-    - regex: 'Blade X7[);/ ]'
+    - regex: 'Blade X7(?:[);/ ]|$)'
       model: 'Blade X7'
-    - regex: 'Blade X9[);/ ]'
+    - regex: 'Blade X9(?:[);/ ]|$)'
       model: 'Blade X9'
-    - regex: 'Blade V8Q[);/ ]'
+    - regex: 'Blade V8Q(?:[);/ ]|$)'
       model: 'Blade V8Q'
-    - regex: 'Blade V8 SE[);/ ]'
+    - regex: 'Blade V8 SE(?:[);/ ]|$)'
       model: 'Blade V8 SE'
-    - regex: 'Blade V9 Vita[);/ ]'
+    - regex: 'Blade V9 Vita(?:[);/ ]|$)'
       model: 'Blade V9 Vita'
-    - regex: 'Blade V9[);/ ]'
+    - regex: 'Blade V9(?:[);/ ]|$)'
       model: 'Blade V9'
-    - regex: 'Blade V10 Vita[);/ ]'
+    - regex: 'Blade V10 Vita(?:[);/ ]|$)'
       model: 'Blade V10 Vita'
-    - regex: 'BLADE V0820[);/ ]'
+    - regex: 'BLADE V0820(?:[);/ ]|$)'
       model: 'Blade V8 Lite'
-    - regex: 'BLADE V0850[);/ ]'
+    - regex: 'BLADE V0850(?:[);/ ]|$)'
       model: 'Blade V8 Mini'
     - regex: '(?:Blade[ _])?(Apex2|G (LTE|Lux)|Vec|A510)'
       model: 'Blade $1'
-    - regex: 'Z768G[);/ ]'
+    - regex: 'Z768G(?:[);/ ]|$)'
       model: 'Midnight'
     - regex: 'Z820'
       model: 'Obsidian'
@@ -15103,9 +15437,9 @@ ZTE:
       model: 'Blade Z Max'
     - regex: 'Z983'
       model: 'Blade X Max'
-    - regex: 'Z717[BV]L[);/ ]'
+    - regex: 'Z717[BV]L(?:[);/ ]|$)'
       model: 'Citrine LTE'
-    - regex: 'Z233VL[);/ ]'
+    - regex: 'Z233VL(?:[);/ ]|$)'
       model: 'Cymbal-C LTE'
     - regex: 'Z233V'
       model: 'Cymbal LTE'
@@ -15119,7 +15453,7 @@ ZTE:
       model: 'Kis II Max'
     - regex: 'Kis 3'
       model: 'Kis 3'
-    - regex: '(?:Z798BL|Z799VL)[);/ ]'
+    - regex: '(?:Z798BL|Z799VL)(?:[);/ ]|$)'
       model: 'Majesty Pro LTE'
     - regex: 'Z899VL'
       model: 'Majesty Pro Plus LTE'
@@ -15137,7 +15471,7 @@ ZTE:
       model: 'Sonata 3'
     - regex: 'Z835'
       model: 'Maven 3'
-    - regex: 'Z851[);/ ]'
+    - regex: 'Z851(?:[);/ ]|$)'
       model: 'Prelude Plus'
     - regex: 'Z851M'
       model: 'Overture 3'
@@ -15149,21 +15483,21 @@ ZTE:
       model: 'Avid 4'
     - regex: 'Z833'
       model: 'Avid TRIO'
-    - regex: '(?:Z836BL|Z837VL)[);/ ]'
+    - regex: '(?:Z836BL|Z837VL)(?:[);/ ]|$)'
       model: 'ZFive 2 LTE'
     - regex: 'Z558VL'
       model: 'ZFive C LTE'
     - regex: 'Z557BL'
       model: 'ZFive G LTE'
-    - regex: '(?:Z861BL|Z862VL)[);/ ]'
+    - regex: '(?:Z861BL|Z862VL)(?:[);/ ]|$)'
       model: 'ZFive L LTE'
     - regex: 'Z916BL'
       model: 'ZMax Grand LTE'
     - regex: 'Z917VL'
       model: 'ZMax Champ LTE'
-    - regex: '(?:Z958|Z955A)[);/ ]'
+    - regex: '(?:Z958|Z955A)(?:[);/ ]|$)'
       model: 'ZMax 2'
-    - regex: 'dandelion[);/ ]'
+    - regex: 'dandelion(?:[);/ ]|$)'
       model: 'ZMax 3'
     - regex: 'Z963VL'
       model: 'Max Duo LTE'
@@ -15173,7 +15507,7 @@ ZTE:
       model: 'MAX Blue LTE'
     - regex: 'Z992'
       model: 'Avail 2'
-    - regex: 'Z999'
+    - regex: '(?:Z999|Z-01K)(?:[);/ ]|$)'
       model: 'Axon M'
     - regex: 'B2016'
       model: 'Axon Mini'
@@ -15181,11 +15515,13 @@ ZTE:
       model: 'Axon Tianji'
     - regex: 'A2017[GU]?'
       model: 'Axon 7'
+    - regex: 'A2018'
+      model: 'Axon 7s'
     - regex: 'A2019G Pro'
       model: 'Axon Pro'
     - regex: 'B2017G'
       model: 'Axon 7 Mini'
-    - regex: 'A2020G? Pro[);/ ]'
+    - regex: 'A2020G? Pro(?:[);/ ]|$)'
       model: 'Axon 10 Pro'
     - regex: 'Z667T'
       model: 'Zinger'
@@ -15201,20 +15537,20 @@ ZTE:
       model: 'Rio'
     - regex: 'F-450'
       model: 'Adamant'
-    - regex: 'Z936L[);/ ]'
+    - regex: 'Z936L(?:[);/ ]|$)'
       model: 'Lever'
-    - regex: 'MO-01J[);/ ]'
+    - regex: 'MO-01[JK](?:[);/ ]|$)'
       model: 'Mono'
-    - regex: 'V865M[);/ ]'
+    - regex: 'V865M(?:[);/ ]|$)'
       model: 'V865M'
-    - regex: 'Z6621O[);/ ]'
+    - regex: 'Z6621O(?:[);/ ]|$)'
       model: 'Optus X Vista'
 
     - regex: 'AxonPhone ([^;/]+) Build'
       model: 'AxonPhone $1'
     - regex: '([a-z0-9]+)_USA_Cricket'
       model: '$1'
-    - regex: 'ZTE[\- ](V98|V96A|V81|V70)[);/ ]'
+    - regex: 'ZTE[\- ](V98|V96A|V81|V70)(?:[);/ ]|$)'
       model: '$1'
       device: 'tablet'
     - regex: 'ZTE[\- ]([a-z0-9\-_ ]+) Build'
@@ -15240,7 +15576,7 @@ Zuum:
       model: 'Stellar Z'
     - regex: 'Zuum[ _-]([^;/]+) Build'
       model: '$1'
-    - regex: 'Zuum[ _-]?([^;/)]+)[);/ ]'
+    - regex: 'Zuum[ _-]?([^;/)]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Zen
@@ -15248,7 +15584,7 @@ Zen:
   regex: '(Admire[_ ][^/;]+|Cinemax[^/;)]+)(?:Build|\))|AdmireGlam'
   device: 'smartphone'
   models:
-    - regex: 'AdmireGlam[);/ ]'
+    - regex: 'AdmireGlam(?:[);/ ]|$)'
       model: 'Admire Glam'
     - regex: '(Admire[_ ][^/;]+|Cinemax[^/;)]+)(?:Build|\))'
       model: '$1'
@@ -15303,7 +15639,7 @@ MTC:
 
 # MegaFon
 MegaFon:
-  regex: 'MegaFon|MFLoginPh|MegLogPh|(MFLogin[34]T?|MS3B|SP-A5|SP-A20i)[)\; ]'
+  regex: 'MegaFon|MFLoginPh|MegLogPh|(MFLogin[34]T?|MS3B|SP-A5|SP-A20i)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
     - regex: 'MFLoginPh|MegLogPh'
@@ -15339,7 +15675,7 @@ Vertex:
   models:
     - regex: '(Lion_Dual|Baccara|Eagle[ _]4G)'
       model: '$1'
-    - regex: 'ImpressMAX[)\; ]'
+    - regex: 'ImpressMAX(?:[);/ ]|$)'
       model: 'Impress Max'
     - regex: '(Impress[ _]([^;/]+))(?:Build|\))'
       model: '$1'
@@ -15355,7 +15691,7 @@ Unknown:
 
 # Starway
 Starway:
-  regex: 'Andromeda[ _]S(707|84[05]|850|8)[;/) ]'
+  regex: 'Andromeda[ _]S(707|84[05]|850|8)(?:[);/ ]|$)'
   device: 'tablet'
   model: 'Andromeda S$1'
 
@@ -15393,12 +15729,15 @@ MYFON:
 
 # X-TIGI
 X-TIGI:
-  regex: 'X[-_]TIGI'
+  regex: 'X[-_]TIGI|Hope7[_ ]Mate'
   device: 'smartphone'
   models:
     - regex: 'X-TIGI_JOY10_PRO'
       model: 'Joy 10 Pro'
       device: 'tablet'
+    - regex: 'Hope7[_ ]Mate'
+      model: 'Hope 7 Mate'
+      device: 'tablet'
     - regex: 'X-TIGI_JOY7_MAX'
       model: 'Joy 7 Max'
       device: 'tablet'
@@ -15411,36 +15750,36 @@ X-TIGI:
     - regex: 'X[-_]TIGI[ _-]([^/;)]+) Build'
       model: '$1'
 
-# Xiaolajiao
+# Xiaolajiao (Shenzhen Peppers)
 Xiaolajiao:
-  regex: '(LA2-(?:L|S[N]?)|HLA Note3|20190416Q|20170608S|20180322D)[);/ ]'
+  regex: '(LA2-(?:L|S[N]?)|HLA Note3|20190416Q|20170608S|20180322D)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'HLA Note3[);/ ]'
+    - regex: 'HLA Note3(?:[);/ ]|$)'
       model: 'Red Pepper Note 3'
-    - regex: '(LA2-(?:L|S[N]?))[);/ ]'
+    - regex: '(LA2-(?:L|S[N]?))(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(20190416Q)[);/ ]'
+    - regex: '(20190416Q)(?:[);/ ]|$)'
       model: '$1'
-    - regex: '20170608S[);/ ]'
+    - regex: '20170608S(?:[);/ ]|$)'
       model: 'Red Pepper Plus'
-    - regex: '20180322D[);/ ]'
+    - regex: '20180322D(?:[);/ ]|$)'
       model: 'E Sports'
 
 # Ritmix
 Ritmix:
-  regex: '(RMD[-_](?:10(?:2[689]|30|5[089])|1121|75[01]|726|85[57]|870)|RMP-(?:450|50[56]|530|600))[);/ ]'
+  regex: '(RMD[-_](?:10(?:2[689]|30|5[089])|1121|75[01]|726|85[57]|870)|RMP-(?:450|50[56]|530|600))(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'RMD[-_](10(?:2[689]|30|5[089])|1121|75[01]|726|85[57]|870)[);/ ]'
+    - regex: 'RMD[-_](10(?:2[689]|30|5[089])|1121|75[01]|726|85[57]|870)(?:[);/ ]|$)'
       model: 'RMD-$1'
-    - regex: 'RMP[-_](450|50[56]|530|600)[);/ ]'
+    - regex: 'RMP[-_](450|50[56]|530|600)(?:[);/ ]|$)'
       model: 'RMP-$1'
       device: 'smartphone'
 
 # Ross&Moor
 'Ross&Moor':
-  regex: 'RMD[-_](974R|600)[);/ ]'
+  regex: 'RMD[-_](974R|600)(?:[);/ ]|$)'
   device: 'tablet'
   model: 'RMD-$1'
 
@@ -15477,7 +15816,7 @@ NEXBOX:
       model: 'Smart 4G Speedy 5'
 
 Yandex:
-  regex: '(YNDX-?000SB)[;)\ ]'
+  regex: '(YNDX-?000SB)(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'YNDX-000SB'
 
@@ -15486,204 +15825,221 @@ FORME:
   regex: 'FORME[ _-]'
   device: 'smartphone'
   models:
-    - regex: 'FORME[ _-]F520[;)\ ]'
+    - regex: 'FORME[ _-]F520(?:[);/ ]|$)'
       model: 'Forever'
-    - regex: 'FORME[ _-](A37|R7S)[;)\ ]'
+    - regex: 'FORME[ _-](A37|R7S)(?:[);/ ]|$)'
       model: '$1'
 
 # Shuttle
 Shuttle:
-  regex: '(PNT-704[025])[;)/ ]'
+  regex: '(PNT-704[025])(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # BDF
 BDF:
-  regex: '(BDF[- ](?:819|P10|K107H|KT107|MT6753|X20)|K960N_MT(?:6580|6753)(?:_32_N)?)[;)/ ]'
+  regex: '(BDF[- ](?:819|P10|K107H|KT107|MT6753|X20)|K960N_MT(?:6580|6753)(?:_32_N)?)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'BDF[- ](819|P10|K107H|KT107|MT6753|X20)[;)/ ]'
+    - regex: 'BDF[- ](819|P10|K107H|KT107|MT6753|X20)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'K960N_MT(6580|6753)(_32_N)?[;)/ ]'
+    - regex: 'K960N_MT(6580|6753)(_32_N)?(?:[);/ ]|$)'
       model: 'BK960N MT$1'
 
 # Highscreen
 Highscreen:
-  regex: 'HIGHSCREEN|(Easy[- ]Power(?:[- ]Pro)?|Pure[_ ]Power|Power Ice(?: Max)?|Easy[_ ]([SFL]|XL)(?:_Pro)?|Razar_Pro|Power Rage(?: Evo)?|Zera-S-Power|Zera[ _][UFS]|Power[ _]?Five[ _]?(?:Pro|Evo|Max)|PowerFour|BOOST II(?:se)?|FestXL|Tasty|Boost3)[;)/ ]'
+  regex: 'HIGHSCREEN|(Easy[- ]Power(?:[- ]Pro)?|Pure[_ ]Power|Power Ice(?: Max)?|Easy[_ ]([SFL]|XL)(?:_Pro)?|Razar_Pro|Power Rage(?: Evo)?|Zera-S-Power|Zera[ _][UFS]|Power[ _]?Five[ _]?(?:Pro|Evo|Max|Max(?:Lite|2))|PowerFour|BOOST II(?:se)?|FestXL|Tasty|Boost3)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(Power Ice(?:[ ](?:Max|Evo))?|Power Rage(?: Evo)?|Zera[ _][UFS])[;)/ ]'
+    - regex: '(Power Ice(?:[ ](?:Max|Evo))?|Power Rage(?: Evo)?|Zera[ _][UFS])(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'PowerFivePro[;)/ ]'
+    - regex: 'PowerFivePro(?:[);/ ]|$)'
       model: 'Power Five Pro'
-    - regex: 'Power Five Evo[;)/ ]'
+    - regex: 'PowerFiveMaxLite(?:[);/ ]|$)'
+      model: 'Power Five Max Lite'
+    - regex: 'PowerFiveMax2(?:[);/ ]|$)'
+      model: 'Power Five Max 2'
+    - regex: 'Power Five Evo(?:[);/ ]|$)'
       model: 'Power Five Evo'
-    - regex: 'Power Five Max[;)/ ]'
+    - regex: 'Power Five Max(?:[);/ ]|$)'
       model: 'Power Five Max'
-    - regex: 'FestXL[;)/ ]'
+    - regex: 'FestXL(?:[);/ ]|$)'
       model: 'Fest XL'
-    - regex: 'PowerFour[;)/ ]'
+    - regex: 'PowerFour(?:[);/ ]|$)'
       model: 'Power Four'
-    - regex: 'Pure[_ ]Power[;)/ ]'
+    - regex: 'Pure[_ ]Power(?:[);/ ]|$)'
       model: 'Pure Power'
-    - regex: 'Razar_Pro[;)/ ]'
+    - regex: 'Razar_Pro(?:[);/ ]|$)'
       model: 'Razar Pro'
-    - regex: 'Easy[_ ]([SLF]|XL)[_ ]Pro[;)/ ]'
+    - regex: 'Easy[_ ]([SLF]|XL)[_ ]Pro(?:[);/ ]|$)'
       model: 'Easy $1 Pro'
-    - regex: 'Easy[_ ]([SFL]|XL)[;)/ ]'
+    - regex: 'Easy[_ ]([SFL]|XL)(?:[);/ ]|$)'
       model: 'Easy $1'
-    - regex: '(?:HIGHSCREEN )?Easy[- ]Power[- ]Pro[;)/ ]'
+    - regex: '(?:HIGHSCREEN )?Easy[- ]Power[- ]Pro(?:[);/ ]|$)'
       model: 'Easy Power Pro'
-    - regex: '(?:HIGHSCREEN )?Easy-Power[;)/ ]'
+    - regex: '(?:HIGHSCREEN )?Easy-Power(?:[);/ ]|$)'
       model: 'Easy Power'
-    - regex: 'BOOST II[;)/ ]'
+    - regex: 'BOOST II(?:[);/ ]|$)'
       model: 'Boost 2'
-    - regex: 'BOOST IIse[;)/ ]'
+    - regex: 'BOOST IIse(?:[);/ ]|$)'
       model: 'Boost 2 SE'
-    - regex: 'BOOST3[;)/ ]'
+    - regex: 'BOOST3(?:[);/ ]|$)'
       model: 'Boost 3'
-    - regex: 'Zera-S-Power[;)/ ]'
+    - regex: 'Zera-S-Power(?:[);/ ]|$)'
       model: 'Zera S Power'
-    - regex: 'Tasty[;)/ ]'
+    - regex: 'Tasty(?:[);/ ]|$)'
       model: 'Tasty'
+    - regex: 'WinWin(?:[);/ ]|$)'
+      model: 'WinWin'
 
 # CVTE
 CVTE:
-  regex: 'CVTE[_ ](MSD338_(:?1G|512M))[;)/ ]'
+  regex: 'CVTE[_ ](MSD338_(:?1G|512M))(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # Globex
 Globex:
-  regex: '(GU1011C|GU8012C|GU7013C|GU730C|GU-6012B)[;)/ ]'
+  regex: '(GU1011C|GU8012C|GU7013C|GU730C|GU-6012B)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'GU8012C[;)/ ]'
+    - regex: 'GU8012C(?:[);/ ]|$)'
       model: 'X8'
-    - regex: 'GU-6012B[;)/ ]'
+    - regex: 'GU-6012B(?:[);/ ]|$)'
       model: 'GU6012B'
-    - regex: '(GU1011C|GU7013C|GU730C)[;)/ ]'
+    - regex: '(GU1011C|GU7013C|GU730C)(?:[);/ ]|$)'
       model: '$1'
 
 # Atom
 Atom:
-  regex: 'ATOM-(108AM)[;)/ ]'
+  regex: 'ATOM-(108AM)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # Qumo
 Qumo:
-  regex: 'QUMO[ _]?|(Vega[ _]?78[23])[;)/ ]'
+  regex: 'QUMO[ _]?|(Vega[ _]?78[23])(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: '(?:QUMO[ _]?)?Vega[ _]?(78[23]|8002)[;)/ ]'
+    - regex: '(?:QUMO[ _]?)?Vega[ _]?(78[23]|8002)(?:[);/ ]|$)'
       model: 'Vega $1'
-    - regex: 'Yooda[;)/ ]'
+    - regex: 'Yooda(?:[);/ ]|$)'
       model: 'Yooda'
-    - regex: '(?:QUMO)?(Sirius 101-4G 8GB Black|Altair 701 8GB Black|Altair 71 4GB Black|Altair 700[24]|Altair 706)[;)/ ]'
+    - regex: '(?:QUMO)?(Sirius 101-4G 8GB Black|Altair 701 8GB Black|Altair 71 4GB Black|Altair 700[24]|Altair 706)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'QUMO[ _]Quest[ _]?(35[34]|40[26]|45[28]|476|507|570|600)[;)/ ]'
+    - regex: 'QUMO[ _]Quest[ _]?(35[34]|40[26]|45[28]|476|507|570|600)(?:[);/ ]|$)'
       device: 'smartphone'
       model: 'Quest $1'
 
 # Umax
 Umax:
-  regex: 'VisionBook[ _]|[78]Qa_3G[;)/ ]'
+  regex: 'VisionBook[ _]|[78]Qa_3G(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: '(VisionBook[ _](?:10Qi|7Q[i]?|8Q[ei]?|P70|8Qi_3G)(?:[ _](?:[34]G|Plus|LTE))?)[;)/ ]'
+    - regex: '(VisionBook[ _](?:10Qi|7Q[i]?|8Q[ei]?|P70|8Qi_3G)(?:[ _](?:[34]G|Plus|LTE))?)(?:[);/ ]|$)'
       model: '$1'
-    - regex: '([78])Qa_3G[;)/ ]'
+    - regex: '([78])Qa_3G(?:[);/ ]|$)'
       model: 'VisionBook $1Qa 3G'
-    - regex: '(VisionBook[ _](?:P50 LTE|P55 LTE(?: Pro)?))[;)/ ]'
+    - regex: '(VisionBook[ _](?:P50 LTE|P55 LTE(?: Pro)?))(?:[);/ ]|$)'
       device: 'smartphone'
       model: '$1'
 
 # Mann
 Mann:
-  regex: '(ZUG 3|ZUG 5S(?: Q)?)[;)/ ]'
+  regex: '(ZUG 3|ZUG 5S(?: Q)?)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Unihertz
 Unihertz:
-  regex: '(Titan|Jelly-Pro)[;)/ ]'
+  regex: '(Titan|Jelly-Pro)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(Jelly)-(Pro)[;)/ ]'
+    - regex: '(Jelly)-(Pro)(?:[);/ ]|$)'
       model: '$1 $2'
-    - regex: '(Titan)[;)/ ]'
+    - regex: '(Titan)(?:[);/ ]|$)'
       model: '$1'
 
 # Chuwi
 Chuwi:
-  regex: 'CW-(Hi8-super|Hi12|V99|V17HD3G|VX8-3G|V88-QUAD|V9-DUAL|V88S|Vi[78]|[HV]i10 (pro|plus))[;)/ ]'
+  regex: '(?:CW-(Hi8-super|Hi12|V99|V17HD3G|VX8-3G|V88-QUAD|V9-DUAL|V88S|Vi[78]|[HV]i10 (?:pro|plus))|Hi10 (?:Pro|plus)|HiBox-hero|HiBook pro|Hi8 (?:Air|Pro))(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: '(CW-Hi8-super)[;)/ ]'
+    - regex: '(CW-Hi8-super)(?:[);/ ]|$)'
       model: 'Hi8'
-    - regex: 'CW-(Vi10) plus[;)/ ]'
+    - regex: '(?:CW-)?(Vi10|Hi10) plus(?:[);/ ]|$)'
       model: '$1 Plus'
-    - regex: 'CW-(V88)-QUAD[;)/ ]'
+    - regex: 'CW-(V88)-QUAD(?:[);/ ]|$)'
       model: '$1 Quad'
-    - regex: 'CW-(V9)-DUAL[;)/ ]'
+    - regex: 'CW-(V9)-DUAL(?:[);/ ]|$)'
       model: '$1 Dual'
-    - regex: 'CW-(V17HD|VX8)-?(3G)[;)/ ]'
+    - regex: 'CW-(V17HD|VX8)-?(3G)(?:[);/ ]|$)'
       model: '$1 $2'
-    - regex: 'CW-(Hi10) pro[;)/ ]'
+    - regex: '(?:CW-)?(Hi10) pro(?:[);/ ]|$)'
       model: '$1 Pro'
-    - regex: 'CW-(Vi[78]|Hi12|V99|V88S)[;)/ ]'
+    - regex: 'HiBook pro(?:[);/ ]|$)'
+      model: 'HiBook Pro'
+    - regex: 'Hi8 Air(?:[);/ ]|$)'
+      model: 'Hi8 Air'
+    - regex: 'Hi8 pro(?:[);/ ]|$)'
+      model: 'Hi8 Pro'
+
+    - regex: 'HiBox-hero(?:[);/ ]|$)'
+      model: 'HiBox Hero'
+      device: 'desktop'
+
+    - regex: 'CW-(Vi[78]|Hi12|V99|V88S)(?:[);/ ]|$)'
       model: '$1'
 
 # Bezkam
 Bezkam:
-  regex: 'BEZKAM (BK-RAM2)[;)/ ]'
+  regex: 'BEZKAM (BK-RAM2)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # NG Optics
 'NG Optics':
-  regex: '(NG3128HD)[;)/ ]'
+  regex: '(NG3128HD)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # KATV1
 KATV1:
-  regex: '(KATV-01) PRO[;)/ ]'
+  regex: '(KATV-01) PRO(?:[);/ ]|$)'
   device: 'tv'
   model: '$1 Pro'
 
 # Ghong
 Ghong:
-  regex: 'GHONG(V10)[;)/ ]'
+  regex: 'GHONG(V10)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Xoro
 Xoro:
-  regex: '(?:TelePAD(?:795|731|1032|10A3|7A3)|Era 2X|HMT(?:390Q?|400)|HST 260)[;)/ ]'
+  regex: '(?:TelePAD(?:795|731|1032|10A3|7A3)|Era 2X|HMT(?:390Q?|400)|HST 260)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'TelePAD(7|10)A3 4G[;)/ ]'
+    - regex: 'TelePAD(7|10)A3 4G(?:[);/ ]|$)'
       model: 'TelePad $1 A3 4G'
-    - regex: 'TelePAD(795|731|1032)[;)/ ]'
+    - regex: 'TelePAD(795|731|1032)(?:[);/ ]|$)'
       model: 'TelePad $1'
 
-    - regex: 'HMT(390Q?|400)[;)/ ]'
+    - regex: 'HMT(390Q?|400)(?:[);/ ]|$)'
       model: 'HMT $1'
       device: 'portable media player'
 
-    - regex: 'HST 260[;)/ ]'
+    - regex: 'HST 260(?:[);/ ]|$)'
       model: 'HST 260'
       device: 'tv'
 
-    - regex: '(Era 2X)[;)/ ]'
+    - regex: '(Era 2X)(?:[);/ ]|$)'
       model: '$1'
       device: 'smartphone'
 
 # Vinga
 Vinga:
-  regex: 'VMP-(021-82|041-162|011-81)[);/ ]'
+  regex: 'VMP-(021-82|041-162|011-81)(?:[);/ ]|$)'
   device: 'tv'
   models:
     - regex: 'VMP-021-82'
@@ -15695,79 +16051,67 @@ Vinga:
 
 # Nuvo
 Nuvo:
-  regex: 'Nuvo[_ ](NS35|Blue ND40|Green[_ ]ND[_ ]45)[);/ ]'
+  regex: 'Nuvo[_ ](NS35|Blue ND40|Green[_ ]ND[_ ]45)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Nuvo[_ ](NS35)[);/ ]'
+    - regex: 'Nuvo[_ ](NS35)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'Blue (ND40)[);/ ]'
+    - regex: 'Blue (ND40)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'Green[_ ]ND[_ ]45[);/ ]'
+    - regex: 'Green[_ ]ND[_ ]45(?:[);/ ]|$)'
       model: 'ND45'
 
 # Sunvell
 Sunvell:
-  regex: 'T95ZPLUS[);/ ]'
+  regex: 'T95ZPLUS(?:[);/ ]|$)'
   device: 'tv'
   model: 'T95Z Plus'
 
-# AllDocube (https://www.alldocube.com/)
-AllDocube:
-  regex: '(?:T1001XS|iPlay_20|U1006)[);/ ]'
-  device: 'tablet'
-  models:
-    - regex: 'T1001XS[);/ ]'
-      model: 'M5XS'
-    - regex: 'U1006[);/ ]'
-      model: 'iPlay 10 Pro 10.1"'
-    - regex: 'iPlay_20[);/ ]'
-      model: 'iPlay 20'
-
 # Ugoos
 Ugoos:
-  regex: 'UGOOS-AM6[);/ ]'
+  regex: 'UGOOS-AM6(?:[);/ ]|$)'
   device: 'tv'
   model: 'AM6'
 
 # Yxtel
 Yxtel:
-  regex: 'YXTEL_([HU]1|U3)[);/ ]'
+  regex: 'YXTEL_([HU]1|U3)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Proline
 Proline:
-  regex: '(H10882M-TN)[);/ ]'
+  regex: '(H10882M-TN)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Yota
 Yota:
-  regex: '(YD20[16]|YOTA 3[+])[);/ ]'
+  regex: '(YD20[16]|YOTA 3[+])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'YD20[16][);/ ]'
+    - regex: 'YD20[16](?:[);/ ]|$)'
       model: 'Phone 2'
-    - regex: 'YOTA 3[+][);/ ]'
+    - regex: 'YOTA 3[+](?:[);/ ]|$)'
       model: 'Phone 3 Plus'
 
 # Mystery
 Mystery:
-  regex: '(MYSTERY|MID-(?:123G|72[12]|7[01348]3G|753G|833G))[);/ ]'
+  regex: '(MYSTERY|MID-(?:123G|72[12]|7[01348]3G|753G|833G))(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'MID-(123G|72[12]|7[01348]3G|753G|833G)[);/ ]'
+    - regex: 'MID-(123G|72[12]|7[01348]3G|753G|833G)(?:[);/ ]|$)'
       model: 'MID-$1'
 
 # Ritzviva
 Ritzviva:
-  regex: '(RITZVIVA[_ ]S500C)[);/ ]'
+  regex: '(RITZVIVA[_ ]S500C)(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'S500C'
 
 # DeWalt
 DeWalt:
-  regex: 'DeWalt (MD501)[);/ ]'
+  regex: 'DeWalt (MD501)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
@@ -15776,111 +16120,111 @@ Runbo:
   regex: 'Runbo'
   device: 'smartphone'
   models:
-    - regex: 'Runbo[ _-]?(X5-W|F1 Plus|F1-TT|F1-EN|F1|TT|Q5-S|X5-King|X6|Q5)[);/ ]'
+    - regex: 'Runbo[ _-]?(X5-W|F1 Plus|F1-TT|F1-EN|F1|TT|Q5-S|X5-King|X6|Q5)(?:[);/ ]|$)'
       model: '$1'
 
 # NewsMy
 NewsMy:
-  regex: '(CarPad-(?:II|III)-P)[);/ ]'
+  regex: '(CarPad-(?:II|III)-P)(?:[);/ ]|$)'
   device: 'car browser'
   model: '$1'
 
 # Daewoo
 Daewoo:
-  regex: 'Daewoo|(DTA-07IDRF)[);/ ]'
+  regex: 'Daewoo|(DTA-07IDRF)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: '(DTA-07IDRF)[);/ ]'
+    - regex: '(DTA-07IDRF)(?:[);/ ]|$)'
       model: 'Archive 7P'
 
-    - regex: 'Daewoo (Android TV 638)[);/ ]'
+    - regex: 'Daewoo (Android TV 638)(?:[);/ ]|$)'
       model: '$1'
       device: 'tv'
 
 # Vesta
 Vesta:
-  regex: 'VESTA32LD86[);/ ]'
+  regex: 'VESTA32LD86(?:[);/ ]|$)'
   device: 'tv'
   model: 'SmartT V2.0 32LD86S'
 
 # Spectrum
 Spectrum:
-  regex: '(CARBONO_5|CUARZO_6|DIAMANTE_5|VULCANO_55)[);/ ]'
+  regex: '(CARBONO_5|CUARZO_6|DIAMANTE_5|VULCANO_55)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'VULCANO_55[);/ ]'
+    - regex: 'VULCANO_55(?:[);/ ]|$)'
       model: 'Vulcano 5.5"'
-    - regex: 'CARBONO_5[);/ ]'
+    - regex: 'CARBONO_5(?:[);/ ]|$)'
       model: 'Carbono 5.0"'
-    - regex: 'CUARZO_6[);/ ]'
+    - regex: 'CUARZO_6(?:[);/ ]|$)'
       model: 'Cuarzo 6.0"'
-    - regex: 'DIAMANTE_5[);/ ]'
+    - regex: 'DIAMANTE_5(?:[);/ ]|$)'
       model: 'Diamante 5.0"'
 
 # Kivi
 Kivi:
-  regex: '(?:24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55UP50GU|50U600GU|55UR50GR|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|55UC30G|32HK30G|40FK30G|32HR50GU|43UK30G|32FR50(?:WR|BU)|32FK3[02]G)(?:_-Ver0[0-9])?[);/ ]'
+  regex: '(?:24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55UP50GU|50U600GU|55UR50GR|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|55UC30G|32HK30G|40FK30G|32HR50GU|43UK30G|32FR50(?:WR|BU)|32FK3[02]G)(?:_-Ver0[0-9])?(?:[);/ ]|$)'
   device: 'tv'
   models:
-    - regex: '(24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55UP50GU|50U600GU|55UR50GR|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|32FR50(?:WR|BU)|32FK3[02]G)[);/ ]'
+    - regex: '(24H600G[RU]|24FR50WU|24HK30B|32HR55GU|4[39]UP50GU|40UR50G[RU]|40U600G[RU]|55UP50GU|50U600GU|55UR50GR|40FK30G|40FR50BR|43UK35G|50FK30G|50UK35G|32HR50GR|32FR50(?:WR|BU)|32FK3[02]G)(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(55UC30G|40FK30G|43UK30G|32HR50G[RU]|32HK30G|32FK32G)_-Ver0([0-9])[);/ ]'
+    - regex: '(55UC30G|40FK30G|43UK30G|32HR50G[RU]|32HK30G|32FK32G)_-Ver0([0-9])(?:[);/ ]|$)'
       model: '$1 v$2'
 
 # Divisat
 Divisat:
-  regex: '(Divisat)[);/ ]'
+  regex: '(Divisat)(?:[);/ ]|$)'
   device: 'tv'
   models:
-    - regex: '(J-Link)[);/ ]'
+    - regex: '(J-Link)(?:[);/ ]|$)'
       model: '$1'
 
 # Kanji
 Kanji:
-  regex: 'KJ-(OB03|YUBI)[);/ ]'
+  regex: 'KJ-(OB03|YUBI)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'KJ-OB03[);/ ]'
+    - regex: 'KJ-OB03(?:[);/ ]|$)'
       model: 'Cata 7'
-    - regex: 'KJ-YUBI[);/ ]'
+    - regex: 'KJ-YUBI(?:[);/ ]|$)'
       model: 'Yubi 3G'
 
 #Kaiomy
 Kaiomy:
-   regex: 'KaiCloud[ ]?(7[48]4|942)[);/ ]'
+   regex: 'KaiCloud[ ]?(7[48]4|942)(?:[);/ ]|$)'
    device: 'tablet'
    model: 'KaiCloud $1'
 
 # National
 National:
-  regex: '(NX-32THS100)[);/ ]'
+  regex: '(NX-32THS100)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # Vsun
 Vsun:
-  regex: 'VSUN (ILLUSION|RACE|V9)[);/ ]'
+  regex: 'VSUN (ILLUSION|RACE|V9)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'ILLUSION[);/ ]'
+    - regex: 'ILLUSION(?:[);/ ]|$)'
       model: 'Illusion'
-    - regex: 'RACE[);/ ]'
+    - regex: 'RACE(?:[);/ ]|$)'
       model: 'Race'
-    - regex: '(V9)[);/ ]'
+    - regex: '(V9)(?:[);/ ]|$)'
       model: '$1'
 
 # Shift Phones
 Shift Phones:
-  regex: '(SHIFT6m)[);/ ]'
+  regex: '(SHIFT6m)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # RugGear
 RugGear:
-  regex: '(RugGear|RG(?:310|500|65[05]|702|710|850))[);/ ]'
+  regex: '(RugGear|RG(?:310|500|65[05]|702|710|850))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(RG[0-9]+)[);/ ]'
+    - regex: '(RG[0-9]+)(?:[);/ ]|$)'
       model: '$1'
 
 # Aligator
@@ -15888,550 +16232,558 @@ Aligator:
   regex: 'ALIGATOR[_);/ ]'
   device: 'smartphone'
   models:
-    - regex: 'ALIGATOR[ _](S4080|S50(?:6[56]|[678]0)|RX510)[);/ ]'
+    - regex: 'ALIGATOR[ _](S4080|S50(?:6[56]|[678]0)|RX510)(?:[);/ ]|$)'
       model: '$1'
 
 # Maxcom
 Maxcom:
-  regex: '(MS(?:45[036]|505|514)|MS457(?:PLUS)?)[);/ ]'
+  regex: '(MS(?:45[036]|505|514)|MS457(?:PLUS)?)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(MS457)PLUS[);/ ]'
+    - regex: '(MS457)PLUS(?:[);/ ]|$)'
       model: '$1 Plus'
-    - regex: 'MS(45[0367]|505|514)[);/ ]'
+    - regex: 'MS(45[0367]|505|514)(?:[);/ ]|$)'
       model: 'MS$1'
 
 # Luna
 Luna:
-  regex: 'LUNA[ _](V55|G60)[);/ ]'
+  regex: '(?:LUNA[ _](?:V55|G[56]0)|TG-L800S)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: '$1'
+  models:
+    - regex: 'LUNA[ _](V55|G[56]0)(?:[);/ ]|$)'
+      model: '$1'
+    - regex: '(TG-L800S)(?:[);/ ]|$)'
+      model: '$1'
 
 # Protruly
 Protruly:
-  regex: 'PROTRULY[ _](D[78]|V10S)[);/ ]'
+  regex: 'PROTRULY[ _](D[78]|V10S)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # JFone
 JFone:
-  regex: 'JFone[ _](JS501)[);/ ]'
+  regex: 'JFone[ _](JS501)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Uhans
 Uhans:
-  regex: '(A101S)[);/ ]'
+  regex: '(A101S)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Soyes
 Soyes:
-  regex: 'SOYES[ _]([67]S)[);/ ]'
+  regex: 'SOYES[ _]([67]S)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Zidoo
 Zidoo:
-  regex: 'ZIDOO[ _](H6 Pro|X6 Pro|X9S|Z10|X[158])[);/ ]'
+  regex: 'ZIDOO[ _](H6 Pro|X6 Pro|X9S|Z10|X[158])(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # Zfiner
 Zfiner:
-  regex: 'ZFINERY900[);/ ]'
+  regex: 'ZFINERY900(?:[);/ ]|$)'
   device: 'tablet'
   model: 'Y900'
 
 # iGet
 iGet:
-  regex: 'SMART_(G10[12]|G71|G81[H]?)[);/ ]'
+  regex: 'SMART_(G10[12]|G71|G81[H]?)(?:[);/ ]|$)'
   device: 'tablet'
   model: 'Smart $1'
 
 # iVA
 iVA:
-  regex: '(LAMCY L350|IVA S6)[);/ ]'
+  regex: '(LAMCY L350|IVA S6)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'LAMCY L350[);/ ]'
+    - regex: 'LAMCY L350(?:[);/ ]|$)'
       model: 'Lamcy L350'
-    - regex: 'IVA S6[);/ ]'
+    - regex: 'IVA S6(?:[);/ ]|$)'
       model: 'S6'
 
 # Phicomm
 Phicomm:
-  regex: '(PHICOMM)[);/ ]'
+  regex: '(PHICOMM)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'C630 \(CLUE L\)[);/ ]'
+    - regex: 'C630 \(CLUE L\)(?:[);/ ]|$)'
       model: 'Clue L'
-    - regex: 'E653\(ENERGY L\)[);/ ]'
+    - regex: 'E653\(ENERGY L\)(?:[);/ ]|$)'
       model: 'Energy L'
-    - regex: 'PHICOMM ENERGY 3\+[);/ ]'
+    - regex: 'PHICOMM ENERGY 3\+(?:[);/ ]|$)'
       model: 'Energy 3+'
-    - regex: 'CLUE (2S|M)[);/ ]'
+    - regex: 'CLUE (2S|M)(?:[);/ ]|$)'
       model: 'Clue $1'
 
 # Huadoo
 Huadoo:
-  regex: 'Huadoo[ _](HG0[46]|HG11|V[34])[);/ ]'
+  regex: 'Huadoo[ _](HG0[46]|HG11|V[34])(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Gome
 Gome:
-  regex: 'GOME[_ ](2018X38A|2016G68A|2017M27A|2016M25A|C7_Note_Plus|U9|S[17])[);/ ]'
+  regex: 'GOME[_ ](2018X38A|2017X05A|2016G68A|2017M27A|2016M25A|C7_Note_Plus|U9|S[17])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'GOME[_ ](2018X38A)[);/ ]'
+    - regex: 'GOME[_ ](?:2018X38A)(?:[);/ ]|$)'
       model: 'C72'
-    - regex: 'GOME[_ ](2016G68A)[);/ ]'
+    - regex: 'GOME[_ ](?:2017X05A)(?:[);/ ]|$)'
+      model: 'C71'
+    - regex: 'GOME[_ ](?:2016G68A)(?:[);/ ]|$)'
       model: 'K1'
-    - regex: 'GOME[_ ](2016M25A)[);/ ]'
+    - regex: 'GOME[_ ](?:2016M25A)(?:[);/ ]|$)'
       model: 'U1'
-    - regex: 'GOME[_ ](2017M27A)[);/ ]'
+    - regex: 'GOME[_ ](?:2017M27A)(?:[);/ ]|$)'
       model: 'U7'
-    - regex: 'GOME[_ ](C7_Note_Plus|U9|S[17])[);/ ]'
+    - regex: 'GOME[_ ](C7_Note_Plus|U9|S[17])(?:[);/ ]|$)'
       model: '$1'
 
 # Voyo
 Voyo:
-  regex: 'VOYO[_ ](A15)[);/ ]'
+  regex: 'VOYO[_ ](A15)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Ryte (Ryte Mobile)
 Ryte:
-  regex: 'RYTE (U55 LTE)[);/ ]'
+  regex: 'RYTE (U55 LTE)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Vontar
 Vontar:
-  regex: '(HK1 (?:Max|MINI|PLUS|PRO)|VONTAR[ -](?:Z[58]|V1|KIII|MX-4K))[);/ ]'
+  regex: '(HK1 (?:Max|MINI|PLUS|PRO)|VONTAR[ -](?:Z[58]|V1|KIII|MX-4K))(?:[);/ ]|$)'
   device: 'tv'
   models:
-    - regex: 'VONTAR[ -](Z[58]|V1|KIII|MX-4K)[);/ ]'
+    - regex: 'VONTAR[ -](Z[58]|V1|KIII|MX-4K)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'HK1 Max[);/ ]'
+    - regex: 'HK1 Max(?:[);/ ]|$)'
       model: 'HK1 Max'
-    - regex: 'HK1 MINI[);/ ]'
+    - regex: 'HK1 MINI(?:[);/ ]|$)'
       model: 'HK1 Mini'
-    - regex: 'HK1 PLUS[);/ ]'
+    - regex: 'HK1 PLUS(?:[);/ ]|$)'
       model: 'HK1 Plus'
-    - regex: 'HK1 PRO[);/ ]'
+    - regex: 'HK1 PRO(?:[);/ ]|$)'
       model: 'HK1 Pro'
 
 # Vorke
 Vorke:
-  regex: 'VORKE (Z[15]|Z6(?: Plus)?)[);/ ]'
+  regex: 'VORKE (Z[15]|Z6(?: Plus)?)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # Wigor
 Wigor:
-  regex: 'Wigor (V4)[);/ ]'
+  regex: 'Wigor (V4)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # NEXON
 NEXON:
-   regex: 'NEXON (X[19])[);/ ]'
+   regex: 'NEXON (X[19])(?:[);/ ]|$)'
    device: 'tv'
    model: '$1'
 
 # ONN
 ONN:
-  regex: '(ONA19TB00[27])[);/ ]'
+  regex: '(ONA19TB00[27])(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Q.Bell
 'Q.Bell':
-  regex: '(QPHONE[_ ](?:10.1|9.1|5.4))[);/ ]'
+  regex: '(QPHONE[_ ](?:10.1|9.1|5.4))(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Datawind
 Datawind:
-  regex: '(DW-PS3G5)[);/ ]'
+  regex: '(DW-PS3G5)(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'Pocket Surfer 3G5'
 
 # Droxio
 Droxio:
-  regex: 'DROXIO (C40|B45)[);/ ]'
+  regex: 'DROXIO (C40|B45)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Goophone
 Goophone:
-  regex: '(?:M(G492|L7[JK]2)CH|MN(4A2|8J2)ZP|MGA92ZP|MKU82ZP|MNGW2CH|MNH02CH|MNRM2CH)[/]A[);/ ]'
+  regex: '(?:M(G492|L7[JK]2)CH|MN(4A2|8J2)ZP|MGA92ZP|MKU82ZP|MNGW2CH|MNH02CH|MNRM2CH)[/]A(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(?:MG492CH|MGA92ZP)[/]A[);/ ]'
+    - regex: '(?:MG492CH|MGA92ZP)[/]A(?:[);/ ]|$)'
       model: 'I6 Plus'
-    - regex: 'ML7[JK]2CH[/]A[);/ ]'
+    - regex: 'ML7[JK]2CH[/]A(?:[);/ ]|$)'
       model: 'I6'
-    - regex: 'MKU82ZP[/]A[);/ ]'
+    - regex: 'MKU82ZP[/]A(?:[);/ ]|$)'
       model: 'I6S'
-    - regex: 'MNGW2CH[/]A[);/ ]'
+    - regex: 'MNGW2CH[/]A(?:[);/ ]|$)'
       model: 'I6S Plus'
-    - regex: '(?:MN4A2ZP|MNH02CH)[/]A[);/ ]'
+    - regex: '(?:MN4A2ZP|MNH02CH)[/]A(?:[);/ ]|$)'
       model: 'I7'
-    - regex: '(?:MN8J2ZP|MNRM2CH)[/]A[);/ ]'
+    - regex: '(?:MN8J2ZP|MNRM2CH)[/]A(?:[);/ ]|$)'
       model: 'I7 Plus'
 
 # PocketBook
 PocketBook:
-  regex: 'PocketBook SURFpad 3 \(([\d]+).([\d]+)["]?\)[);/ ]'
+  regex: 'PocketBook SURFpad 3 \(([\d]+).([\d]+)["]?\)(?:[);/ ]|$)'
   device: 'tablet'
   model: 'Surfpad 3 $1.$2"'
 
 # Bitmore
 Bitmore:
-  regex: '(?:Mobitab10c-3G|Tab1011Q_II)[);/ ]'
+  regex: '(?:Mobitab10c-3G|Tab1011Q_II)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: '(Mobitab)(10)c-3G[);/ ]'
+    - regex: '(Mobitab)(10)c-3G(?:[);/ ]|$)'
       model: '$1 $2C 3G'
-    - regex: 'Tab1011Q_II[);/ ]'
+    - regex: 'Tab1011Q_II(?:[);/ ]|$)'
       model: 'Tab1011Q II'
 
 # Kuliao
 Kuliao:
-  regex: 'KULIAO (K10)[);/ ]'
+  regex: 'KULIAO (K10)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Sugar
 Sugar:
-  regex: 'SUGAR (?:C[12]1|[YF]11|[YFS]9|C6|[FY]7|Y8|Y1[25])[);/ ]'
+  regex: 'SUGAR (?:C[12]1|[YF]11|[YFS]9|C6|[FY]7|Y8|Y1[25])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'SUGAR Y([78]) MAX[);/ ]'
+    - regex: 'SUGAR Y([78]) MAX(?:[);/ ]|$)'
       model: 'Y$1 Max'
-    - regex: 'SUGAR F7 Mini[);/ ]'
+    - regex: 'SUGAR F7 Mini(?:[);/ ]|$)'
       model: 'F7 Mini'
-    - regex: 'SUGAR (C[12]1|[YF]11|[YFS]9|C6|Y7|Y1[25])[);/ ]'
+    - regex: 'SUGAR (C[12]1|[YF]11|[YFS]9|C6|Y7|Y1[25])(?:[);/ ]|$)'
       model: '$1'
 
 
 # Xshitou
 Xshitou:
-  regex: 'Xshitou[_ ](P7)[);/ ]'
+  regex: 'Xshitou[_ ](P7)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # JKL
 JKL:
-  regex: 'JKL[_ ](A28)[);/ ]'
+  regex: 'JKL[_ ](A28)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Gree
 Gree:
-  regex: '(G0215D|G0245D|G0335D)[);/ ]'
+  regex: '(G0215D|G0245D|G0335D)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Vodacom
 Vodacom:
-  regex: '(?:Vodacom)[ _](Power Tab 10)[);/ ]'
+  regex: '(?:Vodacom)[ _](Power Tab 10)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # VKworld
 VKworld:
-  regex: '(?:(?:VK700)-MAX|T5SE)[);/ ]'
+  regex: '(?:(?:VK700)-MAX|T5SE)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(VK700)-MAX[);/ ]'
+    - regex: '(VK700)-MAX(?:[);/ ]|$)'
       model: '$1 Max'
-    - regex: 'T5SE[);/ ]'
+    - regex: 'T5SE(?:[);/ ]|$)'
       model: 'T5 SE'
 
 # Mito
 Mito:
-  regex: 'MITO[- _](A(?:1[068]|39|55|180|2[36]0|313|322|33|3[136]0|[35]50|6[89]|7[235]|82|[356]0|810|950)|T(?:10|35|3[03]0|510|888)|311)[);/ ]'
+  regex: 'MITO[- _](A(?:1[068]|39|55|180|2[36]0|313|322|33|3[136]0|[35]50|6[89]|7[235]|82|[356]0|810|950)|T(?:10|35|3[03]0|510|888)|311)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'MITO[ _](A(?:1[068]|39|55|180|2[36]0|33|322|313|3[136]0|[35]50|6[89]|7[235]|82|[356]0|810|950))[);/ ]'
+    - regex: 'MITO[ _](A(?:1[068]|39|55|180|2[36]0|33|322|313|3[136]0|[35]50|6[89]|7[235]|82|[356]0|810|950))(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'MITO-(311)[);/ ]'
+    - regex: 'MITO-(311)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'MITO[ _](T(?:10|35|3[03]0|510|888))[);/ ]'
+    - regex: 'MITO[ _](T(?:10|35|3[03]0|510|888))(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1'
 
 # TWM
 TWM:
-  regex: 'Amazing[ _](X[35]s|X[2356]|A5S|A[48]|A4S)[);/ ]'
+  regex: 'Amazing[ _](X[35]s|X[2356]|A5S|A[48]|A4S)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Amazing[ _](X[35])s[);/ ]'
+    - regex: 'Amazing[ _](X[35])s(?:[);/ ]|$)'
       model: 'Amazing $1S'
-    - regex: 'Amazing[ _](A5S|X[2356]|A[48]|A4S)[);/ ]'
+    - regex: 'Amazing[ _](A5S|X[2356]|A[48]|A4S)(?:[);/ ]|$)'
       model: 'Amazing $1'
 
 # Onix
 Onix:
-  regex: '(AT101-1116)[);/ ]'
+  regex: '(AT101-1116)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Mobo
 Mobo:
-  regex: '(MT7-442D)[);/ ]'
+  regex: '(MT7-442D)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Macoox
 Macoox:
-  regex: '(MC-X7MINI)[);/ ]'
+  regex: '(MC-X7MINI)(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'MC-X7 Mini'
 
 # Prixton
 Prixton:
-  regex: '(T7012Q)[);/ ]'
+  regex: '(T7012Q)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Newland
 Newland:
-  regex: '(?:NLS-MT90)[);/ ]'
+  regex: '(?:NLS-MT90)(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'MT90 Orca'
 
 # Orbic
 Orbic:
-  regex: '(?:RC555L|RC501L)[);/ ]'
+  regex: '(?:RC555L|RC501L)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'RC555L[);/ ]'
+    - regex: 'RC555L(?:[);/ ]|$)'
       model: 'Wonder'
-    - regex: 'RC501L[);/ ]'
+    - regex: 'RC501L(?:[);/ ]|$)'
       model: 'Slim'
 
 # RED
 RED:
-  regex: '(?:H1A1000)[);/ ]'
+  regex: '(?:H1A1000)(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'Hydrogen One'
 
 # Contixo
 Contixo:
-  regex: 'Contixo|(?:CX-1045 3G)[);/ ]'
+  regex: 'Contixo|(?:CX-1045 3G)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'CX-1045 3G[);/ ]'
+    - regex: 'CX-1045 3G(?:[);/ ]|$)'
       model: 'CX-1045 3G'
-    - regex: 'CONTIXO GX 1035[);/ ]'
+    - regex: 'CONTIXO GX 1035(?:[);/ ]|$)'
       model: 'GX-1035 4G 10.1"'
-    - regex: 'B105[);/ ]'
+    - regex: 'B105(?:[);/ ]|$)'
       model: 'B105 3G 10.1"'
-    - regex: 'B108[);/ ]'
+    - regex: 'B108(?:[);/ ]|$)'
       model: 'B108 4G 10.1"'
-    - regex: 'KT107(?: 3G)?[);/ ]'
+    - regex: 'KT107(?: 3G)?(?:[);/ ]|$)'
       model: 'KT107 3G 10.1"'
-    - regex: 'KT715 3G[);/ ]'
+    - regex: 'KT715 3G(?:[);/ ]|$)'
       model: 'KT715 3G 7.0"'
-    - regex: 'KT995[);/ ]'
+    - regex: 'KT995(?:[);/ ]|$)'
       model: 'KT995 3G 10.1"'
 
 # E-Ceros
 'E-Ceros':
-   regex: '(?:CT9716(?:-B)?)[);/ ]'
+   regex: '(?:CT9716(?:-B)?)(?:[);/ ]|$)'
    device: 'tablet'
    models:
-     - regex: 'CT9716[);/ ]'
+     - regex: 'CT9716(?:[);/ ]|$)'
        model: 'Revolution'
-     - regex: 'CT9716-B[);/ ]'
+     - regex: 'CT9716-B(?:[);/ ]|$)'
        model: 'Revolution HD'
 
 # How (how.com.br)
 How:
-  regex: '(?:HT-705XS|705-G Go|1001-G Go)[);/ ]'
+  regex: '(?:HT-705XS|705-G Go|1001-G Go)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: '(HT-705XS)[);/ ]'
+    - regex: '(HT-705XS)(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(1001-G Go)[);/ ]'
+    - regex: '(1001-G Go)(?:[);/ ]|$)'
       model: 'HT-1001G Go Kids'
-    - regex: '(705-G Go)[);/ ]'
+    - regex: '(705-G Go)(?:[);/ ]|$)'
       model: 'HT-$1'
 
 # Multilaser
 Multilaser:
-  regex: '(?:Multilaser[ _](?:[FEGH])(?:[_ ](?:Pro|Max|Lite))?|MS50[LGX]|M7[_-]3G[_-]PLUS|MS5\.V2|MS45S_A6|MS45S|MS50S|MS60[XZ]|M7SQC_Plus|MS80X|MS40[GS]|MS55M|MS70|M7-3G QUAD CORE|M7sLite)[);/ ]'
+  regex: '(?:Multilaser[ _](?:[FEGH])(?:[_ ](?:Pro|Max|Lite))?|MS50[LGX]|M7[_-]3G[_-]PLUS|MS5\.V2|MS45S_A6|MS45S|MS50S|MS60[XZ]|M7SQC_Plus|MS80X|MS40[GS]|MS55M|MS70|M7-3G QUAD CORE|M7sLite)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Multilaser[ _]G[_ ]Pro[);/ ]'
+    - regex: 'Multilaser[ _]G[_ ]Pro(?:[);/ ]|$)'
       model: 'G Pro'
-    - regex: 'Multilaser[ _]G[_ ]Max[);/ ]'
+    - regex: 'Multilaser[ _]G[_ ]Max(?:[);/ ]|$)'
       model: 'G Max'
-    - regex: 'Multilaser[ _]G[);/ ]'
+    - regex: 'Multilaser[ _]G(?:[);/ ]|$)'
       model: 'G'
-    - regex: 'Multilaser[ _]E[_ ]Lite[);/ ]'
+    - regex: 'Multilaser[ _]E[_ ]Lite(?:[);/ ]|$)'
       model: 'E Lite'
-    - regex: 'Multilaser[ _]([FEH])[);/ ]'
+    - regex: 'Multilaser[ _]([FEH])(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(MS50[LGX]|MS45S_A6|MS40[GS]|MS55M|MS70|MS60[XZ]|MS45S|MS80X|MS50S|MS5\.V2)[);/ ]'
+    - regex: '(MS50[LGX]|MS45S_A6|MS40[GS]|MS55M|MS70|MS60[XZ]|MS45S|MS80X|MS50S|MS5\.V2)(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'M7[_-]3G[_-]PLUS[);/ ]'
+    - regex: 'M7[_-]3G[_-]PLUS(?:[);/ ]|$)'
       device: 'tablet'
       model: 'M7 3G Plus'
-    - regex: 'M7SQC_PLUS[);/ ]'
+    - regex: 'M7SQC_PLUS(?:[);/ ]|$)'
       device: 'tablet'
       model: 'M7SQC Plus'
-    - regex: 'M7-3G QUAD CORE[);/ ]'
+    - regex: 'M7-3G QUAD CORE(?:[);/ ]|$)'
       device: 'tablet'
       model: 'M7 3G Quad Core'
-    - regex: 'M7sLite[);/ ]'
+    - regex: 'M7sLite(?:[);/ ]|$)'
       device: 'tablet'
       model: 'M7s Lite'
 
 # Positivo BGH
 Positivo BGH:
-  regex: '(?:T1060B|S455|Positivo (?:Twist|Ypy|Mini I)|Twist[ _](?:\(2018\)|2 (?:Fit|Pro)|Mini|Tab|Metal(?: 32GB)?|Max|XL|SE|[23SM]))[);/ ]'
+  regex: '(?:T1060B|S455|Positivo (?:Twist|Ypy|Mini I)|Twist[ _](?:\(2018\)|2 (?:Fit|Pro)|Mini|Tab|Metal(?: 32GB)?|Max|XL|SE|[23SM]))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'S455[);/ ]'
+    - regex: 'S455(?:[);/ ]|$)'
       model: 'Selfie'
-    - regex: 'Twist \(2018\)[);/ ]'
+    - regex: 'Twist \(2018\)(?:[);/ ]|$)'
       model: 'Twist (2018)'
-    - regex: 'Twist Metal 32GB[);/ ]'
+    - regex: 'Twist Metal 32GB(?:[);/ ]|$)'
       model: 'Twist Metal 32GB'
-    - regex: 'Twist Metal[);/ ]'
+    - regex: 'Twist Metal(?:[);/ ]|$)'
       model: 'Twist Metal'
-    - regex: 'Twist Max[);/ ]'
+    - regex: 'Twist Max(?:[);/ ]|$)'
       model: 'Twist Max'
-    - regex: 'Twist[ _]Mini[);/ ]'
+    - regex: 'Twist[ _]Mini(?:[);/ ]|$)'
       model: 'Twist Mini'
-    - regex: 'Twist 2 Fit[);/ ]'
+    - regex: 'Twist 2 Fit(?:[);/ ]|$)'
       model: 'Twist 2 Fit'
-    - regex: 'Twist 2 Pro[);/ ]'
+    - regex: 'Twist 2 Pro(?:[);/ ]|$)'
       model: 'Twist 2 Pro'
-    - regex: 'Twist XL[);/ ]'
+    - regex: 'Twist XL(?:[);/ ]|$)'
       model: 'Twist XL'
-    - regex: 'Twist SE[);/ ]'
+    - regex: 'Twist SE(?:[);/ ]|$)'
       model: 'Twist SE'
-    - regex: '(?:Positivo )?Twist ([23SM])[);/ ]'
+    - regex: '(?:Positivo )?Twist ([23SM])(?:[);/ ]|$)'
       model: 'Twist $1'
-    - regex: '(?:Positivo )Mini I[);/ ]'
+    - regex: '(?:Positivo )Mini I(?:[);/ ]|$)'
       model: 'Mini I'
 
-    - regex: 'T1060B[);/ ]'
+    - regex: 'T1060B(?:[);/ ]|$)'
       device: 'tablet'
       model: 'T1060B'
-    - regex: 'Positivo Ypy L1050E[);/ ]'
+    - regex: 'Positivo Ypy L1050E(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Ypy L1050E'
-    - regex: 'Twist Tab[);/ ]'
+    - regex: 'Twist Tab(?:[);/ ]|$)'
       device: 'tablet'
       model: 'Twist Tab'
 
 # Maxtron
 Maxtron:
-  regex: 'Maxtron[ _-](V[327]|S8)[);/ ]'
+  regex: 'Maxtron[ _-](V[327]|S8)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Philco (philco.com.br)
 Philco:
-  regex: '(PCS01|PH350B|PTB7R)[);/ ]'
+  regex: '(PCS01|PH350B|PTB7R)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '(PCS01|PH350B)[);/ ]'
+    - regex: '(PCS01|PH350B)(?:[);/ ]|$)'
       model: '$1'
-    - regex: '(PTB7R)[);/ ]'
+    - regex: '(PTB7R)(?:[);/ ]|$)'
       device: 'tablet'
       model: '$1'
 
 # SEMP TCL
 SEMP TCL:
-  regex: '(?:GO[35]E|5101J|GO3C(?: Plus)?)[);/ ]'
+  regex: '(?:GO[35]E|5101J|GO3C(?: Plus)?)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '5101J[);/ ]'
+    - regex: '5101J(?:[);/ ]|$)'
       model: 'L9 Plus'
-    - regex: 'GO3C Plus[);/ ]'
+    - regex: 'GO3C Plus(?:[);/ ]|$)'
       model: 'GO! 3C Plus'
-    - regex: 'GO3C[);/ ]'
+    - regex: 'GO3C(?:[);/ ]|$)'
       model: 'GO! 3C'
-    - regex: '(GO[35]E)[);/ ]'
+    - regex: '(GO[35]E)(?:[);/ ]|$)'
       model: '$1'
 
 # Newman
 Newman:
-  regex: 'Newman[ _](P308|K1)[);/ ]'
+  regex: 'Newman[ _](P308|K1)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Swipe
 Swipe:
-  regex: '(Elite Sense)[);/ ]'
+  regex: '(Elite Sense)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Owwo
 Owwo:
-  regex: 'OWWO[ _]?([1457]S|Q[78])[);/ ]'
+  regex: 'OWWO[ _]?([1457]S|Q[78])(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # 360 or names Qihoo 360, +360
 '360':
-  regex: '(?:180[1379]-A01|1713-A01|1707-A01|1509-A00|1603-A03|1607-A01)[);/ ]'
+  regex: '(?:180[1379]-A01|1713-A01|1707-A01|1509-A00|1603-A03|1607-A01|1503-A01)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: '1807-A01[);/ ]'
+    - regex: '1807-A01(?:[);/ ]|$)'
       model: 'N7'
-    - regex: '1803-A01[);/ ]'
+    - regex: '1803-A01(?:[);/ ]|$)'
       model: 'N7 Lite'
-    - regex: '1809-A01[);/ ]'
+    - regex: '1809-A01(?:[);/ ]|$)'
       model: 'N7 Pro'
-    - regex: '1713-A01[);/ ]'
+    - regex: '1713-A01(?:[);/ ]|$)'
       model: 'N6 Lite'
-    - regex: '1707-A01[);/ ]'
+    - regex: '1707-A01(?:[);/ ]|$)'
       model: 'N6'
-    - regex: '1801-A01[);/ ]'
+    - regex: '1801-A01(?:[);/ ]|$)'
       model: 'N6 Pro'
-    - regex: '1509-A00[);/ ]'
+    - regex: '1509-A00(?:[);/ ]|$)'
       model: 'Q5 Plus'
-    - regex: '1603-A03[);/ ]'
+    - regex: '1503-A01(?:[);/ ]|$)'
+      model: 'N4'
+    - regex: '1603-A03(?:[);/ ]|$)'
       model: 'N4A'
-    - regex: '1607-A01[);/ ]'
+    - regex: '1607-A01(?:[);/ ]|$)'
       model: 'N5S'
 
 # TD Systems
 TD Systems:
-  regex: '(K32DLX9HS|K40DLM8FS|K40DLX9FS)[);/ ]'
+  regex: '(K32DLX9HS|K40DLM8FS|K40DLX9FS)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # Ravoz
 Ravoz:
-  regex: 'RAVOZ[ _](Z[347]|R[478])[);/ ]'
+  regex: 'RAVOZ[ _](Z[347]|R[478])(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Tone Mobile
 Tone:
-  regex: 'TONE (e19|m15)[);/ ]'
+  regex: 'TONE (e19|m15)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # AT&T
 AT&T:
-   regex: '(?:U304AA|QS5509A)[);/ ]'
+   regex: '(?:U304AA|QS5509A)(?:[);/ ]|$)'
    device: 'smartphone'
    models:
-     - regex: 'U304AA[);/ ]'
+     - regex: 'U304AA(?:[);/ ]|$)'
        model: 'Radiant Core'
-     - regex: 'QS5509A[);/ ]'
+     - regex: 'QS5509A(?:[);/ ]|$)'
        model: 'Axia'
 
 # BIHEE
@@ -16439,280 +16791,286 @@ BIHEE:
   regex: '(ZBH-)?BIHEE'
   device: 'smartphone'
   models:
-    - regex: '(A1[12]|A[78]\+|A[56])[);/ ]'
+    - regex: '(A1[12]|A[78]\+|A[56])(?:[);/ ]|$)'
       model: '$1'
 
 # Enot
 Enot:
-  regex: 'Enot[ _-](E102|J101)[);/ ]'
+  regex: 'Enot[ _-](E102|J101)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Kooper
 Kooper:
-  regex: 'Kooper-mobile-W502[);/ ]'
+  regex: 'Kooper-mobile-W502(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'Mobile W502'
 
 # Lesia
 Lesia:
-  regex: 'ANOVA A5[);/ ]'
+  regex: 'ANOVA A5(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'Anova A5'
 
 # Anry
 Anry:
-  regex: 'ANRY-(RS10)[);/ ]'
+  regex: 'ANRY-(RS10|[SX]20)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Tinai
 Tinai:
-  regex: 'Tinai (K[12])[);/ ]'
+  regex: 'Tinai (K[12])(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Winds (Windsmobile)
 Winds:
-  regex: 'NOTE GRACE V[);/ ]'
+  regex: 'NOTE GRACE V(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'Note Grace V'
 
 # Asano
 Asano:
-  regex: '32LF7130S[);/ ]'
+  regex: '32LF7130S(?:[);/ ]|$)'
   device: 'tv'
   model: '32LF7130S 32.0"'
 
 # Phonemax
 Phonemax:
-  regex: 'PHONEMAX[_ ](Saturn(?:[_ ]X)?|Mars)[);/ ]'
+  regex: 'PHONEMAX[_ ](Saturn(?:[_ ]X)?|Mars)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'PHONEMAX[_ ]Saturn[_ ]X[);/ ]'
+    - regex: 'PHONEMAX[_ ]Saturn[_ ]X(?:[);/ ]|$)'
       model: 'Saturn X'
-    - regex: 'PHONEMAX[_ ]Saturn[);/ ]'
+    - regex: 'PHONEMAX[_ ]Saturn(?:[);/ ]|$)'
       model: 'Saturn'
-    - regex: 'PHONEMAX[_ ]Mars[);/ ]'
+    - regex: 'PHONEMAX[_ ]Mars(?:[);/ ]|$)'
       model: 'Mars'
 
 # Vipro (Vipro Mobile)
 Vipro:
-  regex: 'VIPRO[);/ ]'
+  regex: 'VIPRO(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'VIPRO PRO2X[);/ ]'
+    - regex: 'VIPRO PRO2X(?:[);/ ]|$)'
       model: 'Pro 2X'
-    - regex: 'VIPRO PRO[ _-]?([0-9])[);/ ]'
+    - regex: 'VIPRO PRO[ _-]?([0-9])(?:[);/ ]|$)'
       model: 'Pro $1'
 
 # OzoneHD
 OzoneHD:
-  regex: 'OzoneHD[ _](T2 WiFi|4K(?: TV)?)[);/ ]'
+  regex: 'OzoneHD[ _](T2 WiFi|4K(?: TV)?)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # KZEN
 Kzen:
-  regex: 'Ureki_U1[);/ ]'
+  regex: 'Ureki_U1(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'Ureki U1'
 
 # MELROSE
 Melrose:
-  regex: 'MELROSE_S9[);/ ]'
+  regex: 'MELROSE_(?:S9|2019)(?:[);/ ]|$)'
   device: 'smartphone'
-  model: 'S9'
+  models:
+    - regex: 'MELROSE_S9(?:[);/ ]|$)'
+      model: 'S9'
+    - regex: 'MELROSE_2019(?:[);/ ]|$)'
+      model: '2019 Ultra Slim 3.4"'
 
 # Crony
 Crony:
-  regex: 'CRONY-7021[);/ ]'
+  regex: 'CRONY-7021(?:[);/ ]|$)'
   device: 'tablet'
   model: '7021'
 
 # Takara
 Takara:
-  regex: '(MID211H)[);/ ]'
+  regex: '(MID211H)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Tronsmart
 Tronsmart:
-  regex: '(Orion R68G|Draco AW80|Draco H3|Vega S95_(?:Meta|Pro|Telos))[);/ ]'
+  regex: '(Orion R68G|Draco AW80|Draco H3|Vega S95_(?:Meta|Pro|Telos))(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # Amigoo
 Amigoo:
-  regex: 'AMIGOO (R300|R9 Max|M1 Max|X15)[);/ ]'
+  regex: 'AMIGOO (R300|R9 Max|M1 Max|X15)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Lumigon
 Lumigon:
-  regex: 'Lumigon[ _](T3)[);/ ]'
+  regex: 'Lumigon[ _](T3)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Neomi
 Neomi:
-  regex: 'NEO[ ]?(90[689])[);/ ]'
+  regex: 'NEO[ ]?(90[689])(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'Neo $1'
 
 # Eltex (eltex-co.ru)
 Eltex:
-  regex: '(?:NV501WAC|NV501)[);/ ]'
+  regex: '(?:NV501WAC|NV501)(?:[);/ ]|$)'
   device: 'tv'
   models:
-    - regex: 'NV501WAC[);/ ]'
+    - regex: 'NV501WAC(?:[);/ ]|$)'
       model: 'NV-501-Wac'
-    - regex: 'NV501[);/ ]'
+    - regex: 'NV501(?:[);/ ]|$)'
       model: 'NV-501'
 
 # Senkatel
 Senkatel:
-  regex: 'Senkatel[ _](T1009|T8002|T701[12]|T9702)[);/ ]'
+  regex: 'Senkatel[ _](T1009|T8002|T701[12]|T9702)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Bobarry
 Bobarry:
-  regex: '(?:K10[ ]?SE)[);/ ]'
+  regex: '(?:K10[ ]?SE)(?:[);/ ]|$)'
   device: 'tablet'
   model: 'K10 SE'
 
 # Wortmann
 Wortmann:
-  regex: 'TERRA PAD 1004[);/ ]'
+  regex: 'TERRA PAD 1004(?:[);/ ]|$)'
   device: 'tablet'
   model: 'Terra Pad 1004'
 
 # BB Mobile
 BB Mobile:
-  regex: 'Techno[_ ](TQ863Q|X595BT|S700BF|I700AJ|10.1 LTE TQ060X|7.0 LTE TQ763I)[);/ ]'
+  regex: 'Techno[_ ](TQ863Q|X595BT|S700BF|I700AJ|10.1 LTE TQ060X|7.0 LTE TQ763I)(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'Techno[_ ]S700BF[);/ ]'
+    - regex: 'Techno[_ ]S700BF(?:[);/ ]|$)'
       model: 'Techno 7.0" Pioneer LTE S700BF'
-    - regex: 'Techno[_ ]10.1 LTE TQ060X[);/ ]'
+    - regex: 'Techno[_ ]10.1 LTE TQ060X(?:[);/ ]|$)'
       model: 'Techno 10.0" LTE TQ060X'
-    - regex: 'Techno[_ ]TQ863Q[);/ ]'
+    - regex: 'Techno[_ ]TQ863Q(?:[);/ ]|$)'
       model: 'Techno 8.0" Poplar LTE TQ863Q'
-    - regex: 'Techno[_ ]I700AJ[);/ ]'
+    - regex: 'Techno[_ ]I700AJ(?:[);/ ]|$)'
       model: 'Techno 7.0" Mozg LTE I700AJ'
-    - regex: 'Techno[_ ]7.0 LTE TQ763I[);/ ]'
+    - regex: 'Techno[_ ]7.0 LTE TQ763I(?:[);/ ]|$)'
       model: 'Techno 7.0" Kalash LTE TQ763I'
 
-    - regex: 'Techno[_ ](X595BT)[);/ ]'
+    - regex: 'Techno[_ ](X595BT)(?:[);/ ]|$)'
       device: 'smartphone'
       model: 'Techno Spark 3G X595BT'
 
 # 2E (2e.ua)
 2E:
-  regex: '(?:E500A_2019|2E E450 2018)[);/ ]'
+  regex: '(?:E500A_2019|2E E450 2018)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'E500A_2019[);/ ]'
+    - regex: 'E500A_2019(?:[);/ ]|$)'
       model: 'E500A (2019)'
-    - regex: '2E E450 2018[);/ ]'
+    - regex: '2E E450 2018(?:[);/ ]|$)'
       model: 'E450 (2018)'
 
 # Billion
 Billion:
-  regex: 'Capture\+[);/ ]'
+  regex: 'Capture\+(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'Capture Plus'
 
 # Tele2 (mobile operator)
 Tele2:
-  regex: 'Tele2[ _](?:Mi[dn]i[ _][12][\._][10]|Mi[dn]i|Maxi(?:[ _](?:Plus|LTE))?)[);/ ]'
+  regex: 'Tele2[ _](?:Mi[dn]i[ _][12][\._][10]|Mi[dn]i|Maxi(?:[ _](?:Plus|LTE))?)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-      - regex: 'Tele2[ _]Mini[ _]1[_\.]1[);/ ]'
+      - regex: 'Tele2[ _]Mini[ _]1[_\.]1(?:[);/ ]|$)'
         model: 'Mini 1.1'
-      - regex: 'Tele2[ _]Midi[ _]2[_\.]0[);/ ]'
+      - regex: 'Tele2[ _]Midi[ _]2[_\.]0(?:[);/ ]|$)'
         model: 'Midi 2.0'
-      - regex: 'Tele2[ _](Maxi(?:[_ ](?:Plus|LTE))?)[);/ ]'
+      - regex: 'Tele2[ _](Maxi(?:[_ ](?:Plus|LTE))?)(?:[);/ ]|$)'
         model: '$1'
-      - regex: 'Tele2[ _](Midi[ _]1\.1|Mi[dn]i)[);/ ]'
+      - regex: 'Tele2[ _](Midi[ _]1\.1|Mi[dn]i)(?:[);/ ]|$)'
         model: '$1'
 
 # Alfawise
 Alfawise:
-  regex: '(A95X_R1)[);/ ]'
+  regex: '(A95X_R1)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # Klipad
 Klipad:
-  regex: '(KL-V905)[);/ ]'
+  regex: '(KL-V905)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # SQOOL (sqool.fr)
 SQOOL:
-  regex: 'SQOOL-V(41?)[);/ ]'
+  regex: 'SQOOL-V(41?)(?:[);/ ]|$)'
   device: 'tablet'
   model: 'V$1'
 
 # TurboKids
 TurboKids:
-  regex: 'Turbokids[-_ ]?(TMNT|3G|S4)[);/ ]'
+  regex: 'Turbokids[-_ ]?(TMNT|3G|S4)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Jinga
 Jinga:
-  regex: 'Jinga[-_ ]|(?:Optim4G|PassPlus)[);/ ]'
+  regex: 'Jinga[-_ ]|(?:Optim4G|PassPlus|Hotz[_ ]M1)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Optim4G[);/ ]'
+    - regex: 'Optim4G(?:[);/ ]|$)'
       model: 'Optim 4G'
-    - regex: 'PassPlus[);/ ]'
+    - regex: 'Hotz[_ ]M1(?:[);/ ]|$)'
+      model: 'Hotz M1'
+    - regex: 'PassPlus(?:[);/ ]|$)'
       model: 'Pass Plus'
-    - regex: 'Jinga Iron[);/ ]'
+    - regex: 'Jinga Iron(?:[);/ ]|$)'
       model: 'Iron'
-    - regex: 'Jinga Basco neo[);/ ]'
+    - regex: 'Jinga Basco neo(?:[);/ ]|$)'
       model: 'Basco Neo'
-    - regex: 'Jinga Basco L3[);/ ]'
+    - regex: 'Jinga Basco L3(?:[);/ ]|$)'
       model: 'Basco L3'
-    - regex: 'Jinga Trezor S1 Plus[);/ ]'
+    - regex: 'Jinga Trezor S1 Plus(?:[);/ ]|$)'
       model: 'Trezor S1 Plus'
-    - regex: 'JINGA_IGO_L2[);/ ]'
+    - regex: 'JINGA_IGO_L2(?:[);/ ]|$)'
       model: 'IGO L2'
-    - regex: 'JINGA_IGO_M1[);/ ]'
+    - regex: 'JINGA_IGO_M1(?:[);/ ]|$)'
       model: 'IGO M1'
-    - regex: 'Jinga Trezor S1 Plus[);/ ]'
+    - regex: 'Jinga Trezor S1 Plus(?:[);/ ]|$)'
       model: 'Trezor S1 Plus'
 
 # Twoe
 Twoe:
-  regex: 'TWOE[-_ ](E450R)[);/ ]'
+  regex: 'TWOE[-_ ](E450R)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # iTruck
 iTruck:
-  regex: 'iTRUCK 7 3G[);/ ]'
+  regex: 'iTRUCK 7 3G(?:[);/ ]|$)'
   device: 'smartphone'
   model: '7.0" 3G'
 
 # Torex
 Torex:
-  regex: 'TOREX-(PS12)[);/ ]'
+  regex: 'TOREX-(PS12)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Doffler
 Doffler:
-  regex: '(24DHS54)[);/ ]'
+  regex: '(24DHS54)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # Oyyu
 Oyyu:
-  regex: 'OYYUT11[);/ ]'
+  regex: 'OYYUT11(?:[);/ ]|$)'
   device: 'tablet'
   model: 'T11 3G'
 
@@ -16721,115 +17079,117 @@ Primux:
    regex: 'Primux'
    device: 'smartphone'
    models:
-     - regex: 'PrimuxDelta6[);/ ]'
+     - regex: 'PrimuxDelta6(?:[);/ ]|$)'
        model: 'Delta 6'
 
 # iMars
 iMars:
-  regex: 'IMARS VEGA X7[);/ ]'
+  regex: 'IMARS VEGA X7(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'Vega X7'
 
 # Logic
 Logic:
-  regex: 'LOGIC[_ ](X[135]|X4M|L5D|X5[AFT]|X60G)(:?[_ ]LITE2?)?[);/ ]'
+  regex: 'LOGIC[_ ](X[135]|X4M|L5D|X5[AFT]|X60G)(:?[_ ]LITE2?)?(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'LOGIC[_ ](X5|X4M)[_ ]LITE[);/ ]'
+    - regex: 'LOGIC[_ ](X5|X4M)[_ ]LITE(?:[);/ ]|$)'
       model: '$1 Lite'
-    - regex: 'LOGIC[_ ](X5)[_ ]LITE2[);/ ]'
+    - regex: 'LOGIC[_ ](X5)[_ ]LITE2(?:[);/ ]|$)'
       model: '$1 Lite 2'
-    - regex: 'LOGIC[_ ](X[13]|X4M|L5D|X5[AFT]|X60G)[);/ ]'
+    - regex: 'LOGIC[_ ](X[13]|X4M|L5D|X5[AFT]|X60G)(?:[);/ ]|$)'
       model: '$1'
 
 # Cloudfone
 Cloudfone:
-  regex: 'Thrill (?:Boost[ ]?(2|3)?|Snap|Access)[);/ ]'
+  regex: 'Thrill (?:Boost[ ]?(2|3)?|Snap|Access)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Thrill Boost (2|3)[);/ ]'
+    - regex: 'Thrill Boost (2|3)(?:[);/ ]|$)'
       model: 'Thrill Boost $1'
-    - regex: 'Thrill Boost[);/ ]'
+    - regex: 'Thrill Boost(?:[);/ ]|$)'
       model: 'Thrill Boost'
-    - regex: 'Thrill Snap[);/ ]'
+    - regex: 'Thrill Snap(?:[);/ ]|$)'
       model: 'Thrill Snap'
-    - regex: 'Thrill Access[);/ ]'
+    - regex: 'Thrill Access(?:[);/ ]|$)'
       model: 'Thrill Access'
 
 # Vsmart
 Vsmart:
-  regex: '(?:Joy 1\+|Active 1\+|Bee 3)[);/ ]'
+  regex: '(?:Joy 1\+|Active 1\+|Bee 3)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'Joy 1\+[);/ ]'
+    - regex: 'Joy 1\+(?:[);/ ]|$)'
       model: 'Joy 1 Plus'
-    - regex: 'Active 1\+[);/ ]'
+    - regex: 'Active 1\+(?:[);/ ]|$)'
       model: 'Active 1 Plus'
-    - regex: 'Bee 3[);/ ]'
+    - regex: 'Bee 3(?:[);/ ]|$)'
       model: 'Bee 3'
 
 # MiXzo
 MiXzo:
-  regex: '(?:MiXzo )?(?:ME1030|MX1037|MX1041)[ _][34]G[);/ ]'
+  regex: '(?:MiXzo )?(?:ME1030|MX1037|MX1041)[ _][34]G(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'MiXzo ME1030[_ ]3G[);/ ]'
+    - regex: 'MiXzo ME1030[_ ]3G(?:[);/ ]|$)'
       model: 'ME1030 3G'
-    - regex: '(?:MiXzo )?MX1041[ _]4G[);/ ]'
+    - regex: '(?:MiXzo )?MX1041[ _]4G(?:[);/ ]|$)'
       model: 'MX1041 4G'
-    - regex: '(?:MiXzo )?MX1037[ _]4G[);/ ]'
+    - regex: '(?:MiXzo )?MX1037[ _]4G(?:[);/ ]|$)'
       model: 'MX1037 4G'
 
 # Openbox
 Openbox:
-  regex: 'Openbox (A[34](?: (?:Pro|Lite))?)[);/ ]'
+  regex: 'Openbox (A[34](?: (?:Pro|Lite))?)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # Ziox
 Ziox:
-  regex: 'ZIOX[_ ]|(?:Astra Viva 4G)[);/ ]'
+  regex: 'ZIOX[_ ]|(?:Astra Viva 4G|Astra NXT Pro)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'ZIOX_F9_PRO[);/ ]'
+    - regex: 'ZIOX_F9_PRO(?:[);/ ]|$)'
       model: 'F9 Pro'
-    - regex: 'Astra Viva 4G[);/ ]'
+    - regex: 'Astra Viva 4G(?:[);/ ]|$)'
       model: 'Astra Viva 4G'
+    - regex: 'Astra NXT Pro(?:[);/ ]|$)'
+      model: 'Astra NXT Pro'
 
 # iDroid
 iDroid:
-  regex: 'APACHE G6[);/ ]'
+  regex: 'APACHE G6(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'Apache G6'
 
 # Aoson
 Aoson:
-  regex: 'aoson(?:R10[1-3]|S[78]|M707TG)(?:[_ ]?Pro)?[);/ ]'
+  regex: 'aoson(?:R10[1-3]|S[78]|M707TG)(?:[_ ]?Pro)?(?:[);/ ]|$)'
   device: 'tablet'
   models:
-    - regex: 'aosonR10([1-3])[);/ ]'
+    - regex: 'aosonR10([1-3])(?:[);/ ]|$)'
       model: 'R10$1 10.1"'
-    - regex: 'aosonS7_Pro[);/ ]'
+    - regex: 'aosonS7_Pro(?:[);/ ]|$)'
       model: 'S7 Pro 7.0"'
-    - regex: 'aosonS7[);/ ]'
+    - regex: 'aosonS7(?:[);/ ]|$)'
       model: 'S7 7.0"'
-    - regex: 'aosonS8Pro[);/ ]'
+    - regex: 'aosonS8Pro(?:[);/ ]|$)'
       model: 'S8 Pro 8.0"'
-    - regex: 'aoson(M707TG)[);/ ]'
+    - regex: 'aoson(M707TG)(?:[);/ ]|$)'
       model: '$1'
 
 # FireFly Mobile
 FireFly Mobile:
-  regex: '(AURII[ _](?:Passion|Virtuoso|Secret Lite|FORCE|FUSION|F8[_ ]Premium|XCITE))[);/ ]'
+  regex: '(AURII[ _](?:Passion|Virtuoso|Secret Lite|FORCE|FUSION|F8[_ ]Premium|XCITE))(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'AURII[ _]FORCE[);/ ]'
+    - regex: 'AURII[ _]FORCE(?:[);/ ]|$)'
       model: 'AURII Force'
-    - regex: 'AURII[ _]FUSION[);/ ]'
+    - regex: 'AURII[ _]FUSION(?:[);/ ]|$)'
       model: 'AURII Fusion'
-    - regex: 'AURII[ _]XCITE[);/ ]'
+    - regex: 'AURII[ _]XCITE(?:[);/ ]|$)'
       model: 'AURII xCite'
-    - regex: '(AURII[ _](?:Passion|Virtuoso|Secret Lite|F8[_ ]Premium))[);/ ]'
+    - regex: '(AURII[ _](?:Passion|Virtuoso|Secret Lite|F8[_ ]Premium))(?:[);/ ]|$)'
       model: '$1'
 
 # i-Cherry or iCherry
@@ -16837,137 +17197,137 @@ i-Cherry:
   regex: 'iCherry_?'
   device: 'smartphone'
   models:
-     - regex: 'iCherry[ _]C(25[125]|21[16]|110|121|22[079]|23[03])[);/ ]'
+     - regex: 'iCherry[ _]C(25[125]|21[16]|110|121|22[079]|23[03])(?:[);/ ]|$)'
        model: 'C$1'
 
 # NextTab
 NextTab:
-  regex: 'TAB (A40[13]0)[);/ ]'
+  regex: 'TAB (A40[13]0)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Time 2
 Time2:
- regex: '(TC1050G)[);/ ]'
+ regex: '(TC1050G)(?:[);/ ]|$)'
  device: 'tablet'
  model: '$1 10.1"'
 
 # Sunstech
 Sunstech:
-  regex: '(TAB2323GMQC)[);/ ]'
+  regex: '(TAB2323GMQC)(?:[);/ ]|$)'
   device: 'tablet'
   model: '$1'
 
 # Hotwav
 Hotwav:
-  regex: '(Venus[_ ]X1[024569])[);/ ]'
+  regex: '(Venus[_ ]X1[024569]|Pearl K2)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # Tetratab
 Tetratab:
-  regex: 'CASEBOOK_3[);/ ]'
+  regex: 'CASEBOOK_3(?:[);/ ]|$)'
   device: 'tablet'
   model: 'Casebook 3'
 
 # Dolamee
 Dolamee:
-  regex: 'Dolamee[_ -](D[56])[);/ ]'
+  regex: 'Dolamee[_ -](D[56])(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # INVIN
 Invin:
-  regex: 'INVIN[ _-](X[24]|KM6)[);/ ]'
+  regex: 'INVIN[ _-](X[24]|KM6)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # Doopro
 Doopro:
-  regex: 'Doopro P3[);/ ]'
+  regex: 'Doopro P3(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'P3'
 
 # IQM
 IQM:
-  regex: 'IQM (?:picasso|vivaldi|newton)[);/ ]'
+  regex: 'IQM (?:picasso|vivaldi|newton)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'IQM picasso[);/ ]'
+    - regex: 'IQM picasso(?:[);/ ]|$)'
       model: 'Picasso'
-    - regex: 'IQM vivaldi[);/ ]'
+    - regex: 'IQM vivaldi(?:[);/ ]|$)'
       model: 'Vivaldi'
-    - regex: 'IQM newton[);/ ]'
+    - regex: 'IQM newton(?:[);/ ]|$)'
       model: 'Newton'
 
 # Nos
 Nos:
-  regex: 'Nos (?:FIVE|NOVU|NEVA|Roya)[);/ ]'
+  regex: 'Nos (?:FIVE|NOVU|NEVA|Roya)(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'NOS FIVE[);/ ]'
+    - regex: 'NOS FIVE(?:[);/ ]|$)'
       model: 'Five'
-    - regex: 'NOS NOVU III[);/ ]'
+    - regex: 'NOS NOVU III(?:[);/ ]|$)'
       model: 'Novu III'
-    - regex: 'NOS NOVU II[);/ ]'
+    - regex: 'NOS NOVU II(?:[);/ ]|$)'
       model: 'Novu II'
-    - regex: 'NOS NOVU[);/ ]'
+    - regex: 'NOS NOVU(?:[);/ ]|$)'
       model: 'Novu'
-    - regex: 'NOS NEVA 80[);/ ]'
+    - regex: 'NOS NEVA 80(?:[);/ ]|$)'
       model: 'Neva 80'
-    - regex: 'NOS Roya[);/ ]'
+    - regex: 'NOS Roya(?:[);/ ]|$)'
       model: 'Roya'
 
 # Accent
 Accent:
-  regex: 'ACCENT_NEON[);/ ]'
+  regex: 'ACCENT_NEON(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'Neon'
 
 # Avenzo (www.avenzo.es)
 Avenzo:
-  regex: 'Avenzo[);/ ]'
+  regex: 'Avenzo(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'MOB4 4G[);/ ]'
+    - regex: 'MOB4 4G(?:[);/ ]|$)'
       model: 'Mob 4 4G'
-    - regex: 'MOB4PRO 4G[);/ ]'
+    - regex: 'MOB4PRO 4G(?:[);/ ]|$)'
       model: 'Mob 4 Pro 4G'
 
 # Beelink
 Beelink:
-  regex: 'Beelink (GT1|LAKE I|SEA I|A1)[);/ ]'
+  regex: 'Beelink (GT1|LAKE I|SEA I|A1)(?:[);/ ]|$)'
   device: 'tv'
   model: '$1'
 
 # MAXVI
 MAXVI:
-  regex: 'MAXVI[ _](MS401)[);/ ]'
+  regex: 'MAXVI[ _](MS401)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
 # meanIT (meanit.hr)
 meanIT:
-  regex: 'meanIT[ _](?:C[12]|X10|X[126]|MG430|Q[145])[);/ ]'
+  regex: 'meanIT[ _](?:C[12]|X10|X[126]|MG430|Q[145])(?:[);/ ]|$)'
   device: 'smartphone'
   models:
-    - regex: 'meanIT[ _]Q1 plus[);/ ]'
+    - regex: 'meanIT[ _]Q1 plus(?:[);/ ]|$)'
       model: 'Q1 Plus'
-    - regex: 'meanIT[ _](C[12]|X[126]|MG430|Q[145])[);/ ]'
+    - regex: 'meanIT[ _](C[12]|X[126]|MG430|Q[145])(?:[);/ ]|$)'
       model: '$1'
-    - regex: 'meanIT[ _]X10[);/ ]'
+    - regex: 'meanIT[ _]X10(?:[);/ ]|$)'
       device: 'tablet'
       model: 'X10'
 
 # Kenxinda
 Kenxinda:
-  regex: 'Three[_ ]Proofings[_ ]W([5-9])[);/ ]'
+  regex: 'Three[_ ]Proofings[_ ]W([5-9])(?:[);/ ]|$)'
   device: 'smartphone'
   model: 'Three Proofings W$1'
 
 # X-BO or XBO
 X-BO:
-  regex: 'X[-]?BO (V[78]|V1[01]|V[89]\+)[);/ ]'
+  regex: 'X[-]?BO (V[78]|V1[01]|V[89]\+)(?:[);/ ]|$)'
   device: 'smartphone'
   model: '$1'
 
@@ -16976,9 +17336,66 @@ Xgody:
   regex: 'XGODY'
   device: 'smartphone'
   models:
-    - regex: 'XGODY Y17[);/ ]'
+    - regex: 'XGODY Y17(?:[);/ ]|$)'
       model: 'Y17'
 
-    - regex: 'XGODY_X96[);/ ]'
+    - regex: 'XGODY_X96(?:[);/ ]|$)'
       model: 'X96'
       device: 'tv'
+
+
+# Alcor (alcordigital)
+Alcor:
+  regex: '(Access_Q784C)(?:[);/ ]|$)'
+  device: 'tablet'
+  model: '$1'
+
+# iBrit
+iBrit:
+  regex: 'IBRIT_'
+  device: 'smartphone'
+  models:
+    - regex: 'IBRIT_I([57])(?:[);/ ]|$)'
+      model: 'I$1'
+    - regex: 'iBRIT_POWER6(?:[);/ ]|$)'
+      model: 'Power 6'
+    - regex: 'iBRIT_Speed Pro(?:[);/ ]|$)'
+      model: 'Speed Pro'
+
+# Ovvi
+Ovvi:
+  regex: 'Jumbo X1'
+  device: 'smartphone'
+  model: 'Jumbo X1'
+
+# Fero
+Fero:
+  regex: 'Fero_|Royale_X2'
+  device: 'smartphone'
+  models:
+    - regex: 'Fero_Y1'
+      model: 'Y1'
+    - regex: 'Royale_X2'
+      model: 'Royale X2'
+
+# Transpeed
+Transpeed:
+  regex: 'Transpeed_|(?:TR99 MINI\+|TR99)(?:[);/ ]|$)'
+  device: 'tv'
+  models:
+    - regex: 'TR99 MINI\+'
+      model: 'TR99 Mini Plus'
+    - regex: '(?:Transpeed_)?(TR99|6K)(?:[);/ ]|$)'
+      model: '$1'
+
+# 8848 (everest 8848, 8848 titanium)
+8848:
+  regex: '8848 (M[3-6])(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: '$1'
+
+# VVETIME
+VVETIME:
+  regex: 'ZYVV1(?:[);/ ]|$)'
+  device: 'smartphone'
+  model: 'V1'
diff --git a/priv/ua_inspector/device.notebooks.yml b/priv/ua_inspector/device.notebooks.yml
new file mode 100644
index 0000000000000000000000000000000000000000..860cd995bfd582a004ef577800ff51e47a75ed68
--- /dev/null
+++ b/priv/ua_inspector/device.notebooks.yml
@@ -0,0 +1,114 @@
+###############
+# Device Detector - The Universal Device Detection library for parsing User Agents
+#
+# @link https://matomo.org
+# @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
+###############
+
+Acer:
+  regex: 'FBMD/(?:Aspire E5-421G|Z5WAL|One S1003);'
+  device: 'desktop'
+  models:
+    - regex: 'FBMD/Aspire E5-421G;'
+      model: 'Aspire E5-421G'
+    - regex: 'FBMD/Z5WAL;'
+      model: 'Aspire E5-511'
+    - regex: 'FBMD/One S1003;'
+      model: 'One 10'
+
+Asus:
+  regex: 'FBMD/(?:K50IN|K54L|T100HAN|T103HAF|UX360CAK|X550LB|X553MA|X555LN|X556UQK);'
+  device: 'desktop'
+  models:
+    - regex: 'FBMD/K50IN;'
+      model: 'K50IN'
+    - regex: 'FBMD/K54L;'
+      model: 'K54L'
+    - regex: 'FBMD/T100HAN;'
+      model: 'Transformer Book'
+    - regex: 'FBMD/T103HAF;'
+      model: 'Transformer Mini'
+    - regex: 'FBMD/UX360CAK;'
+      model: 'ZenBook Flip'
+    - regex: 'FBMD/X550LB;'
+      model: 'X550LB'
+    - regex: 'FBMD/X553MA;'
+      model: 'X553MA'
+    - regex: 'FBMD/X555LN;'
+      model: 'X555LN'
+    - regex: 'FBMD/X556UQK;'
+      model: 'X556UQK'
+
+Dell:
+  regex: 'FBMD/(?:Latitude E4300|Inspiron 3541|XPS 15 95[35]0);'
+  device: 'desktop'
+  models:
+    - regex: 'Latitude E4300'
+      model: 'Latitude E4300'
+    - regex: 'Inspiron 3541'
+      model: 'Inspiron 3541'
+    - regex: 'XPS 15 9530'
+      model: 'XPS 15 9530'
+    - regex: 'XPS 15 9550'
+      model: 'XPS 15 9550'
+
+HP:
+  regex: 'FBMD/((?:Compaq|HP) |23-f364)'
+  device: 'desktop'
+  models:
+    - regex: 'Compaq Presario CQ61 Notebook PC'
+      model: 'Compaq Presario CQ61'
+    - regex: 'HP Pavilion x2 Detachable'
+      model: 'Pavilion x2'
+    - regex: 'HP Laptop 15-bs0xx'
+      model: '15 Laptop PC'
+    - regex: 'HP ENVY x360 Convertible 15-bp0xx'
+      model: 'ENVY x360 Convertible PC'
+    - regex: 'HP EliteBook (25[67]0p)'
+      model: 'EliteBook $1'
+    - regex: 'HP ProBook (440 G5|6[35]60b)'
+      model: 'ProBook $1'
+    - regex: 'HP Pavilion dv6 Notebook PC'
+      model: 'Pavilion dv6'
+    - regex: 'HP Pavilion Notebook'
+      model: 'Pavilion'
+    - regex: 'HP Spectre x360 Convertible'
+      model: 'Spectre x360'
+    - regex: 'HP Pavilion All-in-One 24-r0xx'
+      model: 'Pavilion 24-r0xx All-in-One Desktop PC'
+      device: 'desktop'
+    - regex: '23-f364'
+      model: 'Pavilion TouchSmart 23-f364 All-in-One Desktop PC'
+      device: 'desktop'
+
+Lenovo:
+  regex: 'FBMD/(?:37021C5|80E5|80SM|80VR);'
+  device: 'desktop'
+  models:
+    - regex: 'FBMD/37021C5;'
+      model: 'ThinkPad Helix 3702'
+    - regex: 'FBMD/80E5;'
+      model: 'G50-80'
+    - regex: 'FBMD/80SM;'
+      model: 'Ideapad 310-15ISK'
+    - regex: 'FBMD/80VR;'
+      model: 'Legion Y720'
+
+Schneider:
+  regex: 'FBMD/SCL141CTP;'
+  device: 'desktop'
+  model: 'Notebook 14" Cherry Trail'
+
+Thomson:
+  regex: 'FBMD/TH360R12.32CTW;'
+  device: 'desktop'
+  model: 'Prestige TH-360R12.32CTW'
+
+Toshiba:
+  regex: 'FBMD/Satellite '
+  device: 'desktop'
+  models:
+    - regex: 'Satellite (A[25]00|C650|C855|L650|S855)'
+      model: 'Satellite $1'
+    - regex: 'Satellite ([^;\)]+);'
+      model: 'Satellite $1'
diff --git a/priv/ua_inspector/os.oss.yml b/priv/ua_inspector/os.oss.yml
index 447f9d0b3733871d11e98a64f1eefaa989625c9e..c2f01dd9998aad432febe9550298a32624eadff8 100644
--- a/priv/ua_inspector/os.oss.yml
+++ b/priv/ua_inspector/os.oss.yml
@@ -98,6 +98,10 @@
 ##########
 # Android
 ##########
+- regex: 'Android; (\d+[\.\d]*); Mobile;'
+  name: 'Android'
+  version: '$1'
+
 - regex: '[ ]([\d\.]+)\) AppleWebKit.*ROBLOX Android App'
   name: 'Android'
   version: '$1'
diff --git a/priv/ua_inspector/short_codes.browser_families.yml b/priv/ua_inspector/short_codes.browser_families.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f8ac065bf0b00be30988d328e729185fab005ed1
--- /dev/null
+++ b/priv/ua_inspector/short_codes.browser_families.yml
@@ -0,0 +1,144 @@
+- "Android Browser":
+  - "AN"
+  - "MU"
+- "BlackBerry Browser":
+  - "BB"
+- "Baidu":
+  - "BD"
+  - "BS"
+- "Amiga":
+  - "AV"
+  - "AW"
+- "Chrome":
+  - "CH"
+  - "BA"
+  - "BR"
+  - "CC"
+  - "CD"
+  - "CM"
+  - "CI"
+  - "CF"
+  - "CN"
+  - "CR"
+  - "CP"
+  - "DD"
+  - "IR"
+  - "RM"
+  - "AO"
+  - "TS"
+  - "VI"
+  - "PT"
+  - "AS"
+  - "TB"
+  - "AD"
+  - "SB"
+  - "WP"
+  - "I3"
+  - "CV"
+  - "WH"
+  - "SZ"
+  - "QW"
+  - "LF"
+  - "KW"
+  - "2B"
+  - "CE"
+  - "EC"
+  - "MT"
+  - "MS"
+  - "HA"
+  - "OC"
+  - "MZ"
+  - "BM"
+  - "KN"
+  - "SW"
+  - "M1"
+  - "FA"
+  - "TA"
+  - "AH"
+  - "CL"
+  - "SU"
+  - "EU"
+  - "UB"
+  - "LO"
+  - "VG"
+  - "TV"
+  - "A0"
+  - "1B"
+  - "S4"
+  - "EE"
+  - "AE"
+  - "VM"
+  - "O0"
+  - "TG"
+  - "GB"
+  - "SY"
+  - "HH"
+  - "YJ"
+  - "LL"
+  - "TU"
+  - "XV"
+  - "C2"
+  - "QU"
+  - "YN"
+- "Firefox":
+  - "FF"
+  - "FE"
+  - "FM"
+  - "SX"
+  - "FB"
+  - "PX"
+  - "MB"
+  - "EI"
+  - "WF"
+  - "CU"
+  - "TF"
+  - "QM"
+  - "FR"
+  - "I4"
+  - "GZ"
+  - "MO"
+  - "F1"
+  - "BI"
+  - "MN"
+  - "BH"
+  - "TO"
+  - "OS"
+  - "MY"
+  - "FY"
+  - "AX"
+  - "C0"
+  - "LH"
+  - "S5"
+  - "ZV"
+  - "IW"
+- "Internet Explorer":
+  - "IE"
+  - "IM"
+  - "PS"
+- "Konqueror":
+  - "KO"
+- "NetFront":
+  - "NF"
+- "NetSurf":
+  - "NE"
+- "Nokia Browser":
+  - "NB"
+  - "NO"
+  - "NV"
+  - "DO"
+- "Opera":
+  - "OP"
+  - "OM"
+  - "OI"
+  - "ON"
+  - "OO"
+  - "OG"
+  - "OH"
+  - "O1"
+  - "OX"
+- "Safari":
+  - "SF"
+  - "MF"
+  - "SO"
+- "Sailfish Browser":
+  - "SA"
diff --git a/priv/ua_inspector/short_codes.device_brands.yml b/priv/ua_inspector/short_codes.device_brands.yml
index 2cc47a84befa70e0f87515eefc6f29590d700917..7c62163bda64870b3d269003ab6f52011811db77 100644
--- a/priv/ua_inspector/short_codes.device_brands.yml
+++ b/priv/ua_inspector/short_codes.device_brands.yml
@@ -1,8 +1,10 @@
 - "36": "360"
+- "88": "8848"
 - "3Q": "3Q"
 - "4G": "4Good"
 - "AE": "Ace"
 - "AA": "AllCall"
+- "3A": "AllDocube"
 - "AC": "Acer"
 - "00": "Accent"
 - "A9": "Advan"
@@ -15,8 +17,8 @@
 - "AK": "Akai"
 - "1A": "Alba"
 - "AL": "Alcatel"
+- "20": "Alcor"
 - "4A": "Aligator"
-- "3A": "AllDocube"
 - "A2": "Allview"
 - "A7": "Allwinner"
 - "A1": "Altech UEC"
@@ -193,6 +195,7 @@
 - "FL": "Fly"
 - "F1": "FinePower"
 - "FT": "Freetel"
+- "F7": "Fero"
 - "FR": "Forstar"
 - "FO": "Foxconn"
 - "F2": "FORME"
@@ -248,6 +251,7 @@
 - "IJ": "i-Joy"
 - "IC": "iDroid"
 - "IY": "iBerry"
+- "7I": "iBrit"
 - "IH": "iHunt"
 - "IK": "iKoMo"
 - "IE": "iView"
@@ -458,6 +462,7 @@
 - "OU": "OUYA"
 - "OO": "Opsson"
 - "OV": "Overmax"
+- "30": "Ovvi"
 - "OY": "Oysters"
 - "O6": "Oyyu"
 - "OW": "öwn"
@@ -591,6 +596,7 @@
 - "TA": "Tesla"
 - "TK": "Takara"
 - "4T": "Tronsmart"
+- "5R": "Transpeed"
 - "T5": "TB Touch"
 - "TC": "TCL"
 - "T7": "Teclast"
@@ -667,6 +673,7 @@
 - "VL": "Verykool"
 - "V6": "VGO TEL"
 - "VV": "Vivo"
+- "3V": "VVETIME"
 - "VX": "Vertex"
 - "V3": "Vinsoc"
 - "V2": "Vonino"