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