"Fossies" - the Fresh Open Source Software Archive

Member "elasticsearch-6.8.23/modules/ingest-user-agent/src/main/resources/regexes.yml" (29 Dec 2021, 162799 Bytes) of package /linux/www/elasticsearch-6.8.23-src.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Ansible YAML source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

A hint: This file contains one or more very long lines, so maybe it is better readable using the pure text view mode that shows the contents as wrapped lines within the browser window.


    1 # Apache License, Version 2.0
    2 # ===========================
    3 #
    4 # Copyright 2009 Google Inc.
    5 #
    6 # Licensed under the Apache License, Version 2.0 (the "License");
    7 # you may not use this file except in compliance with the License.
    8 # You may obtain a copy of the License at
    9 #
   10 #     http://www.apache.org/licenses/LICENSE-2.0
   11 #
   12 # Unless required by applicable law or agreed to in writing, software
   13 # distributed under the License is distributed on an "AS IS" BASIS,
   14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   15 # See the License for the specific language governing permissions and
   16 # limitations under the License.
   17 
   18 user_agent_parsers:
   19   #### SPECIAL CASES TOP ####
   20 
   21   # @note: iOS / OSX Applications
   22   - regex: '(CFNetwork)(?:/(\d+)\.(\d+)\.?(\d+)?)?'
   23     family_replacement: 'CFNetwork'
   24 
   25   # Pingdom
   26   - regex: '(Pingdom.com_bot_version_)(\d+)\.(\d+)'
   27     family_replacement: 'PingdomBot'
   28     # 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PingdomTMS/0.8.5 Safari/534.34'
   29   - regex: '(PingdomTMS)/(\d+)\.(\d+)\.(\d+)'
   30     family_replacement: 'PingdomBot'
   31 
   32   #StatusCake
   33   - regex: '(\(StatusCake\))'
   34     family_replacement: 'StatusCakeBot'
   35 
   36   # Facebook
   37   - regex: '(facebookexternalhit)/(\d+)\.(\d+)'
   38     family_replacement: 'FacebookBot'
   39 
   40   # Google Plus
   41   - regex: 'Google.*/\+/web/snippet'
   42     family_replacement: 'GooglePlusBot'
   43 
   44   # Gmail
   45   - regex: 'via ggpht.com GoogleImageProxy'
   46     family_replacement: 'GmailImageProxy'
   47 
   48   # Twitter
   49   - regex: '(Twitterbot)/(\d+)\.(\d+)'
   50     family_replacement: 'TwitterBot'
   51 
   52   # Bots Pattern '/name-0.0'
   53   - regex: '/((?:Ant-)?Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \-](\d+)(?:\.(\d+)(?:\.(\d+))?)?'
   54   # Bots Pattern 'name/0.0'
   55   - 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+))?)?'
   56 
   57   # MSIECrawler
   58   - regex: '(MSIE) (\d+)\.(\d+)([a-z]\d?)?;.* MSIECrawler'
   59     family_replacement: 'MSIECrawler'
   60 
   61   # Downloader ...
   62   - regex: '(Google-HTTP-Java-Client|Apache-HttpClient|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp)(?:[ /](\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
   63 
   64   # Bots
   65   - regex: '(1470\.net crawler|50\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]+-Agent|AdsBot-Google(?:-[a-z]+)?|altavista|AppEngine-Google|archive.*?\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]+)*|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader(?: [A-Za-z]+)*|boitho.com-dc|BotSeer|\b\w*favicon\w*\b|\bYeti(?:-[a-z]+)?|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]+-)?Googlebot(?:-[a-zA-Z]+)?|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]+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 .*? Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media *)?|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]*|^NING|Nutch[^/]*|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|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]+|WhatWeb|WIRE|WordPress|Wotbox|www\.almaden\.ibm\.com|Xenu(?:.s)? Link Sleuth|Xerka [A-z]+Bot|yacy(?:bot)?|Yahoo[a-z]*Seeker|Yahoo! Slurp|Yandex\w+|YodaoBot(?:-[A-z]+)?|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\.ze\.bz|ZooShot|ZyBorg)(?:[ /]v?(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
   66 
   67   # Bots General matcher 'name/0.0'
   68   - regex: '(?:\/[A-Za-z0-9\.]+)? *([A-Za-z0-9 \-_\!\[\]:]*(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]*))/(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
   69   # Bots General matcher 'name 0.0'
   70   - regex: '(?:\/[A-Za-z0-9\.]+)? *([A-Za-z0-9 _\!\[\]:]*(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]*)) (\d+)(?:\.(\d+)(?:\.(\d+))?)?'
   71   # Bots containing spider|scrape|bot(but not CUBOT)|Crawl
   72   - regex: '((?:[A-z0-9]+|[A-z\-]+ ?)?(?: the )?(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[A-Za-z0-9-]*(?:[^C][^Uu])[Bb]ot|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]*)(?:(?:[ /]| v)(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
   73 
   74   # HbbTV standard defines what features the browser should understand.
   75   # but it's like targeting "HTML5 browsers", effective browser support depends on the model
   76   # See os_parsers if you want to target a specific TV
   77   - regex: '(HbbTV)/(\d+)\.(\d+)\.(\d+) \('
   78 
   79   # must go before Firefox to catch Chimera/SeaMonkey/Camino
   80   - regex: '(Chimera|SeaMonkey|Camino)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)?'
   81 
   82   # Social Networks
   83   # Facebook
   84   - regex: '\[FB.*;(FBAV)/(\d+)(?:\.(\d+)(?:\.(\d)+)?)?'
   85     family_replacement: 'Facebook'
   86   # Pinterest
   87   - regex: '\[(Pinterest)/[^\]]+\]'
   88   - regex: '(Pinterest)(?: for Android(?: Tablet)?)?/(\d+)(?:\.(\d+)(?:\.(\d)+)?)?'
   89 
   90   # Pale Moon
   91   - regex: '(PaleMoon)/(\d+)\.(\d+)\.?(\d+)?'
   92     family_replacement: 'Pale Moon'
   93 
   94   # Firefox
   95   - regex: '(Fennec)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)'
   96     family_replacement: 'Firefox Mobile'
   97   - regex: '(Fennec)/(\d+)\.(\d+)(pre)'
   98     family_replacement: 'Firefox Mobile'
   99   - regex: '(Fennec)/(\d+)\.(\d+)'
  100     family_replacement: 'Firefox Mobile'
  101   - regex: '(?:Mobile|Tablet);.*(Firefox)/(\d+)\.(\d+)'
  102     family_replacement: 'Firefox Mobile'
  103   - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre)?)'
  104     family_replacement: 'Firefox ($1)'
  105   - regex: '(Firefox)/(\d+)\.(\d+)(a\d+[a-z]*)'
  106     family_replacement: 'Firefox Alpha'
  107   - regex: '(Firefox)/(\d+)\.(\d+)(b\d+[a-z]*)'
  108     family_replacement: 'Firefox Beta'
  109   - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(a\d+[a-z]*)'
  110     family_replacement: 'Firefox Alpha'
  111   - regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)(b\d+[a-z]*)'
  112     family_replacement: 'Firefox Beta'
  113   - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
  114     family_replacement: 'Firefox ($1)'
  115   - regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
  116     family_replacement: 'MicroB'
  117   - regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
  118   - regex: '(FxiOS)/(\d+)\.(\d+)(\.(\d+))?(\.(\d+))?'
  119     family_replacement: 'Firefox iOS'
  120 
  121   # e.g.: Flock/2.0b2
  122   - regex: '(Flock)/(\d+)\.(\d+)(b\d+?)'
  123 
  124   # RockMelt
  125   - regex: '(RockMelt)/(\d+)\.(\d+)\.(\d+)'
  126 
  127   # e.g.: Fennec/0.9pre
  128   - regex: '(Navigator)/(\d+)\.(\d+)\.(\d+)'
  129     family_replacement: 'Netscape'
  130 
  131   - regex: '(Navigator)/(\d+)\.(\d+)([ab]\d+)'
  132     family_replacement: 'Netscape'
  133 
  134   - regex: '(Netscape6)/(\d+)\.(\d+)\.?([ab]?\d+)?'
  135     family_replacement: 'Netscape'
  136 
  137   - regex: '(MyIBrow)/(\d+)\.(\d+)'
  138     family_replacement: 'My Internet Browser'
  139 
  140   # UC Browser
  141   # we need check it before opera. In other case case UC Browser detected look like Opera Mini
  142   - regex: '(UC? ?Browser|UCWEB|U3)[ /]?(\d+)\.(\d+)\.(\d+)'
  143     family_replacement: 'UC Browser'
  144 
  145   # Opera will stop at 9.80 and hide the real version in the Version string.
  146   # see: http://dev.opera.com/articles/view/opera-ua-string-changes/
  147   - regex: '(Opera Tablet).*Version/(\d+)\.(\d+)(?:\.(\d+))?'
  148   - regex: '(Opera Mini)(?:/att)?/?(\d+)?(?:\.(\d+))?(?:\.(\d+))?'
  149   - regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
  150     family_replacement: 'Opera Mobile'
  151   - regex: '(Opera)/(\d+)\.(\d+).+Opera Mobi'
  152     family_replacement: 'Opera Mobile'
  153   - regex: 'Opera Mobi.+(Opera)(?:/|\s+)(\d+)\.(\d+)'
  154     family_replacement: 'Opera Mobile'
  155   - regex: 'Opera Mobi'
  156     family_replacement: 'Opera Mobile'
  157   - regex: '(Opera)/9.80.*Version/(\d+)\.(\d+)(?:\.(\d+))?'
  158 
  159   # Opera 14 for Android uses a WebKit render engine.
  160   - regex: '(?:Mobile Safari).*(OPR)/(\d+)\.(\d+)\.(\d+)'
  161     family_replacement: 'Opera Mobile'
  162 
  163   # Opera >=15 for Desktop is similar to Chrome but includes an "OPR" Version string.
  164   - regex: '(?:Chrome).*(OPR)/(\d+)\.(\d+)\.(\d+)'
  165     family_replacement: 'Opera'
  166 
  167   # Opera Coast
  168   - regex: '(Coast)/(\d+).(\d+).(\d+)'
  169     family_replacement: 'Opera Coast'
  170 
  171   # Opera Mini for iOS (from version 8.0.0)
  172   - regex: '(OPiOS)/(\d+).(\d+).(\d+)'
  173     family_replacement: 'Opera Mini'
  174 
  175   # Opera Neon
  176   - regex: 'Chrome/.+( MMS)/(\d+).(\d+).(\d+)'
  177     family_replacement: 'Opera Neon'
  178 
  179   # Palm WebOS looks a lot like Safari.
  180   - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
  181     family_replacement: 'webOS Browser'
  182 
  183   # LuaKit has no version info.
  184   # http://luakit.org/projects/luakit/
  185   - regex: '(luakit)'
  186     family_replacement: 'LuaKit'
  187 
  188   # Snowshoe
  189   - regex: '(Snowshoe)/(\d+)\.(\d+).(\d+)'
  190 
  191   # Lightning (for Thunderbird)
  192   # http://www.mozilla.org/projects/calendar/lightning/
  193   - regex: 'Gecko/\d+ (Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))'
  194 
  195   # Swiftfox
  196   - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)?) \(Swiftfox\)'
  197     family_replacement: 'Swiftfox'
  198   - regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*)? \(Swiftfox\)'
  199     family_replacement: 'Swiftfox'
  200 
  201   # Rekonq
  202   - regex: '(rekonq)/(\d+)\.(\d+)\.?(\d+)? Safari'
  203     family_replacement: 'Rekonq'
  204   - regex: 'rekonq'
  205     family_replacement: 'Rekonq'
  206 
  207   # Conkeror lowercase/uppercase
  208   # http://conkeror.org/
  209   - regex: '(conkeror|Conkeror)/(\d+)\.(\d+)\.?(\d+)?'
  210     family_replacement: 'Conkeror'
  211 
  212   # catches lower case konqueror
  213   - regex: '(konqueror)/(\d+)\.(\d+)\.(\d+)'
  214     family_replacement: 'Konqueror'
  215 
  216   - regex: '(WeTab)-Browser'
  217 
  218   - regex: '(Comodo_Dragon)/(\d+)\.(\d+)\.(\d+)'
  219     family_replacement: 'Comodo Dragon'
  220 
  221   - regex: '(Symphony) (\d+).(\d+)'
  222 
  223   - regex: 'PLAYSTATION 3.+WebKit'
  224     family_replacement: 'NetFront NX'
  225   - regex: 'PLAYSTATION 3'
  226     family_replacement: 'NetFront'
  227   - regex: '(PlayStation Portable)'
  228     family_replacement: 'NetFront'
  229   - regex: '(PlayStation Vita)'
  230     family_replacement: 'NetFront NX'
  231 
  232   - regex: 'AppleWebKit.+ (NX)/(\d+)\.(\d+)\.(\d+)'
  233     family_replacement: 'NetFront NX'
  234   - regex: '(Nintendo 3DS)'
  235     family_replacement: 'NetFront NX'
  236 
  237   # Amazon Silk, should go before Safari and Chrome Mobile
  238   - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'
  239     family_replacement: 'Amazon Silk'
  240 
  241   # @ref: http://www.puffinbrowser.com
  242   - regex: '(Puffin)/(\d+)\.(\d+)(?:\.(\d+))?'
  243 
  244   # Edge Mobile
  245   - regex: 'Windows Phone .*(Edge)/(\d+)\.(\d+)'
  246     family_replacement: 'Edge Mobile'
  247 
  248   # Samsung Internet (based on Chrome, but lacking some features)
  249   - regex: '(SamsungBrowser)/(\d+)\.(\d+)'
  250     family_replacement: 'Samsung Internet'
  251 
  252   # Seznam.cz browser (based on WebKit)
  253   - regex: '(SznProhlizec)/(\d+)\.(\d+)(?:\.(\d+))?'
  254     family_replacement: 'Seznam.cz'
  255 
  256   # Coc Coc browser, based on Chrome (used in Vietnam)
  257   - regex: '(coc_coc_browser)/(\d+)\.(\d+)(?:\.(\d+))?'
  258     family_replacement: 'Coc Coc'
  259 
  260   # Baidu Browsers (desktop spoofs chrome & IE, explorer is mobile)
  261   - regex: '(baidubrowser)[/\s](\d+)(?:\.(\d+)(?:\.(\d+))?)?'
  262     family_replacement: 'Baidu Browser'
  263   - regex: '(FlyFlow)/(\d+)\.(\d+)'
  264     family_replacement: 'Baidu Explorer'
  265 
  266   # MxBrowser is Maxthon. Must go before Mobile Chrome for Android
  267   - regex: '(MxBrowser)/(\d+)\.(\d+)(?:\.(\d+))?'
  268     family_replacement: 'Maxthon'
  269 
  270   # Crosswalk must go before Mobile Chrome for Android
  271   - regex: '(Crosswalk)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
  272 
  273   # Chrome Mobile
  274   - regex: '; wv\).+(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
  275     family_replacement: 'Chrome Mobile WebView'
  276   - regex: '(CrMo)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
  277     family_replacement: 'Chrome Mobile'
  278   - regex: '(CriOS)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
  279     family_replacement: 'Chrome Mobile iOS'
  280   - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+) Mobile(?:[ /]|$)'
  281     family_replacement: 'Chrome Mobile'
  282   - regex: ' Mobile .*(Chrome)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
  283     family_replacement: 'Chrome Mobile'
  284 
  285   # Chrome Frame must come before MSIE.
  286   - regex: '(chromeframe)/(\d+)\.(\d+)\.(\d+)'
  287     family_replacement: 'Chrome Frame'
  288 
  289   # Tizen Browser (second case included in browser/major.minor regex)
  290   - regex: '(SLP Browser)/(\d+)\.(\d+)'
  291     family_replacement: 'Tizen Browser'
  292 
  293   # Sogou Explorer 2.X
  294   - regex: '(SE 2\.X) MetaSr (\d+)\.(\d+)'
  295     family_replacement: 'Sogou Explorer'
  296 
  297   # QQ Browsers
  298   - regex: '(MQQBrowser/Mini)(?:(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
  299     family_replacement: 'QQ Browser Mini'
  300   - regex: '(MQQBrowser)(?:/(\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
  301     family_replacement: 'QQ Browser Mobile'
  302   - regex: '(QQBrowser)(?:/(\d+)(?:\.(\d+)\.(\d+)(?:\.(\d+))?)?)?'
  303     family_replacement: 'QQ Browser'
  304 
  305   # Rackspace Monitoring
  306   - regex: '(Rackspace Monitoring)/(\d+)\.(\d+)'
  307     family_replacement: 'RackspaceBot'
  308 
  309   # PyAMF
  310   - regex: '(PyAMF)/(\d+)\.(\d+)\.(\d+)'
  311 
  312   # Yandex Browser
  313   - regex: '(YaBrowser)/(\d+)\.(\d+)\.(\d+)'
  314     family_replacement: 'Yandex Browser'
  315 
  316   # Mail.ru Amigo/Internet Browser (Chromium-based)
  317   - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+).* MRCHROME'
  318     family_replacement: 'Mail.ru Chromium Browser'
  319 
  320   # AOL Browser (IE-based)
  321   - regex: '(AOL) (\d+)\.(\d+); AOLBuild (\d+)'
  322 
  323   #### END SPECIAL CASES TOP ####
  324 
  325   #### MAIN CASES - this catches > 50% of all browsers ####
  326 
  327 
  328   # Slack desktop client (needs to be before Apple Mail, Electron, and Chrome as it gets wrongly detected on Mac OS otherwise)
  329   - regex: '(Slack_SSB)/(\d+)\.(\d+)\.(\d+)'
  330     family_replacement: 'Slack Desktop Client'
  331 
  332   # HipChat provides a version on Mac, but not on Windows.
  333   # Needs to be before Chrome on Windows, and AppleMail on Mac.
  334   - regex: '(HipChat)/?(\d+)?'
  335     family_replacement: 'HipChat Desktop Client'
  336 
  337   # Browser/major_version.minor_version.beta_version
  338   - regex: '\b(MobileIron|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Spotify|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave|MacOutlook|Electron)/(\d+)\.(\d+)\.(\d+)'
  339 
  340   # Outlook 2007
  341   - regex: 'Microsoft Office Outlook 12\.\d+\.\d+|MSOffice 12'
  342     family_replacement: 'Outlook'
  343     v1_replacement: '2007'
  344 
  345   # Outlook 2010
  346   - regex: 'Microsoft Outlook 14\.\d+\.\d+|MSOffice 14'
  347     family_replacement: 'Outlook'
  348     v1_replacement: '2010'
  349 
  350   # Outlook 2013
  351   - regex: 'Microsoft Outlook 15\.\d+\.\d+'
  352     family_replacement: 'Outlook'
  353     v1_replacement: '2013'
  354 
  355   # Outlook 2016
  356   - regex: 'Microsoft Outlook (?:Mail )?16\.\d+\.\d+'
  357     family_replacement: 'Outlook'
  358     v1_replacement: '2016'
  359 
  360   # Windows Live Mail
  361   - regex: 'Outlook-Express\/7\.0.*'
  362     family_replacement: 'Windows Live Mail'
  363 
  364   # Apple Air Mail
  365   - regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+))?'
  366 
  367   # Thunderbird
  368   - regex: '(Thunderbird)/(\d+)\.(\d+)(?:\.(\d+(?:pre)?))?'
  369     family_replacement: 'Thunderbird'
  370 
  371   # Postbox
  372   - regex: '(Postbox)/(\d+)\.(\d+)\.(\d+)'
  373     family_replacement: 'Postbox'
  374 
  375   # Barca
  376   - regex: '(Barca(?:Pro)?)/(\d+)\.(\d+)(?:\.(\d+))?'
  377     family_replacement: 'Barca'
  378 
  379   # Lotus Notes
  380   - regex: '(Lotus-Notes)/(\d+)\.(\d+)(?:\.(\d+))?'
  381     family_replacement: 'Lotus Notes'
  382 
  383   # Vivaldi uses "Vivaldi"
  384   - regex: '(Vivaldi)/(\d+)\.(\d+)\.(\d+)'
  385 
  386   # Edge/major_version.minor_version
  387   - regex: '(Edge)/(\d+)(?:\.(\d+))?'
  388 
  389   # Brave Browser https://brave.com/
  390   - regex: '(brave)/(\d+)\.(\d+)\.(\d+) Chrome'
  391     family_replacement: 'Brave'
  392 
  393   # Iron Browser ~since version 50
  394   - regex: '(Chrome)/(\d+)\.(\d+)\.(\d+)[\d.]* Iron[^/]'
  395     family_replacement: 'Iron'
  396 
  397   # Dolphin Browser
  398   # @ref: http://www.dolphin.com
  399   - regex: '\b(Dolphin)(?: |HDCN/|/INT\-)(\d+)\.(\d+)\.?(\d+)?'
  400 
  401   # Headless Chrome
  402   # https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md
  403   # Currently only available on Linux
  404   - regex: 'HeadlessChrome'
  405     family_replacement: 'HeadlessChrome'
  406 
  407   # Browser/major_version.minor_version
  408   - regex: '(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\d+)\.(\d+)(?:\.(\d+))?'
  409 
  410   # Chrome/Chromium/major_version.minor_version
  411   - regex: '(Chromium|Chrome)/(\d+)\.(\d+)(?:\.(\d+))?'
  412 
  413   ##########
  414   # IE Mobile needs to happen before Android to catch cases such as:
  415   # 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)...
  416   # 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)...
  417   # 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)...
  418   # 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; Vodafone)...
  419   ##########
  420 
  421   # IE Mobile
  422   - regex: '(IEMobile)[ /](\d+)\.(\d+)'
  423     family_replacement: 'IE Mobile'
  424 
  425   # Baca Berita App News Reader
  426   - regex: '(BacaBerita App)\/(\d+)\.(\d+)\.(\d+)'
  427 
  428   # Browser major_version.minor_version.beta_version (space instead of slash)
  429   - regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
  430   # Browser major_version.minor_version (space instead of slash)
  431   - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\d+)\.(\d+)\.?(\d+)?'
  432 
  433   # Kindle WebKit
  434   - regex: '(Kindle)/(\d+)\.(\d+)'
  435 
  436   # weird android UAs
  437   - regex: '(Android) Donut'
  438     v1_replacement: '1'
  439     v2_replacement: '2'
  440 
  441   - regex: '(Android) Eclair'
  442     v1_replacement: '2'
  443     v2_replacement: '1'
  444 
  445   - regex: '(Android) Froyo'
  446     v1_replacement: '2'
  447     v2_replacement: '2'
  448 
  449   - regex: '(Android) Gingerbread'
  450     v1_replacement: '2'
  451     v2_replacement: '3'
  452 
  453   - regex: '(Android) Honeycomb'
  454     v1_replacement: '3'
  455 
  456   # desktop mode
  457   # http://www.anandtech.com/show/3982/windows-phone-7-review
  458   - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'
  459     family_replacement: 'IE Large Screen'
  460 
  461 
  462   #### END MAIN CASES ####
  463 
  464   #### SPECIAL CASES ####
  465   - regex: '(Obigo)InternetBrowser'
  466   - regex: '(Obigo)\-Browser'
  467   - regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+))?'
  468     family_replacement: 'Obigo'
  469 
  470   - regex: '(MAXTHON|Maxthon) (\d+)\.(\d+)'
  471     family_replacement: 'Maxthon'
  472   - regex: '(Maxthon|MyIE2|Uzbl|Shiira)'
  473     v1_replacement: '0'
  474 
  475   - regex: '(BrowseX) \((\d+)\.(\d+)\.(\d+)'
  476 
  477   - regex: '(NCSA_Mosaic)/(\d+)\.(\d+)'
  478     family_replacement: 'NCSA Mosaic'
  479 
  480   # Polaris/d.d is above
  481   - regex: '(POLARIS)/(\d+)\.(\d+)'
  482     family_replacement: 'Polaris'
  483   - regex: '(Embider)/(\d+)\.(\d+)'
  484     family_replacement: 'Polaris'
  485 
  486   - regex: '(BonEcho)/(\d+)\.(\d+)\.?([ab]?\d+)?'
  487     family_replacement: 'Bon Echo'
  488 
  489   # @note: iOS / OSX Applications
  490   - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+))?.*[ +]Safari'
  491     family_replacement: 'Mobile Safari'
  492   - regex: '(iPod|iPhone|iPad).+Version/(\d+)\.(\d+)(?:\.(\d+))?'
  493     family_replacement: 'Mobile Safari UI/WKWebView'
  494   - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+))?.*Mobile.*[ +]Safari'
  495     family_replacement: 'Mobile Safari'
  496   - regex: '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\d+)_(\d+)(?:_(\d+))?.*Mobile'
  497     family_replacement: 'Mobile Safari UI/WKWebView'
  498   - regex: '(iPod|iPhone|iPad).* Safari'
  499     family_replacement: 'Mobile Safari'
  500   - regex: '(iPod|iPhone|iPad)'
  501     family_replacement: 'Mobile Safari UI/WKWebView'
  502 
  503   - regex: '(AvantGo) (\d+).(\d+)'
  504 
  505   - regex: '(OneBrowser)/(\d+).(\d+)'
  506     family_replacement: 'ONE Browser'
  507 
  508   - regex: '(Avant)'
  509     v1_replacement: '1'
  510 
  511   # This is the Tesla Model S (see similar entry in device parsers)
  512   - regex: '(QtCarBrowser)'
  513     v1_replacement: '1'
  514 
  515   - regex: '^(iBrowser/Mini)(\d+).(\d+)'
  516     family_replacement: 'iBrowser Mini'
  517   - regex: '^(iBrowser|iRAPP)/(\d+).(\d+)'
  518 
  519   # nokia browsers
  520   # based on: http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices
  521   - regex: '^(Nokia)'
  522     family_replacement: 'Nokia Services (WAP) Browser'
  523   - regex: '(NokiaBrowser)/(\d+)\.(\d+).(\d+)\.(\d+)'
  524     family_replacement: 'Nokia Browser'
  525   - regex: '(NokiaBrowser)/(\d+)\.(\d+).(\d+)'
  526     family_replacement: 'Nokia Browser'
  527   - regex: '(NokiaBrowser)/(\d+)\.(\d+)'
  528     family_replacement: 'Nokia Browser'
  529   - regex: '(BrowserNG)/(\d+)\.(\d+).(\d+)'
  530     family_replacement: 'Nokia Browser'
  531   - regex: '(Series60)/5\.0'
  532     family_replacement: 'Nokia Browser'
  533     v1_replacement: '7'
  534     v2_replacement: '0'
  535   - regex: '(Series60)/(\d+)\.(\d+)'
  536     family_replacement: 'Nokia OSS Browser'
  537   - regex: '(S40OviBrowser)/(\d+)\.(\d+)\.(\d+)\.(\d+)'
  538     family_replacement: 'Ovi Browser'
  539   - regex: '(Nokia)[EN]?(\d+)'
  540 
  541   # BlackBerry devices
  542   - regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
  543     family_replacement: 'BlackBerry WebKit'
  544   - regex: '(Black[bB]erry|BB10).+Version/(\d+)\.(\d+)\.(\d+)'
  545     family_replacement: 'BlackBerry WebKit'
  546   - regex: '(Black[bB]erry)\s?(\d+)'
  547     family_replacement: 'BlackBerry'
  548 
  549   - regex: '(OmniWeb)/v(\d+)\.(\d+)'
  550 
  551   - regex: '(Blazer)/(\d+)\.(\d+)'
  552     family_replacement: 'Palm Blazer'
  553 
  554   - regex: '(Pre)/(\d+)\.(\d+)'
  555     family_replacement: 'Palm Pre'
  556 
  557   # fork of Links
  558   - regex: '(ELinks)/(\d+)\.(\d+)'
  559   - regex: '(ELinks) \((\d+)\.(\d+)'
  560   - regex: '(Links) \((\d+)\.(\d+)'
  561 
  562   - regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
  563 
  564   #- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
  565   #  family_replacement: 'iPad'
  566 
  567   # Phantomjs, should go before Safari
  568   - regex: '(PhantomJS)/(\d+)\.(\d+)\.(\d+)'
  569 
  570   # WebKit Nightly
  571   - regex: '(AppleWebKit)/(\d+)\.?(\d+)?\+ .* Safari'
  572     family_replacement: 'WebKit Nightly'
  573 
  574   # Safari
  575   - regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
  576     family_replacement: 'Safari'
  577   # Safari didn't provide "Version/d.d.d" prior to 3.0
  578   - regex: '(Safari)/\d+'
  579 
  580   - regex: '(OLPC)/Update(\d+)\.(\d+)'
  581 
  582   - regex: '(OLPC)/Update()\.(\d+)'
  583     v1_replacement: '0'
  584 
  585   - regex: '(SEMC\-Browser)/(\d+)\.(\d+)'
  586 
  587   - regex: '(Teleca)'
  588     family_replacement: 'Teleca Browser'
  589 
  590   - regex: '(Phantom)/V(\d+)\.(\d+)'
  591     family_replacement: 'Phantom Browser'
  592 
  593   - regex: 'Trident(.*)rv.(\d+)\.(\d+)'
  594     family_replacement: 'IE'
  595 
  596   # Espial
  597   - regex: '(Espial)/(\d+)(?:\.(\d+))?(?:\.(\d+))?'
  598 
  599  # Apple Mail
  600 
  601   # apple mail - not directly detectable, have it after Safari stuff
  602   - regex: '(AppleWebKit)/(\d+)\.(\d+)\.(\d+)'
  603     family_replacement: 'Apple Mail'
  604 
  605   # AFTER THE EDGE CASES ABOVE!
  606   # AFTER IE11
  607   # BEFORE all other IE
  608   - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
  609   - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?'
  610 
  611   - regex: '([MS]?IE) (\d+)\.(\d+)'
  612     family_replacement: 'IE'
  613 
  614   - regex: '(python-requests)/(\d+)\.(\d+)'
  615     family_replacement: 'Python Requests'
  616 
  617   # headless user-agents
  618   - regex: '\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|Wget|OpenBSD ftp|jupdate)(?:[ /](\d+)(?:\.(\d+)(?:\.(\d+))?)?)?'
  619 
  620   - regex: '(Java)[/ ]{0,1}\d+\.(\d+)\.(\d+)[_-]*([a-zA-Z0-9]+)*'
  621 
  622   # Roku Digital-Video-Players https://www.roku.com/
  623   - regex: '^(Roku)/DVP-(\d+)\.(\d+)'
  624 
  625   # Kurio App News Reader https://kurio.co.id/
  626   - regex: '(Kurio)\/(\d+)\.(\d+)\.(\d+)'
  627     family_replacement: 'Kurio App'
  628 
  629 
  630 os_parsers:
  631   ##########
  632   # HbbTV vendors
  633   ##########
  634 
  635   # starts with the easy one : Panasonic seems consistent across years, hope it will continue
  636   #HbbTV/1.1.1 (;Panasonic;VIERA 2011;f.532;0071-0802 2000-0000;)
  637   #HbbTV/1.1.1 (;Panasonic;VIERA 2012;1.261;0071-3103 2000-0000;)
  638   #HbbTV/1.2.1 (;Panasonic;VIERA 2013;3.672;4101-0003 0002-0000;)
  639   #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Panasonic);VIERA ([0-9]{4});'
  640 
  641   # Sony is consistent too but do not place year like the other
  642   # Opera/9.80 (Linux armv7l; HbbTV/1.1.1 (; Sony; KDL32W650A; PKG3.211EUA; 2013;); ) Presto/2.12.362 Version/12.11
  643   # Opera/9.80 (Linux mips; U;  HbbTV/1.1.1 (; Sony; KDL40HX751; PKG1.902EUA; 2012;);; en) Presto/2.10.250 Version/11.60
  644   # Opera/9.80 (Linux mips; U;  HbbTV/1.1.1 (; Sony; KDL22EX320; PKG4.017EUA; 2011;);; en) Presto/2.7.61 Version/11.00
  645   #- regex: 'HbbTV/\d+\.\d+\.\d+ \(; (Sony);.*;.*; ([0-9]{4});\)'
  646 
  647 
  648   # LG is consistent too, but we need to add manually the year model
  649   #Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.1+ (KHTML, like Gecko) Safari/537.1+ HbbTV/1.1.1 ( ;LGE ;NetCast 4.0 ;03.20.30 ;1.0M ;)
  650   #Mozilla/5.0 (DirectFB; Linux armv7l) AppleWebKit/534.26+ (KHTML, like Gecko) Version/5.0 Safari/534.26+ HbbTV/1.1.1 ( ;LGE ;NetCast 3.0 ;1.0 ;1.0M ;)
  651   - regex: 'HbbTV/\d+\.\d+\.\d+ \( ;(LG)E ;NetCast 4.0'
  652     os_v1_replacement: '2013'
  653   - regex: 'HbbTV/\d+\.\d+\.\d+ \( ;(LG)E ;NetCast 3.0'
  654     os_v1_replacement: '2012'
  655 
  656   # Samsung is on its way of normalizing their user-agent
  657   # HbbTV/1.1.1 (;Samsung;SmartTV2013;T-FXPDEUC-1102.2;;) WebKit
  658   # HbbTV/1.1.1 (;Samsung;SmartTV2013;T-MST12DEUC-1102.1;;) WebKit
  659   # HbbTV/1.1.1 (;Samsung;SmartTV2012;;;) WebKit
  660   # HbbTV/1.1.1 (;;;;;) Maple_2011
  661   - regex: 'HbbTV/1.1.1 \(;;;;;\) Maple_2011'
  662     os_replacement: 'Samsung'
  663     os_v1_replacement: '2011'
  664   # manage the two models of 2013
  665   - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC'
  666     os_v2_replacement: 'UE40F7000'
  667   - regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC'
  668     os_v2_replacement: 'UE32F4500'
  669   # generic Samsung (works starting in 2012)
  670   #- regex: 'HbbTV/\d+\.\d+\.\d+ \(;(Samsung);SmartTV([0-9]{4});'
  671 
  672   # Philips : not found any other way than a manual mapping
  673   # 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
  674   # 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
  675   - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/4'
  676     os_v1_replacement: '2013'
  677   - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/3'
  678     os_v1_replacement: '2012'
  679   - regex: 'HbbTV/1.1.1 \(; (Philips);.*NETTV/2'
  680     os_v1_replacement: '2011'
  681 
  682   # the HbbTV emulator developers use HbbTV/1.1.1 (;;;;;) firetv-firefox-plugin 1.1.20
  683   - regex: 'HbbTV/\d+\.\d+\.\d+.*(firetv)-firefox-plugin (\d+).(\d+).(\d+)'
  684     os_replacement: 'FireHbbTV'
  685 
  686   # generic HbbTV, hoping to catch manufacturer name (always after 2nd comma) and the first string that looks like a 2011-2019 year
  687   - regex: 'HbbTV/\d+\.\d+\.\d+ \(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\)'
  688 
  689   ##########
  690   # @note: Windows Phone needs to come before Windows NT 6.1 *and* before Android to catch cases such as:
  691   # 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)...
  692   # 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)...
  693   # 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)...
  694   # 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; Vodafone)...
  695   ##########
  696 
  697   - regex: '(Windows Phone) (?:OS[ /])?(\d+)\.(\d+)'
  698 
  699   # Again a MS-special one: iPhone.*Outlook-iOS-Android/x.x is erroneously detected as Android
  700   - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+))?.*Outlook-iOS-Android'
  701     os_replacement: 'iOS'
  702 
  703   ##########
  704   # Android
  705   # can actually detect rooted android os. do we care?
  706   ##########
  707   - regex: '(Android)[ \-/](\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?'
  708 
  709   - regex: '(Android) Donut'
  710     os_v1_replacement: '1'
  711     os_v2_replacement: '2'
  712 
  713   - regex: '(Android) Eclair'
  714     os_v1_replacement: '2'
  715     os_v2_replacement: '1'
  716 
  717   - regex: '(Android) Froyo'
  718     os_v1_replacement: '2'
  719     os_v2_replacement: '2'
  720 
  721   - regex: '(Android) Gingerbread'
  722     os_v1_replacement: '2'
  723     os_v2_replacement: '3'
  724 
  725   - regex: '(Android) Honeycomb'
  726     os_v1_replacement: '3'
  727 
  728   # UCWEB
  729   - regex: '^UCWEB.*; (Adr) (\d+)\.(\d+)(?:[.\-]([a-z0-9]+))?;'
  730     os_replacement: 'Android'
  731   - regex: '^UCWEB.*; (iPad|iPh|iPd) OS (\d+)_(\d+)(?:_(\d+))?;'
  732     os_replacement: 'iOS'
  733   - regex: '^UCWEB.*; (wds) (\d+)\.(\d+)(?:\.(\d+))?;'
  734     os_replacement: 'Windows Phone'
  735   # JUC
  736   - regex: '^(JUC).*; ?U; ?(?:Android)?(\d+)\.(\d+)(?:[\.\-]([a-z0-9]+))?'
  737     os_replacement: 'Android'
  738 
  739   ##########
  740   # Kindle Android
  741   ##########
  742   - regex: '(Silk-Accelerated=[a-z]{4,5})'
  743     os_replacement: 'Android'
  744 
  745   ##########
  746   # Windows
  747   # http://en.wikipedia.org/wiki/Windows_NT#Releases
  748   # possibility of false positive when different marketing names share same NT kernel
  749   # e.g. windows server 2003 and windows xp
  750   # lots of ua strings have Windows NT 4.1 !?!?!?!? !?!? !? !????!?! !!! ??? !?!?! ?
  751   # (very) roughly ordered in terms of frequency of occurrence of regex (win xp currently most frequent, etc)
  752   ##########
  753 
  754   # ie mobile desktop mode
  755   # spoofs nt 6.1. must come before windows 7
  756   - regex: '(XBLWP7)'
  757     os_replacement: 'Windows Phone'
  758 
  759   # @note: This needs to come before Windows NT 6.1
  760   - regex: '(Windows ?Mobile)'
  761     os_replacement: 'Windows Mobile'
  762 
  763   - regex: '(Windows (?:NT 5\.2|NT 5\.1))'
  764     os_replacement: 'Windows XP'
  765 
  766   - regex: '(Windows NT 6\.1)'
  767     os_replacement: 'Windows 7'
  768 
  769   - regex: '(Windows NT 6\.0)'
  770     os_replacement: 'Windows Vista'
  771 
  772   - regex: '(Win 9x 4\.90)'
  773     os_replacement: 'Windows ME'
  774 
  775   - regex: '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\.0|Windows Vista|Windows 2000|Windows 3.1)'
  776 
  777   - regex: '(Windows NT 6\.2; ARM;)'
  778     os_replacement: 'Windows RT'
  779   - regex: '(Windows NT 6\.2)'
  780     os_replacement: 'Windows 8'
  781 
  782   - regex: '(Windows NT 6\.3; ARM;)'
  783     os_replacement: 'Windows RT 8.1'
  784   - regex: '(Windows NT 6\.3)'
  785     os_replacement: 'Windows 8.1'
  786 
  787   - regex: '(Windows NT 6\.4)'
  788     os_replacement: 'Windows 10'
  789   - regex: '(Windows NT 10\.0)'
  790     os_replacement: 'Windows 10'
  791 
  792   - regex: '(Windows NT 5\.0)'
  793     os_replacement: 'Windows 2000'
  794 
  795   - regex: '(WinNT4.0)'
  796     os_replacement: 'Windows NT 4.0'
  797 
  798   - regex: '(Windows ?CE)'
  799     os_replacement: 'Windows CE'
  800 
  801   - regex: 'Win ?(95|98|3.1|NT|ME|2000)'
  802     os_replacement: 'Windows $1'
  803 
  804   - regex: 'Win16'
  805     os_replacement: 'Windows 3.1'
  806 
  807   - regex: 'Win32'
  808     os_replacement: 'Windows 95'
  809 
  810   ##########
  811   # Tizen OS from Samsung
  812   # spoofs Android so pushing it above
  813   ##########
  814   - regex: '(Tizen)[/ ](\d+)\.(\d+)'
  815 
  816   ##########
  817   # Mac OS
  818   # @ref: http://en.wikipedia.org/wiki/Mac_OS_X#Versions
  819   # @ref: http://www.puredarwin.org/curious/versions
  820   ##########
  821   - regex: '((?:Mac[ +]?|; )OS[ +]X)[\s+/](?:(\d+)[_.](\d+)(?:[_.](\d+))?|Mach-O)'
  822     os_replacement: 'Mac OS X'
  823   # Leopard
  824   - regex: ' (Dar)(win)/(9).(\d+).*\((?:i386|x86_64|Power Macintosh)\)'
  825     os_replacement: 'Mac OS X'
  826     os_v1_replacement: '10'
  827     os_v2_replacement: '5'
  828   # Snow Leopard
  829   - regex: ' (Dar)(win)/(10).(\d+).*\((?:i386|x86_64)\)'
  830     os_replacement: 'Mac OS X'
  831     os_v1_replacement: '10'
  832     os_v2_replacement: '6'
  833   # Lion
  834   - regex: ' (Dar)(win)/(11).(\d+).*\((?:i386|x86_64)\)'
  835     os_replacement: 'Mac OS X'
  836     os_v1_replacement: '10'
  837     os_v2_replacement: '7'
  838   # Mountain Lion
  839   - regex: ' (Dar)(win)/(12).(\d+).*\((?:i386|x86_64)\)'
  840     os_replacement: 'Mac OS X'
  841     os_v1_replacement: '10'
  842     os_v2_replacement: '8'
  843   # Mavericks
  844   - regex: ' (Dar)(win)/(13).(\d+).*\((?:i386|x86_64)\)'
  845     os_replacement: 'Mac OS X'
  846     os_v1_replacement: '10'
  847     os_v2_replacement: '9'
  848   # Yosemite is Darwin/14.x but patch versions are inconsistent in the Darwin string;
  849   # more accurately covered by CFNetwork regexes downstream
  850 
  851   # IE on Mac doesn't specify version number
  852   - regex: 'Mac_PowerPC'
  853     os_replacement: 'Mac OS'
  854 
  855   # builds before tiger don't seem to specify version?
  856 
  857   # ios devices spoof (mac os x), so including intel/ppc prefixes
  858   - regex: '(?:PPC|Intel) (Mac OS X)'
  859 
  860   ##########
  861   # iOS
  862   # http://en.wikipedia.org/wiki/IOS_version_history
  863   ##########
  864   # keep this above generic iOS, since AppleTV UAs contain 'CPU OS'
  865   - regex: '(Apple\s?TV)(?:/(\d+)\.(\d+))?'
  866     os_replacement: 'ATV OS X'
  867 
  868   - regex: '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\d+)[_\.](\d+)(?:[_\.](\d+))?'
  869     os_replacement: 'iOS'
  870 
  871   # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs
  872   - regex: '(iPhone|iPad|iPod); Opera'
  873     os_replacement: 'iOS'
  874 
  875   # few more stragglers
  876   - regex: '(iPhone|iPad|iPod).*Mac OS X.*Version/(\d+)\.(\d+)'
  877     os_replacement: 'iOS'
  878 
  879   # CFNetwork/Darwin - The specific CFNetwork or Darwin version determines
  880   # whether the os maps to Mac OS, or iOS, or just Darwin.
  881   # See: http://user-agents.me/cfnetwork-version-list
  882   - regex: '(CFNetwork)/(5)48\.0\.3.* Darwin/11\.0\.0'
  883     os_replacement: 'iOS'
  884   - regex: '(CFNetwork)/(5)48\.(0)\.4.* Darwin/(1)1\.0\.0'
  885     os_replacement: 'iOS'
  886   - regex: '(CFNetwork)/(5)48\.(1)\.4'
  887     os_replacement: 'iOS'
  888   - regex: '(CFNetwork)/(4)85\.1(3)\.9'
  889     os_replacement: 'iOS'
  890   - regex: '(CFNetwork)/(6)09\.(1)\.4'
  891     os_replacement: 'iOS'
  892   - regex: '(CFNetwork)/(6)(0)9'
  893     os_replacement: 'iOS'
  894   - regex: '(CFNetwork)/6(7)2\.(1)\.13'
  895     os_replacement: 'iOS'
  896   - regex: '(CFNetwork)/6(7)2\.(1)\.(1)4'
  897     os_replacement: 'iOS'
  898   - regex: '(CF)(Network)/6(7)(2)\.1\.15'
  899     os_replacement: 'iOS'
  900     os_v1_replacement: '7'
  901     os_v2_replacement: '1'
  902   - regex: '(CFNetwork)/6(7)2\.(0)\.(?:2|8)'
  903     os_replacement: 'iOS'
  904   - regex: '(CFNetwork)/709\.1'
  905     os_replacement: 'iOS'
  906     os_v1_replacement: '8'
  907     os_v2_replacement: '0.b5'
  908   - regex: '(CF)(Network)/711\.(\d)'
  909     os_replacement: 'iOS'
  910     os_v1_replacement: '8'
  911   - regex: '(CF)(Network)/(720)\.(\d)'
  912     os_replacement: 'Mac OS X'
  913     os_v1_replacement: '10'
  914     os_v2_replacement: '10'
  915   - regex: '(CF)(Network)/(760)\.(\d)'
  916     os_replacement: 'Mac OS X'
  917     os_v1_replacement: '10'
  918     os_v2_replacement: '11'
  919   - regex: '(CF)(Network)/758\.(\d)'
  920     os_replacement: 'iOS'
  921     os_v1_replacement: '9'
  922   - regex: '(CF)(Network)/808\.(\d)'
  923     os_replacement: 'iOS'
  924     os_v1_replacement: '10'
  925 
  926   ##########
  927   # CFNetwork macOS Apps (must be before CFNetwork iOS Apps
  928   # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
  929   ##########
  930   - regex: 'CFNetwork/.* Darwin/16\.\d+.*\(x86_64\)'
  931     os_replacement: 'Mac OS X'
  932     os_v1_replacement: '10'
  933     os_v2_replacement: '12'
  934   - regex: 'CFNetwork/8.* Darwin/15\.\d+.*\(x86_64\)'
  935     os_replacement: 'Mac OS X'
  936     os_v1_replacement: '10'
  937     os_v2_replacement: '11'
  938   ##########
  939   # CFNetwork iOS Apps
  940   # @ref: https://en.wikipedia.org/wiki/Darwin_(operating_system)#Release_history
  941   ##########
  942   - regex: 'CFNetwork/.* Darwin/(9)\.\d+'
  943     os_replacement: 'iOS'
  944     os_v1_replacement: '1'
  945   - regex: 'CFNetwork/.* Darwin/(10)\.\d+'
  946     os_replacement: 'iOS'
  947     os_v1_replacement: '4'
  948   - regex: 'CFNetwork/.* Darwin/(11)\.\d+'
  949     os_replacement: 'iOS'
  950     os_v1_replacement: '5'
  951   - regex: 'CFNetwork/.* Darwin/(13)\.\d+'
  952     os_replacement: 'iOS'
  953     os_v1_replacement: '6'
  954   - regex: 'CFNetwork/6.* Darwin/(14)\.\d+'
  955     os_replacement: 'iOS'
  956     os_v1_replacement: '7'
  957   - regex: 'CFNetwork/7.* Darwin/(14)\.\d+'
  958     os_replacement: 'iOS'
  959     os_v1_replacement: '8'
  960     os_v2_replacement: '0'
  961   - regex: 'CFNetwork/7.* Darwin/(15)\.\d+'
  962     os_replacement: 'iOS'
  963     os_v1_replacement: '9'
  964     os_v2_replacement: '0'
  965   - regex: 'CFNetwork/8.* Darwin/(16)\.\d+'
  966     os_replacement: 'iOS'
  967     os_v1_replacement: '10'
  968   # iOS Apps
  969   - regex: '\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\d,\d/|\d,\d; )|iPad/)(\d{1,2})[_\.](\d{1,2})(?:[_\.](\d+))?'
  970     os_replacement: 'iOS'
  971   - regex: '\((iOS);'
  972 
  973   ##########
  974   # Apple TV
  975   ##########
  976   - regex: '(tvOS)/(\d+).(\d+)'
  977     os_replacement: 'tvOS'
  978 
  979   ##########
  980   # Chrome OS
  981   # if version 0.0.0, probably this stuff:
  982   # http://code.google.com/p/chromium-os/issues/detail?id=11573
  983   # http://code.google.com/p/chromium-os/issues/detail?id=13790
  984   ##########
  985   - regex: '(CrOS) [a-z0-9_]+ (\d+)\.(\d+)(?:\.(\d+))?'
  986     os_replacement: 'Chrome OS'
  987 
  988   ##########
  989   # Linux distros
  990   ##########
  991   - regex: '([Dd]ebian)'
  992     os_replacement: 'Debian'
  993   - regex: '(Linux Mint)(?:/(\d+))?'
  994   - regex: '(Mandriva)(?: Linux)?/(?:[\d.-]+m[a-z]{2}(\d+).(\d))?'
  995 
  996   ##########
  997   # Symbian + Symbian OS
  998   # http://en.wikipedia.org/wiki/History_of_Symbian
  999   ##########
 1000   - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'
 1001     os_replacement: 'Symbian OS'
 1002   - regex: '(Symbian/3).+NokiaBrowser/7\.3'
 1003     os_replacement: 'Symbian^3 Anna'
 1004   - regex: '(Symbian/3).+NokiaBrowser/7\.4'
 1005     os_replacement: 'Symbian^3 Belle'
 1006   - regex: '(Symbian/3)'
 1007     os_replacement: 'Symbian^3'
 1008   - regex: '\b(Series 60|SymbOS|S60Version|S60V\d|S60\b)'
 1009     os_replacement: 'Symbian OS'
 1010   - regex: '(MeeGo)'
 1011   - regex: 'Symbian [Oo][Ss]'
 1012     os_replacement: 'Symbian OS'
 1013   - regex: 'Series40;'
 1014     os_replacement: 'Nokia Series 40'
 1015   - regex: 'Series30Plus;'
 1016     os_replacement: 'Nokia Series 30 Plus'
 1017 
 1018   ##########
 1019   # BlackBerry devices
 1020   ##########
 1021   - regex: '(BB10);.+Version/(\d+)\.(\d+)\.(\d+)'
 1022     os_replacement: 'BlackBerry OS'
 1023   - regex: '(Black[Bb]erry)[0-9a-z]+/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
 1024     os_replacement: 'BlackBerry OS'
 1025   - regex: '(Black[Bb]erry).+Version/(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?'
 1026     os_replacement: 'BlackBerry OS'
 1027   - regex: '(RIM Tablet OS) (\d+)\.(\d+)\.(\d+)'
 1028     os_replacement: 'BlackBerry Tablet OS'
 1029   - regex: '(Play[Bb]ook)'
 1030     os_replacement: 'BlackBerry Tablet OS'
 1031   - regex: '(Black[Bb]erry)'
 1032     os_replacement: 'BlackBerry OS'
 1033 
 1034   ##########
 1035   # Firefox OS
 1036   ##########
 1037   - regex: '\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\d+\.\d+'
 1038     os_replacement: 'Firefox OS'
 1039     os_v1_replacement: '1'
 1040     os_v2_replacement: '0'
 1041     os_v3_replacement: '1'
 1042 
 1043   - regex: '\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\d+\.\d+'
 1044     os_replacement: 'Firefox OS'
 1045     os_v1_replacement: '1'
 1046     os_v2_replacement: '1'
 1047 
 1048   - regex: '\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\d+\.\d+'
 1049     os_replacement: 'Firefox OS'
 1050     os_v1_replacement: '1'
 1051     os_v2_replacement: '2'
 1052 
 1053   - regex: '\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\d+\.\d+'
 1054     os_replacement: 'Firefox OS'
 1055     os_v1_replacement: '1'
 1056     os_v2_replacement: '3'
 1057 
 1058   - regex: '\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\d+\.\d+'
 1059     os_replacement: 'Firefox OS'
 1060     os_v1_replacement: '1'
 1061     os_v2_replacement: '4'
 1062 
 1063   - regex: '\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\d+\.\d+'
 1064     os_replacement: 'Firefox OS'
 1065     os_v1_replacement: '2'
 1066     os_v2_replacement: '0'
 1067 
 1068   - regex: '\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\d+\.\d+'
 1069     os_replacement: 'Firefox OS'
 1070     os_v1_replacement: '2'
 1071     os_v2_replacement: '1'
 1072 
 1073   # Firefox OS Generic
 1074   - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'
 1075     os_replacement: 'Firefox OS'
 1076 
 1077 
 1078   ##########
 1079   # BREW
 1080   # yes, Brew is lower-cased for Brew MP
 1081   ##########
 1082   - regex: '(BREW)[ /](\d+)\.(\d+)\.(\d+)'
 1083   - regex: '(BREW);'
 1084   - regex: '(Brew MP|BMP)[ /](\d+)\.(\d+)\.(\d+)'
 1085     os_replacement: 'Brew MP'
 1086   - regex: 'BMP;'
 1087     os_replacement: 'Brew MP'
 1088 
 1089   ##########
 1090   # Google TV
 1091   ##########
 1092   - regex: '(GoogleTV)(?: (\d+)\.(\d+)(?:\.(\d+))?|/[\da-z]+)'
 1093 
 1094   - regex: '(WebTV)/(\d+).(\d+)'
 1095 
 1096   ##########
 1097   # Chromecast
 1098   ##########
 1099   - regex: '(CrKey)(?:[/](\d+)\.(\d+)(?:\.(\d+))?)?'
 1100     os_replacement: 'Chromecast'
 1101 
 1102   ##########
 1103   # Misc mobile
 1104   ##########
 1105   - regex: '(hpw|web)OS/(\d+)\.(\d+)(?:\.(\d+))?'
 1106     os_replacement: 'webOS'
 1107   - regex: '(VRE);'
 1108 
 1109   ##########
 1110   # Generic patterns
 1111   # since the majority of os cases are very specific, these go last
 1112   ##########
 1113   - regex: '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\b)BSD)[/ ](\d+)\.(\d+)(?:\.(\d+)(?:\.(\d+))?)?'
 1114 
 1115   # Gentoo Linux + Kernel Version
 1116   - regex: '(Linux)[ /](\d+)\.(\d+)(?:\.(\d+))?.*gentoo'
 1117     os_replacement: 'Gentoo'
 1118 
 1119   # Opera Mini Bada
 1120   - regex: '\((Bada);'
 1121 
 1122   # just os
 1123   - regex: '(Windows|Android|WeTab|Maemo|Web0S)'
 1124   - regex: '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\b)BSD)'
 1125   # Linux + Kernel Version
 1126   - regex: '(Linux)(?:[ /](\d+)\.(\d+)(?:\.(\d+))?)?'
 1127   - regex: 'SunOS'
 1128     os_replacement: 'Solaris'
 1129 
 1130   # Roku Digital-Video-Players https://www.roku.com/
 1131   - regex: '^(Roku)/DVP-(\d+)\.(\d+)'
 1132 
 1133 device_parsers:
 1134 
 1135   #########
 1136   # Mobile Spiders
 1137   # Catch the mobile crawler before checking for iPhones / Androids.
 1138   #########
 1139   - regex: '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\d|(?:bot|spider)\.html)|AdsBot-Google-Mobile.*iPhone)'
 1140     regex_flag: 'i'
 1141     device_replacement: 'Spider'
 1142     brand_replacement: 'Spider'
 1143     model_replacement: 'Smartphone'
 1144   - regex: '(?:DoCoMo|\bMOT\b|\bLG\b|Nokia|Samsung|SonyEricsson).*(?:(?:Bot|Yeti)-Mobile|bots?/\d|(?:bot|crawler)\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)'
 1145     regex_flag: 'i'
 1146     device_replacement: 'Spider'
 1147     brand_replacement: 'Spider'
 1148     model_replacement: 'Feature Phone'
 1149 
 1150   #########
 1151   # WebBrowser for SmartWatch
 1152   # @ref: https://play.google.com/store/apps/details?id=se.vaggan.webbrowser&hl=en
 1153   #########
 1154   - regex: '\bSmartWatch *\( *([^;]+) *; *([^;]+) *;'
 1155     device_replacement: '$1 $2'
 1156     brand_replacement: '$1'
 1157     model_replacement: '$2'
 1158 
 1159   ######################################################################
 1160   # Android parsers
 1161   #
 1162   # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
 1163   ######################################################################
 1164 
 1165   # Android Application
 1166   - regex: 'Android Application[^\-]+ - (Sony) ?(Ericsson)? (.+) \w+ - '
 1167     device_replacement: '$1 $2'
 1168     brand_replacement: '$1$2'
 1169     model_replacement: '$3'
 1170   - regex: 'Android Application[^\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\-](.+) \w+ - '
 1171     regex_flag: 'i'
 1172     device_replacement: '$1 $2'
 1173     brand_replacement: '$1'
 1174     model_replacement: '$2'
 1175   - regex: 'Android Application[^\-]+ - ([^ ]+) (.+) \w+ - '
 1176     device_replacement: '$1 $2'
 1177     brand_replacement: '$1'
 1178     model_replacement: '$2'
 1179 
 1180   #########
 1181   # 3Q
 1182   # @ref: http://www.3q-int.com/
 1183   #########
 1184   - regex: '; *([BLRQ]C\d{4}[A-Z]+) +Build/'
 1185     device_replacement: '3Q $1'
 1186     brand_replacement: '3Q'
 1187     model_replacement: '$1'
 1188   - regex: '; *(?:3Q_)([^;/]+) +Build'
 1189     device_replacement: '3Q $1'
 1190     brand_replacement: '3Q'
 1191     model_replacement: '$1'
 1192 
 1193   #########
 1194   # Acer
 1195   # @ref: http://us.acer.com/ac/en/US/content/group/tablets
 1196   #########
 1197   - regex: 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G)?|A701|B1-A71|A1-\d{3}|B1-\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+) Build'
 1198     device_replacement: '$1'
 1199     brand_replacement: 'Acer'
 1200     model_replacement: '$1'
 1201   - regex: '; *Acer Iconia Tab ([^;/]+) Build'
 1202     device_replacement: '$1'
 1203     brand_replacement: 'Acer'
 1204     model_replacement: '$1'
 1205   - regex: '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\d+) Build'
 1206     device_replacement: '$1'
 1207     brand_replacement: 'Acer'
 1208     model_replacement: '$1'
 1209   - regex: '; *(Acer |ACER )([^;/]+) Build'
 1210     device_replacement: '$1$2'
 1211     brand_replacement: 'Acer'
 1212     model_replacement: '$2'
 1213 
 1214   #########
 1215   # Advent
 1216   # @ref: https://en.wikipedia.org/wiki/Advent_Vega
 1217   # @note: VegaBean and VegaComb (names derived from jellybean, honeycomb) are
 1218   #   custom ROM builds for Vega
 1219   #########
 1220   - regex: '; *(Advent )?(Vega(?:Bean|Comb)?).* Build'
 1221     device_replacement: '$1$2'
 1222     brand_replacement: 'Advent'
 1223     model_replacement: '$2'
 1224 
 1225   #########
 1226   # Ainol
 1227   # @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product
 1228   #########
 1229   - regex: '; *(Ainol )?((?:NOVO|[Nn]ovo)[^;/]+) Build'
 1230     device_replacement: '$1$2'
 1231     brand_replacement: 'Ainol'
 1232     model_replacement: '$2'
 1233 
 1234   #########
 1235   # Airis
 1236   # @ref: http://airis.es/Tienda/Default.aspx?idG=001
 1237   #########
 1238   - regex: '; *AIRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
 1239     regex_flag: 'i'
 1240     device_replacement: '$1'
 1241     brand_replacement: 'Airis'
 1242     model_replacement: '$1'
 1243   - regex: '; *(OnePAD[^;/]+) Build'
 1244     regex_flag: 'i'
 1245     device_replacement: '$1'
 1246     brand_replacement: 'Airis'
 1247     model_replacement: '$1'
 1248 
 1249   #########
 1250   # Airpad
 1251   # @ref: ??
 1252   #########
 1253   - regex: '; *Airpad[ \-]([^;/]+) Build'
 1254     device_replacement: 'Airpad $1'
 1255     brand_replacement: 'Airpad'
 1256     model_replacement: '$1'
 1257 
 1258   #########
 1259   # Alcatel - TCT
 1260   # @ref: http://www.alcatelonetouch.com/global-en/products/smartphones.html
 1261   #########
 1262   - regex: '; *(one ?touch) (EVO7|T10|T20) Build'
 1263     device_replacement: 'Alcatel One Touch $2'
 1264     brand_replacement: 'Alcatel'
 1265     model_replacement: 'One Touch $2'
 1266   - regex: '; *(?:alcatel[ _])?(?:(?:one[ _]?touch[ _])|ot[ \-])([^;/]+);? Build'
 1267     regex_flag: 'i'
 1268     device_replacement: 'Alcatel One Touch $1'
 1269     brand_replacement: 'Alcatel'
 1270     model_replacement: 'One Touch $1'
 1271   - regex: '; *(TCL)[ _]([^;/]+) Build'
 1272     device_replacement: '$1 $2'
 1273     brand_replacement: '$1'
 1274     model_replacement: '$2'
 1275   # operator specific models
 1276   - regex: '; *(Vodafone Smart II|Optimus_Madrid) Build'
 1277     device_replacement: 'Alcatel $1'
 1278     brand_replacement: 'Alcatel'
 1279     model_replacement: '$1'
 1280   - regex: '; *BASE_Lutea_3 Build'
 1281     device_replacement: 'Alcatel One Touch 998'
 1282     brand_replacement: 'Alcatel'
 1283     model_replacement: 'One Touch 998'
 1284   - regex: '; *BASE_Varia Build'
 1285     device_replacement: 'Alcatel One Touch 918D'
 1286     brand_replacement: 'Alcatel'
 1287     model_replacement: 'One Touch 918D'
 1288 
 1289   #########
 1290   # Allfine
 1291   # @ref: http://www.myallfine.com/Products.asp
 1292   #########
 1293   - regex: '; *((?:FINE|Fine)\d[^;/]+) Build'
 1294     device_replacement: '$1'
 1295     brand_replacement: 'Allfine'
 1296     model_replacement: '$1'
 1297 
 1298   #########
 1299   # Allview
 1300   # @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/
 1301   #########
 1302   - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*) Build/'
 1303     device_replacement: '$1$2'
 1304     brand_replacement: 'Allview'
 1305     model_replacement: '$2'
 1306   - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)?(AX1_Shine|AX2_Frenzy) Build'
 1307     device_replacement: '$1$2'
 1308     brand_replacement: 'Allview'
 1309     model_replacement: '$2'
 1310   - regex: '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*) Build'
 1311     device_replacement: '$1$2'
 1312     brand_replacement: 'Allview'
 1313     model_replacement: '$2'
 1314 
 1315   #########
 1316   # Allwinner
 1317   # @ref: http://www.allwinner.com/
 1318   # @models: A31 (13.3"),A20,A10,
 1319   #########
 1320   - regex: '; *(A13-MID) Build'
 1321     device_replacement: '$1'
 1322     brand_replacement: 'Allwinner'
 1323     model_replacement: '$1'
 1324   - regex: '; *(Allwinner)[ _\-]?([^;/]+) Build'
 1325     device_replacement: '$1 $2'
 1326     brand_replacement: 'Allwinner'
 1327     model_replacement: '$1'
 1328 
 1329   #########
 1330   # Amaway
 1331   # @ref: http://www.amaway.cn/
 1332   #########
 1333   - regex: '; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80) Build'
 1334     device_replacement: '$1'
 1335     brand_replacement: 'Amaway'
 1336     model_replacement: '$1'
 1337 
 1338   #########
 1339   # Amoi
 1340   # @ref: http://www.amoi.com/en/prd/prd_index.jspx
 1341   #########
 1342   - regex: '; *(?:AMOI|Amoi)[ _]([^;/]+) Build'
 1343     device_replacement: 'Amoi $1'
 1344     brand_replacement: 'Amoi'
 1345     model_replacement: '$1'
 1346   - regex: '^(?:AMOI|Amoi)[ _]([^;/]+) Linux'
 1347     device_replacement: 'Amoi $1'
 1348     brand_replacement: 'Amoi'
 1349     model_replacement: '$1'
 1350 
 1351   #########
 1352   # Aoc
 1353   # @ref: http://latin.aoc.com/media_tablet
 1354   #########
 1355   - regex: '; *(MW(?:0[789]|10)[^;/]+) Build'
 1356     device_replacement: '$1'
 1357     brand_replacement: 'Aoc'
 1358     model_replacement: '$1'
 1359 
 1360   #########
 1361   # Aoson
 1362   # @ref: http://www.luckystar.com.cn/en/mid.aspx?page=1
 1363   # @ref: http://www.luckystar.com.cn/en/mobiletel.aspx?page=1
 1364   # @note: brand owned by luckystar
 1365   #########
 1366   - regex: '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T)?|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D) Build'
 1367     device_replacement: 'Aoson $1'
 1368     brand_replacement: 'Aoson'
 1369     model_replacement: '$1'
 1370   - regex: '; *Aoson ([^;/]+) Build'
 1371     regex_flag: 'i'
 1372     device_replacement: 'Aoson $1'
 1373     brand_replacement: 'Aoson'
 1374     model_replacement: '$1'
 1375 
 1376   #########
 1377   # Apanda
 1378   # @ref: http://www.apanda.com.cn/
 1379   #########
 1380   - regex: '; *[Aa]panda[ _\-]([^;/]+) Build'
 1381     device_replacement: 'Apanda $1'
 1382     brand_replacement: 'Apanda'
 1383     model_replacement: '$1'
 1384 
 1385   #########
 1386   # Archos
 1387   # @ref: http://www.archos.com/de/products/tablets.html
 1388   # @ref: http://www.archos.com/de/products/smartphones/index.html
 1389   #########
 1390   - regex: '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|[;/\(\)\-])'
 1391     device_replacement: 'Archos $1'
 1392     brand_replacement: 'Archos'
 1393     model_replacement: '$1'
 1394   - regex: 'ARCHOS; GOGI; ([^;]+);'
 1395     device_replacement: 'Archos $1'
 1396     brand_replacement: 'Archos'
 1397     model_replacement: '$1'
 1398   - regex: '(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\(\)\-]|$)'
 1399     device_replacement: 'Archos $1'
 1400     brand_replacement: 'Archos'
 1401     model_replacement: '$1'
 1402   - regex: '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4}) Build'
 1403     device_replacement: 'Archos $1'
 1404     brand_replacement: 'Archos'
 1405     model_replacement: '$1'
 1406   - regex: '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9) Build'
 1407     device_replacement: 'Archos $1'
 1408     brand_replacement: 'Archos'
 1409     model_replacement: '$1'
 1410 
 1411   #########
 1412   # A-rival
 1413   # @ref: http://www.a-rival.de/de/
 1414   #########
 1415   - regex: '; *(PAD-FMD[^;/]+) Build'
 1416     device_replacement: '$1'
 1417     brand_replacement: 'Arival'
 1418     model_replacement: '$1'
 1419   - regex: '; *(BioniQ) ?([^;/]+) Build'
 1420     device_replacement: '$1 $2'
 1421     brand_replacement: 'Arival'
 1422     model_replacement: '$1 $2'
 1423 
 1424   #########
 1425   # Arnova
 1426   # @ref: http://arnovatech.com/
 1427   #########
 1428   - regex: '; *(AN\d[^;/]+|ARCHM\d+) Build'
 1429     device_replacement: 'Arnova $1'
 1430     brand_replacement: 'Arnova'
 1431     model_replacement: '$1'
 1432   - regex: '; *(?:ARNOVA|Arnova) ?([^;/]+) Build'
 1433     device_replacement: 'Arnova $1'
 1434     brand_replacement: 'Arnova'
 1435     model_replacement: '$1'
 1436 
 1437   #########
 1438   # Assistant
 1439   # @ref: http://www.assistant.ua
 1440   #########
 1441   - regex: '; *(?:ASSISTANT )?(AP)-?([1789]\d{2}[A-Z]{0,2}|80104) Build'
 1442     device_replacement: 'Assistant $1-$2'
 1443     brand_replacement: 'Assistant'
 1444     model_replacement: '$1-$2'
 1445 
 1446   #########
 1447   # Asus
 1448   # @ref: http://www.asus.com/uk/Tablets_Mobile/
 1449   #########
 1450   - regex: '; *(ME17\d[^;/]*|ME3\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013)?|PadFone[^;/]*|Transformer[^;/]*|TF\d{3}[^;/]*|eeepc) Build'
 1451     device_replacement: 'Asus $1'
 1452     brand_replacement: 'Asus'
 1453     model_replacement: '$1'
 1454   - regex: '; *ASUS[ _]*([^;/]+) Build'
 1455     device_replacement: 'Asus $1'
 1456     brand_replacement: 'Asus'
 1457     model_replacement: '$1'
 1458 
 1459   #########
 1460   # Garmin-Asus
 1461   #########
 1462   - regex: '; *Garmin-Asus ([^;/]+) Build'
 1463     device_replacement: 'Garmin-Asus $1'
 1464     brand_replacement: 'Garmin-Asus'
 1465     model_replacement: '$1'
 1466   - regex: '; *(Garminfone) Build'
 1467     device_replacement: 'Garmin $1'
 1468     brand_replacement: 'Garmin-Asus'
 1469     model_replacement: '$1'
 1470 
 1471   #########
 1472   # Attab
 1473   # @ref: http://www.theattab.com/
 1474   #########
 1475   - regex: '; (@TAB-[^;/]+) Build'
 1476     device_replacement: '$1'
 1477     brand_replacement: 'Attab'
 1478     model_replacement: '$1'
 1479 
 1480   #########
 1481   # Audiosonic
 1482   # @ref: ??
 1483   # @note: Take care with Docomo T-01 Toshiba
 1484   #########
 1485   - regex: '; *(T-(?:07|[^0]\d)[^;/]+) Build'
 1486     device_replacement: '$1'
 1487     brand_replacement: 'Audiosonic'
 1488     model_replacement: '$1'
 1489 
 1490   #########
 1491   # Axioo
 1492   # @ref: http://www.axiooworld.com/ww/index.php
 1493   #########
 1494   - regex: '; *(?:Axioo[ _\-]([^;/]+)|(picopad)[ _\-]([^;/]+)) Build'
 1495     regex_flag: 'i'
 1496     device_replacement: 'Axioo $1$2 $3'
 1497     brand_replacement: 'Axioo'
 1498     model_replacement: '$1$2 $3'
 1499 
 1500   #########
 1501   # Azend
 1502   # @ref: http://azendcorp.com/index.php/products/portable-electronics
 1503   #########
 1504   - regex: '; *(V(?:100|700|800)[^;/]*) Build'
 1505     device_replacement: '$1'
 1506     brand_replacement: 'Azend'
 1507     model_replacement: '$1'
 1508 
 1509   #########
 1510   # Bak
 1511   # @ref: http://www.bakinternational.com/produtos.php?cat=80
 1512   #########
 1513   - regex: '; *(IBAK\-[^;/]*) Build'
 1514     regex_flag: 'i'
 1515     device_replacement: '$1'
 1516     brand_replacement: 'Bak'
 1517     model_replacement: '$1'
 1518 
 1519   #########
 1520   # Bedove
 1521   # @ref: http://www.bedove.com/product.html
 1522   # @models: HY6501|HY5001|X12|X21|I5
 1523   #########
 1524   - regex: '; *(HY5001|HY6501|X12|X21|I5) Build'
 1525     device_replacement: 'Bedove $1'
 1526     brand_replacement: 'Bedove'
 1527     model_replacement: '$1'
 1528 
 1529   #########
 1530   # Benss
 1531   # @ref: http://www.benss.net/
 1532   #########
 1533   - regex: '; *(JC-[^;/]*) Build'
 1534     device_replacement: 'Benss $1'
 1535     brand_replacement: 'Benss'
 1536     model_replacement: '$1'
 1537 
 1538   #########
 1539   # Blackberry
 1540   # @ref: http://uk.blackberry.com/
 1541   # @note: Android Apps seams to be used here
 1542   #########
 1543   - regex: '; *(BB) ([^;/]+) Build'
 1544     device_replacement: '$1 $2'
 1545     brand_replacement: 'Blackberry'
 1546     model_replacement: '$2'
 1547 
 1548   #########
 1549   # Blackbird
 1550   # @ref: http://iblackbird.co.kr
 1551   #########
 1552   - regex: '; *(BlackBird)[ _](I8.*) Build'
 1553     device_replacement: '$1 $2'
 1554     brand_replacement: '$1'
 1555     model_replacement: '$2'
 1556   - regex: '; *(BlackBird)[ _](.*) Build'
 1557     device_replacement: '$1 $2'
 1558     brand_replacement: '$1'
 1559     model_replacement: '$2'
 1560 
 1561   #########
 1562   # Blaupunkt
 1563   # @ref: http://www.blaupunkt.com
 1564   #########
 1565   # Endeavour
 1566   - regex: '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+) Build'
 1567     device_replacement: 'Blaupunkt $1'
 1568     brand_replacement: 'Blaupunkt'
 1569     model_replacement: '$1'
 1570 
 1571   #########
 1572   # Blu
 1573   # @ref: http://bluproducts.com
 1574   #########
 1575   - regex: '; *((?:BLU|Blu)[ _\-])([^;/]+) Build'
 1576     device_replacement: '$1$2'
 1577     brand_replacement: 'Blu'
 1578     model_replacement: '$2'
 1579   # BMOBILE = operator branded device
 1580   - regex: '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\.3|TANK 4\.5) Build'
 1581     device_replacement: '$1'
 1582     brand_replacement: 'Blu'
 1583     model_replacement: '$1'
 1584 
 1585   #########
 1586   # Blusens
 1587   # @ref: http://www.blusens.com/es/?sg=1&sv=al&roc=1
 1588   #########
 1589   # tablet
 1590   - regex: '; *(TOUCH\d[^;/]+) Build'
 1591     device_replacement: '$1'
 1592     brand_replacement: 'Blusens'
 1593     model_replacement: '$1'
 1594 
 1595   #########
 1596   # Bmobile
 1597   # @ref: http://bmobile.eu.com/?categoria=smartphones-2
 1598   # @note: Might collide with Maxx as AX is used also there.
 1599   #########
 1600   # smartphone
 1601   - regex: '; *(AX5\d+) Build'
 1602     device_replacement: '$1'
 1603     brand_replacement: 'Bmobile'
 1604     model_replacement: '$1'
 1605 
 1606   #########
 1607   # bq
 1608   # @ref: http://bqreaders.com
 1609   #########
 1610   - regex: '; *([Bb]q) ([^;/]+);? Build'
 1611     device_replacement: '$1 $2'
 1612     brand_replacement: 'bq'
 1613     model_replacement: '$2'
 1614   - regex: '; *(Maxwell [^;/]+) Build'
 1615     device_replacement: '$1'
 1616     brand_replacement: 'bq'
 1617     model_replacement: '$1'
 1618 
 1619   #########
 1620   # Braun Phototechnik
 1621   # @ref: http://www.braun-phototechnik.de/en/products/list/~pcat.250/Tablet-PC.html
 1622   #########
 1623   - regex: '; *((?:B-Tab|B-TAB) ?\d[^;/]+) Build'
 1624     device_replacement: '$1'
 1625     brand_replacement: 'Braun'
 1626     model_replacement: '$1'
 1627 
 1628   #########
 1629   # Broncho
 1630   # @ref: http://www.broncho.cn/
 1631   #########
 1632   - regex: '; *(Broncho) ([^;/]+) Build'
 1633     device_replacement: '$1 $2'
 1634     brand_replacement: '$1'
 1635     model_replacement: '$2'
 1636 
 1637   #########
 1638   # Captiva
 1639   # @ref: http://www.captiva-power.de
 1640   #########
 1641   - regex: '; *CAPTIVA ([^;/]+) Build'
 1642     device_replacement: 'Captiva $1'
 1643     brand_replacement: 'Captiva'
 1644     model_replacement: '$1'
 1645 
 1646   #########
 1647   # Casio
 1648   # @ref: http://www.casiogzone.com/
 1649   #########
 1650   - regex: '; *(C771|CAL21|IS11CA) Build'
 1651     device_replacement: '$1'
 1652     brand_replacement: 'Casio'
 1653     model_replacement: '$1'
 1654 
 1655   #########
 1656   # Cat
 1657   # @ref: http://www.cat-sound.com
 1658   #########
 1659   - regex: '; *(?:Cat|CAT) ([^;/]+) Build'
 1660     device_replacement: 'Cat $1'
 1661     brand_replacement: 'Cat'
 1662     model_replacement: '$1'
 1663   - regex: '; *(?:Cat)(Nova.*) Build'
 1664     device_replacement: 'Cat $1'
 1665     brand_replacement: 'Cat'
 1666     model_replacement: '$1'
 1667   - regex: '; *(INM8002KP|ADM8000KP_[AB]) Build'
 1668     device_replacement: '$1'
 1669     brand_replacement: 'Cat'
 1670     model_replacement: 'Tablet PHOENIX 8.1J0'
 1671 
 1672   #########
 1673   # Celkon
 1674   # @ref: http://www.celkonmobiles.com/?_a=products
 1675   # @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
 1676   #########
 1677   - regex: '; *(?:[Cc]elkon[ _\*]|CELKON[ _\*])([^;/\)]+) ?(?:Build|;|\))'
 1678     device_replacement: '$1'
 1679     brand_replacement: 'Celkon'
 1680     model_replacement: '$1'
 1681   - regex: 'Build/(?:[Cc]elkon)+_?([^;/_\)]+)'
 1682     device_replacement: '$1'
 1683     brand_replacement: 'Celkon'
 1684     model_replacement: '$1'
 1685   - regex: '; *(CT)-?(\d+) Build'
 1686     device_replacement: '$1$2'
 1687     brand_replacement: 'Celkon'
 1688     model_replacement: '$1$2'
 1689   # smartphones
 1690   - regex: '; *(A19|A19Q|A105|A107[^;/\)]*) ?(?:Build|;|\))'
 1691     device_replacement: '$1'
 1692     brand_replacement: 'Celkon'
 1693     model_replacement: '$1'
 1694 
 1695   #########
 1696   # ChangJia
 1697   # @ref: http://www.cjshowroom.com/eproducts.aspx?classcode=004001001
 1698   # @brief: China manufacturer makes tablets for different small brands
 1699   #         (eg. http://www.zeepad.net/index.html)
 1700   #########
 1701   - regex: '; *(TPC[0-9]{4,5}) Build'
 1702     device_replacement: '$1'
 1703     brand_replacement: 'ChangJia'
 1704     model_replacement: '$1'
 1705 
 1706   #########
 1707   # Cloudfone
 1708   # @ref: http://www.cloudfonemobile.com/
 1709   #########
 1710   - regex: '; *(Cloudfone)[ _](Excite)([^ ][^;/]+) Build'
 1711     device_replacement: '$1 $2 $3'
 1712     brand_replacement: 'Cloudfone'
 1713     model_replacement: '$1 $2 $3'
 1714   - regex: '; *(Excite|ICE)[ _](\d+[^;/]+) Build'
 1715     device_replacement: 'Cloudfone $1 $2'
 1716     brand_replacement: 'Cloudfone'
 1717     model_replacement: 'Cloudfone $1 $2'
 1718   - regex: '; *(Cloudfone|CloudPad)[ _]([^;/]+) Build'
 1719     device_replacement: '$1 $2'
 1720     brand_replacement: 'Cloudfone'
 1721     model_replacement: '$1 $2'
 1722 
 1723   #########
 1724   # Cmx
 1725   # @ref: http://cmx.at/de/
 1726   #########
 1727   - regex: '; *((?:Aquila|Clanga|Rapax)[^;/]+) Build'
 1728     regex_flag: 'i'
 1729     device_replacement: '$1'
 1730     brand_replacement: 'Cmx'
 1731     model_replacement: '$1'
 1732 
 1733   #########
 1734   # CobyKyros
 1735   # @ref: http://cobykyros.com
 1736   # @note: Be careful with MID\d{3} from MpMan or Manta
 1737   #########
 1738   - regex: '; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\(3G\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\)])'
 1739     device_replacement: 'CobyKyros $1$2'
 1740     brand_replacement: 'CobyKyros'
 1741     model_replacement: '$1$2'
 1742 
 1743   #########
 1744   # Coolpad
 1745   # @ref: ??
 1746   #########
 1747   - regex: '; *([^;/]*)Coolpad[ _]([^;/]+) Build'
 1748     device_replacement: '$1$2'
 1749     brand_replacement: 'Coolpad'
 1750     model_replacement: '$1$2'
 1751 
 1752   #########
 1753   # Cube
 1754   # @ref: http://www.cube-tablet.com/buy-products.html
 1755   #########
 1756   - regex: '; *(CUBE[ _])?([KU][0-9]+ ?GT.*|A5300) Build'
 1757     regex_flag: 'i'
 1758     device_replacement: '$1$2'
 1759     brand_replacement: 'Cube'
 1760     model_replacement: '$2'
 1761 
 1762   #########
 1763   # Cubot
 1764   # @ref: http://www.cubotmall.com/
 1765   #########
 1766   - regex: '; *CUBOT ([^;/]+) Build'
 1767     regex_flag: 'i'
 1768     device_replacement: '$1'
 1769     brand_replacement: 'Cubot'
 1770     model_replacement: '$1'
 1771   - regex: '; *(BOBBY) Build'
 1772     regex_flag: 'i'
 1773     device_replacement: '$1'
 1774     brand_replacement: 'Cubot'
 1775     model_replacement: '$1'
 1776 
 1777   #########
 1778   # Danew
 1779   # @ref: http://www.danew.com/produits-tablette.php
 1780   #########
 1781   - regex: '; *(Dslide [^;/]+) Build'
 1782     device_replacement: '$1'
 1783     brand_replacement: 'Danew'
 1784     model_replacement: '$1'
 1785 
 1786   #########
 1787   # Dell
 1788   # @ref: http://www.dell.com
 1789   # @ref: http://www.softbank.jp/mobile/support/product/101dl/
 1790   # @ref: http://www.softbank.jp/mobile/support/product/001dl/
 1791   # @ref: http://developer.emnet.ne.jp/android.html
 1792   # @ref: http://www.dell.com/in/p/mobile-xcd28/pd
 1793   # @ref: http://www.dell.com/in/p/mobile-xcd35/pd
 1794   #########
 1795   - regex: '; *(XCD)[ _]?(28|35) Build'
 1796     device_replacement: 'Dell $1$2'
 1797     brand_replacement: 'Dell'
 1798     model_replacement: '$1$2'
 1799   - regex: '; *(001DL) Build'
 1800     device_replacement: 'Dell $1'
 1801     brand_replacement: 'Dell'
 1802     model_replacement: 'Streak'
 1803   - regex: '; *(?:Dell|DELL) (Streak) Build'
 1804     device_replacement: 'Dell $1'
 1805     brand_replacement: 'Dell'
 1806     model_replacement: 'Streak'
 1807   - regex: '; *(101DL|GS01|Streak Pro[^;/]*) Build'
 1808     device_replacement: 'Dell $1'
 1809     brand_replacement: 'Dell'
 1810     model_replacement: 'Streak Pro'
 1811   - regex: '; *([Ss]treak ?7) Build'
 1812     device_replacement: 'Dell $1'
 1813     brand_replacement: 'Dell'
 1814     model_replacement: 'Streak 7'
 1815   - regex: '; *(Mini-3iX) Build'
 1816     device_replacement: 'Dell $1'
 1817     brand_replacement: 'Dell'
 1818     model_replacement: '$1'
 1819   - regex: '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*|Streak[ _]Pro) Build'
 1820     device_replacement: 'Dell $1'
 1821     brand_replacement: 'Dell'
 1822     model_replacement: '$1'
 1823   - regex: '; *Dell[ _]([^;/]+) Build'
 1824     device_replacement: 'Dell $1'
 1825     brand_replacement: 'Dell'
 1826     model_replacement: '$1'
 1827   - regex: '; *Dell ([^;/]+) Build'
 1828     device_replacement: 'Dell $1'
 1829     brand_replacement: 'Dell'
 1830     model_replacement: '$1'
 1831 
 1832   #########
 1833   # Denver
 1834   # @ref: http://www.denver-electronics.com/tablets1/
 1835   #########
 1836   - regex: '; *(TA[CD]-\d+[^;/]*) Build'
 1837     device_replacement: '$1'
 1838     brand_replacement: 'Denver'
 1839     model_replacement: '$1'
 1840 
 1841   #########
 1842   # Dex
 1843   # @ref: http://dex.ua/
 1844   #########
 1845   - regex: '; *(iP[789]\d{2}(?:-3G)?|IP10\d{2}(?:-8GB)?) Build'
 1846     device_replacement: '$1'
 1847     brand_replacement: 'Dex'
 1848     model_replacement: '$1'
 1849 
 1850   #########
 1851   # DNS AirTab
 1852   # @ref: http://www.dns-shop.ru/
 1853   #########
 1854   - regex: '; *(AirTab)[ _\-]([^;/]+) Build'
 1855     device_replacement: '$1 $2'
 1856     brand_replacement: 'DNS'
 1857     model_replacement: '$1 $2'
 1858 
 1859   #########
 1860   # Docomo (Operator Branded Device)
 1861   # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
 1862   #########
 1863   - regex: '; *(F\-\d[^;/]+) Build'
 1864     device_replacement: '$1'
 1865     brand_replacement: 'Fujitsu'
 1866     model_replacement: '$1'
 1867   - regex: '; *(HT-03A) Build'
 1868     device_replacement: '$1'
 1869     brand_replacement: 'HTC'
 1870     model_replacement: 'Magic'
 1871   - regex: '; *(HT\-\d[^;/]+) Build'
 1872     device_replacement: '$1'
 1873     brand_replacement: 'HTC'
 1874     model_replacement: '$1'
 1875   - regex: '; *(L\-\d[^;/]+) Build'
 1876     device_replacement: '$1'
 1877     brand_replacement: 'LG'
 1878     model_replacement: '$1'
 1879   - regex: '; *(N\-\d[^;/]+) Build'
 1880     device_replacement: '$1'
 1881     brand_replacement: 'Nec'
 1882     model_replacement: '$1'
 1883   - regex: '; *(P\-\d[^;/]+) Build'
 1884     device_replacement: '$1'
 1885     brand_replacement: 'Panasonic'
 1886     model_replacement: '$1'
 1887   - regex: '; *(SC\-\d[^;/]+) Build'
 1888     device_replacement: '$1'
 1889     brand_replacement: 'Samsung'
 1890     model_replacement: '$1'
 1891   - regex: '; *(SH\-\d[^;/]+) Build'
 1892     device_replacement: '$1'
 1893     brand_replacement: 'Sharp'
 1894     model_replacement: '$1'
 1895   - regex: '; *(SO\-\d[^;/]+) Build'
 1896     device_replacement: '$1'
 1897     brand_replacement: 'SonyEricsson'
 1898     model_replacement: '$1'
 1899   - regex: '; *(T\-0[12][^;/]+) Build'
 1900     device_replacement: '$1'
 1901     brand_replacement: 'Toshiba'
 1902     model_replacement: '$1'
 1903 
 1904   #########
 1905   # DOOV
 1906   # @ref: http://www.doov.com.cn/
 1907   #########
 1908   - regex: '; *(DOOV)[ _]([^;/]+) Build'
 1909     device_replacement: '$1 $2'
 1910     brand_replacement: 'DOOV'
 1911     model_replacement: '$2'
 1912 
 1913   #########
 1914   # Enot
 1915   # @ref: http://www.enot.ua/
 1916   #########
 1917   - regex: '; *(Enot|ENOT)[ -]?([^;/]+) Build'
 1918     device_replacement: '$1 $2'
 1919     brand_replacement: 'Enot'
 1920     model_replacement: '$2'
 1921 
 1922   #########
 1923   # Evercoss
 1924   # @ref: http://evercoss.com/android/
 1925   #########
 1926   - regex: '; *[^;/]+ Build/(?:CROSS|Cross)+[ _\-]([^\)]+)'
 1927     device_replacement: 'CROSS $1'
 1928     brand_replacement: 'Evercoss'
 1929     model_replacement: 'Cross $1'
 1930   - regex: '; *(CROSS|Cross)[ _\-]([^;/]+) Build'
 1931     device_replacement: '$1 $2'
 1932     brand_replacement: 'Evercoss'
 1933     model_replacement: 'Cross $2'
 1934 
 1935   #########
 1936   # Explay
 1937   # @ref: http://explay.ru/
 1938   #########
 1939   - regex: '; *Explay[_ ](.+?)(?:[\)]| Build)'
 1940     device_replacement: '$1'
 1941     brand_replacement: 'Explay'
 1942     model_replacement: '$1'
 1943 
 1944   #########
 1945   # Fly
 1946   # @ref: http://www.fly-phone.com/
 1947   #########
 1948   - regex: '; *(IQ.*) Build'
 1949     device_replacement: '$1'
 1950     brand_replacement: 'Fly'
 1951     model_replacement: '$1'
 1952   - regex: '; *(Fly|FLY)[ _](IQ[^;]+|F[34]\d+[^;]*);? Build'
 1953     device_replacement: '$1 $2'
 1954     brand_replacement: 'Fly'
 1955     model_replacement: '$2'
 1956 
 1957   #########
 1958   # Fujitsu
 1959   # @ref: http://www.fujitsu.com/global/
 1960   #########
 1961   - regex: '; *(M532|Q572|FJL21) Build/'
 1962     device_replacement: '$1'
 1963     brand_replacement: 'Fujitsu'
 1964     model_replacement: '$1'
 1965 
 1966   #########
 1967   # Galapad
 1968   # @ref: http://www.galapad.net/product.html
 1969   #########
 1970   - regex: '; *(G1) Build'
 1971     device_replacement: '$1'
 1972     brand_replacement: 'Galapad'
 1973     model_replacement: '$1'
 1974 
 1975   #########
 1976   # Geeksphone
 1977   # @ref: http://www.geeksphone.com/
 1978   #########
 1979   - regex: '; *(Geeksphone) ([^;/]+) Build'
 1980     device_replacement: '$1 $2'
 1981     brand_replacement: '$1'
 1982     model_replacement: '$2'
 1983 
 1984   #########
 1985   # Gfive
 1986   # @ref: http://www.gfivemobile.com/en
 1987   #########
 1988   #- regex: '; *(G\'?FIVE) ([^;/]+) Build' # there is a problem with python yaml parser here
 1989   - regex: '; *(G[^F]?FIVE) ([^;/]+) Build'
 1990     device_replacement: '$1 $2'
 1991     brand_replacement: 'Gfive'
 1992     model_replacement: '$2'
 1993 
 1994   #########
 1995   # Gionee
 1996   # @ref: http://www.gionee.com/
 1997   #########
 1998   - regex: '; *(Gionee)[ _\-]([^;/]+)(?:/[^;/]+)? Build'
 1999     regex_flag: 'i'
 2000     device_replacement: '$1 $2'
 2001     brand_replacement: 'Gionee'
 2002     model_replacement: '$2'
 2003   - regex: '; *(GN\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1) Build'
 2004     device_replacement: 'Gionee $1'
 2005     brand_replacement: 'Gionee'
 2006     model_replacement: '$1'
 2007   - regex: '; *(E3) Build/JOP40D'
 2008     device_replacement: 'Gionee $1'
 2009     brand_replacement: 'Gionee'
 2010     model_replacement: '$1'
 2011 
 2012   #########
 2013   # GoClever
 2014   # @ref: http://www.goclever.com
 2015   #########
 2016   - regex: '; *((?:FONE|QUANTUM|INSIGNIA) \d+[^;/]*|PLAYTAB) Build'
 2017     device_replacement: 'GoClever $1'
 2018     brand_replacement: 'GoClever'
 2019     model_replacement: '$1'
 2020   - regex: '; *GOCLEVER ([^;/]+) Build'
 2021     device_replacement: 'GoClever $1'
 2022     brand_replacement: 'GoClever'
 2023     model_replacement: '$1'
 2024 
 2025   #########
 2026   # Google
 2027   # @ref: http://www.google.de/glass/start/
 2028   #########
 2029   - regex: '; *(Glass \d+) Build'
 2030     device_replacement: '$1'
 2031     brand_replacement: 'Google'
 2032     model_replacement: '$1'
 2033   - regex: '; *(Pixel \w+) Build'
 2034     device_replacement: '$1'
 2035     brand_replacement: 'Google'
 2036     model_replacement: '$1'
 2037 
 2038   #########
 2039   # Gigabyte
 2040   # @ref: http://gsmart.gigabytecm.com/en/
 2041   #########
 2042   - regex: '; *(GSmart)[ -]([^/]+) Build'
 2043     device_replacement: '$1 $2'
 2044     brand_replacement: 'Gigabyte'
 2045     model_replacement: '$1 $2'
 2046 
 2047   #########
 2048   # Freescale development boards
 2049   # @ref: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=IMX53QSB
 2050   #########
 2051   - regex: '; *(imx5[13]_[^/]+) Build'
 2052     device_replacement: 'Freescale $1'
 2053     brand_replacement: 'Freescale'
 2054     model_replacement: '$1'
 2055 
 2056   #########
 2057   # Haier
 2058   # @ref: http://www.haier.com/
 2059   # @ref: http://www.haier.com/de/produkte/tablet/
 2060   #########
 2061   - regex: '; *Haier[ _\-]([^/]+) Build'
 2062     device_replacement: 'Haier $1'
 2063     brand_replacement: 'Haier'
 2064     model_replacement: '$1'
 2065   - regex: '; *(PAD1016) Build'
 2066     device_replacement: 'Haipad $1'
 2067     brand_replacement: 'Haipad'
 2068     model_replacement: '$1'
 2069 
 2070   #########
 2071   # Haipad
 2072   # @ref: http://www.haipad.net/
 2073   # @models: V7P|M7SM7S|M9XM9X|M7XM7X|M9|M8|M7-M|M1002|M7|M701
 2074   #########
 2075   - regex: '; *(M701|M7|M8|M9) Build'
 2076     device_replacement: 'Haipad $1'
 2077     brand_replacement: 'Haipad'
 2078     model_replacement: '$1'
 2079 
 2080   #########
 2081   # Hannspree
 2082   # @ref: http://www.hannspree.eu/
 2083   # @models: SN10T1|SN10T2|SN70T31B|SN70T32W
 2084   #########
 2085   - regex: '; *(SN\d+T[^;\)/]*)(?: Build|[;\)])'
 2086     device_replacement: 'Hannspree $1'
 2087     brand_replacement: 'Hannspree'
 2088     model_replacement: '$1'
 2089 
 2090   #########
 2091   # HCLme
 2092   # @ref: http://www.hclmetablet.com/india/
 2093   #########
 2094   - regex: 'Build/HCL ME Tablet ([^;\)]+)[\);]'
 2095     device_replacement: 'HCLme $1'
 2096     brand_replacement: 'HCLme'
 2097     model_replacement: '$1'
 2098   - regex: '; *([^;\/]+) Build/HCL'
 2099     device_replacement: 'HCLme $1'
 2100     brand_replacement: 'HCLme'
 2101     model_replacement: '$1'
 2102 
 2103   #########
 2104   # Hena
 2105   # @ref: http://www.henadigital.com/en/product/index.asp?id=6
 2106   #########
 2107   - regex: '; *(MID-?\d{4}C[EM]) Build'
 2108     device_replacement: 'Hena $1'
 2109     brand_replacement: 'Hena'
 2110     model_replacement: '$1'
 2111 
 2112   #########
 2113   # Hisense
 2114   # @ref: http://www.hisense.com/
 2115   #########
 2116   - regex: '; *(EG\d{2,}|HS-[^;/]+|MIRA[^;/]+) Build'
 2117     device_replacement: 'Hisense $1'
 2118     brand_replacement: 'Hisense'
 2119     model_replacement: '$1'
 2120   - regex: '; *(andromax[^;/]+) Build'
 2121     regex_flag: 'i'
 2122     device_replacement: 'Hisense $1'
 2123     brand_replacement: 'Hisense'
 2124     model_replacement: '$1'
 2125 
 2126   #########
 2127   # hitech
 2128   # @ref: http://www.hitech-mobiles.com/
 2129   #########
 2130   - regex: '; *(?:AMAZE[ _](S\d+)|(S\d+)[ _]AMAZE) Build'
 2131     device_replacement: 'AMAZE $1$2'
 2132     brand_replacement: 'hitech'
 2133     model_replacement: 'AMAZE $1$2'
 2134 
 2135   #########
 2136   # HP
 2137   # @ref: http://www.hp.com/
 2138   #########
 2139   - regex: '; *(PlayBook) Build'
 2140     device_replacement: 'HP $1'
 2141     brand_replacement: 'HP'
 2142     model_replacement: '$1'
 2143   - regex: '; *HP ([^/]+) Build'
 2144     device_replacement: 'HP $1'
 2145     brand_replacement: 'HP'
 2146     model_replacement: '$1'
 2147   - regex: '; *([^/]+_tenderloin) Build'
 2148     device_replacement: 'HP TouchPad'
 2149     brand_replacement: 'HP'
 2150     model_replacement: 'TouchPad'
 2151 
 2152   #########
 2153   # Huawei
 2154   # @ref: http://www.huaweidevice.com
 2155   # @note: Needs to be before HTC due to Desire HD Build on U8815
 2156   #########
 2157   - regex: '; *(HUAWEI |Huawei-)?([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\);]+)\)'
 2158     device_replacement: '$1$2'
 2159     brand_replacement: 'Huawei'
 2160     model_replacement: '$2'
 2161   - regex: '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)[^\);]*\)'
 2162     device_replacement: '$1'
 2163     brand_replacement: 'Huawei'
 2164     model_replacement: '$2'
 2165   - regex: '; *(S7|M860) Build'
 2166     device_replacement: '$1'
 2167     brand_replacement: 'Huawei'
 2168     model_replacement: '$1'
 2169   - regex: '; *((?:HUAWEI|Huawei)[ \-]?)(MediaPad) Build'
 2170     device_replacement: '$1$2'
 2171     brand_replacement: 'Huawei'
 2172     model_replacement: '$2'
 2173   - regex: '; *((?:HUAWEI[ _]?|Huawei[ _])?Ascend[ _])([^;/]+) Build'
 2174     device_replacement: '$1$2'
 2175     brand_replacement: 'Huawei'
 2176     model_replacement: '$2'
 2177   - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)((?:G700-|MT-)[^;/]+) Build'
 2178     device_replacement: '$1$2'
 2179     brand_replacement: 'Huawei'
 2180     model_replacement: '$2'
 2181   - regex: '; *((?:HUAWEI|Huawei)[ _\-]?)([^;/]+) Build'
 2182     device_replacement: '$1$2'
 2183     brand_replacement: 'Huawei'
 2184     model_replacement: '$2'
 2185   - regex: '; *(MediaPad[^;]+|SpringBoard) Build/Huawei'
 2186     device_replacement: '$1'
 2187     brand_replacement: 'Huawei'
 2188     model_replacement: '$1'
 2189   - regex: '; *([^;]+) Build/(?:Huawei|HUAWEI)'
 2190     device_replacement: '$1'
 2191     brand_replacement: 'Huawei'
 2192     model_replacement: '$1'
 2193   - regex: '; *([Uu])([89]\d{3}) Build'
 2194     device_replacement: '$1$2'
 2195     brand_replacement: 'Huawei'
 2196     model_replacement: 'U$2'
 2197   - regex: '; *(?:Ideos |IDEOS )(S7) Build'
 2198     device_replacement: 'Huawei Ideos$1'
 2199     brand_replacement: 'Huawei'
 2200     model_replacement: 'Ideos$1'
 2201   - regex: '; *(?:Ideos |IDEOS )([^;/]+\s*|\s*)Build'
 2202     device_replacement: 'Huawei Ideos$1'
 2203     brand_replacement: 'Huawei'
 2204     model_replacement: 'Ideos$1'
 2205   - regex: '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]'
 2206     device_replacement: 'Huawei $1'
 2207     brand_replacement: 'Huawei'
 2208     model_replacement: '$1'
 2209 
 2210   #########
 2211   # HTC
 2212   # @ref: http://www.htc.com/www/products/
 2213   # @ref: http://en.wikipedia.org/wiki/List_of_HTC_phones
 2214   #########
 2215 
 2216   - regex: '; *HTC[ _]([^;]+); Windows Phone'
 2217     device_replacement: 'HTC $1'
 2218     brand_replacement: 'HTC'
 2219     model_replacement: '$1'
 2220 
 2221   # Android HTC with Version Number matcher
 2222   # ; HTC_0P3Z11/1.12.161.3 Build
 2223   # ;HTC_A3335 V2.38.841.1 Build
 2224   - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
 2225     device_replacement: 'HTC $1'
 2226     brand_replacement: 'HTC'
 2227     model_replacement: '$1'
 2228   - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+))?(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
 2229     device_replacement: 'HTC $1 $2'
 2230     brand_replacement: 'HTC'
 2231     model_replacement: '$1 $2'
 2232   - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+))?)?(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
 2233     device_replacement: 'HTC $1 $2 $3'
 2234     brand_replacement: 'HTC'
 2235     model_replacement: '$1 $2 $3'
 2236   - regex: '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+))?)?)?(?:[/\\]1\.0 | V|/| +)\d+\.\d[\d\.]*(?: *Build|\))'
 2237     device_replacement: 'HTC $1 $2 $3 $4'
 2238     brand_replacement: 'HTC'
 2239     model_replacement: '$1 $2 $3 $4'
 2240 
 2241   # Android HTC without Version Number matcher
 2242   - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/;]+)(?: *Build|[;\)]| - )'
 2243     device_replacement: 'HTC $1'
 2244     brand_replacement: 'HTC'
 2245     model_replacement: '$1'
 2246   - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^ _/;\)]+))?(?: *Build|[;\)]| - )'
 2247     device_replacement: 'HTC $1 $2'
 2248     brand_replacement: 'HTC'
 2249     model_replacement: '$1 $2'
 2250   - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\)]+))?)?(?: *Build|[;\)]| - )'
 2251     device_replacement: 'HTC $1 $2 $3'
 2252     brand_replacement: 'HTC'
 2253     model_replacement: '$1 $2 $3'
 2254   - regex: '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+))?)?)?(?: *Build|[;\)]| - )'
 2255     device_replacement: 'HTC $1 $2 $3 $4'
 2256     brand_replacement: 'HTC'
 2257     model_replacement: '$1 $2 $3 $4'
 2258 
 2259   # HTC Streaming Player
 2260   - regex: 'HTC Streaming Player [^\/]*/[^\/]*/ htc_([^/]+) /'
 2261     device_replacement: 'HTC $1'
 2262     brand_replacement: 'HTC'
 2263     model_replacement: '$1'
 2264   # general matcher for anything else
 2265   - regex: '(?:[;,] *|^)(?:htccn_chs-)?HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\(\)]|$)'
 2266     regex_flag: 'i'
 2267     device_replacement: 'HTC $1'
 2268     brand_replacement: 'HTC'
 2269     model_replacement: '$1'
 2270   # Android matchers without HTC
 2271   - regex: '; *(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\+?)\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\(\)])'
 2272     regex_flag: 'i'
 2273     device_replacement: 'HTC $1'
 2274     brand_replacement: 'HTC'
 2275     model_replacement: '$1'
 2276   - regex: '; *(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.+?)(?:[/;\)]|Build|MIUI|1\.0)'
 2277     regex_flag: 'i'
 2278     device_replacement: 'HTC $1 $2'
 2279     brand_replacement: 'HTC'
 2280     model_replacement: '$1 $2'
 2281 
 2282   #########
 2283   # Hyundai
 2284   # @ref: http://www.hyundaitechnologies.com
 2285   #########
 2286   - regex: '; *HYUNDAI (T\d[^/]*) Build'
 2287     device_replacement: 'Hyundai $1'
 2288     brand_replacement: 'Hyundai'
 2289     model_replacement: '$1'
 2290   - regex: '; *HYUNDAI ([^;/]+) Build'
 2291     device_replacement: 'Hyundai $1'
 2292     brand_replacement: 'Hyundai'
 2293     model_replacement: '$1'
 2294   # X900? http://www.amazon.com/Hyundai-X900-Retina-Android-Bluetooth/dp/B00AO07H3O
 2295   - regex: '; *(X700|Hold X|MB-6900) Build'
 2296     device_replacement: 'Hyundai $1'
 2297     brand_replacement: 'Hyundai'
 2298     model_replacement: '$1'
 2299 
 2300   #########
 2301   # iBall
 2302   # @ref: http://www.iball.co.in/Category/Mobiles/22
 2303   #########
 2304   - regex: '; *(?:iBall[ _\-])?(Andi)[ _]?(\d[^;/]*) Build'
 2305     regex_flag: 'i'
 2306     device_replacement: '$1 $2'
 2307     brand_replacement: 'iBall'
 2308     model_replacement: '$1 $2'
 2309   - regex: '; *(IBall)(?:[ _]([^;/]+)|) Build'
 2310     regex_flag: 'i'
 2311     device_replacement: '$1 $2'
 2312     brand_replacement: 'iBall'
 2313     model_replacement: '$2'
 2314 
 2315   #########
 2316   # IconBIT
 2317   # @ref: http://www.iconbit.com/catalog/tablets/
 2318   #########
 2319   - regex: '; *(NT-\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+)? Build'
 2320     device_replacement: '$1'
 2321     brand_replacement: 'IconBIT'
 2322     model_replacement: '$1'
 2323 
 2324   #########
 2325   # IMO
 2326   # @ref: http://www.ponselimo.com/
 2327   #########
 2328   - regex: '; *(IMO)[ _]([^;/]+) Build'
 2329     regex_flag: 'i'
 2330     device_replacement: '$1 $2'
 2331     brand_replacement: 'IMO'
 2332     model_replacement: '$2'
 2333 
 2334   #########
 2335   # i-mobile
 2336   # @ref: http://www.i-mobilephone.com/
 2337   #########
 2338   - regex: '; *i-?mobile[ _]([^/]+) Build/'
 2339     regex_flag: 'i'
 2340     device_replacement: 'i-mobile $1'
 2341     brand_replacement: 'imobile'
 2342     model_replacement: '$1'
 2343   - regex: '; *(i-(?:style|note)[^/]*) Build/'
 2344     regex_flag: 'i'
 2345     device_replacement: 'i-mobile $1'
 2346     brand_replacement: 'imobile'
 2347     model_replacement: '$1'
 2348 
 2349   #########
 2350   # Impression
 2351   # @ref: http://impression.ua/planshetnye-kompyutery
 2352   #########
 2353   - regex: '; *(ImPAD) ?(\d+(?:.)*) Build'
 2354     device_replacement: '$1 $2'
 2355     brand_replacement: 'Impression'
 2356     model_replacement: '$1 $2'
 2357 
 2358   #########
 2359   # Infinix
 2360   # @ref: http://www.infinixmobility.com/index.html
 2361   #########
 2362   - regex: '; *(Infinix)[ _]([^;/]+) Build'
 2363     device_replacement: '$1 $2'
 2364     brand_replacement: 'Infinix'
 2365     model_replacement: '$2'
 2366 
 2367   #########
 2368   # Informer
 2369   # @ref: ??
 2370   #########
 2371   - regex: '; *(Informer)[ \-]([^;/]+) Build'
 2372     device_replacement: '$1 $2'
 2373     brand_replacement: 'Informer'
 2374     model_replacement: '$2'
 2375 
 2376   #########
 2377   # Intenso
 2378   # @ref: http://www.intenso.de
 2379   # @models: 7":TAB 714,TAB 724;8":TAB 814,TAB 824;10":TAB 1004
 2380   #########
 2381   - regex: '; *(TAB) ?([78][12]4) Build'
 2382     device_replacement: 'Intenso $1'
 2383     brand_replacement: 'Intenso'
 2384     model_replacement: '$1 $2'
 2385 
 2386   #########
 2387   # Intex
 2388   # @ref: http://intexmobile.in/index.aspx
 2389   # @note: Zync also offers a "Cloud Z5" device
 2390   #########
 2391   # smartphones
 2392   - regex: '; *(?:Intex[ _])?(AQUA|Aqua)([ _\.\-])([^;/]+) *(?:Build|;)'
 2393     device_replacement: '$1$2$3'
 2394     brand_replacement: 'Intex'
 2395     model_replacement: '$1 $3'
 2396   # matches "INTEX CLOUD X1"
 2397   - regex: '; *(?:INTEX|Intex)(?:[_ ]([^\ _;/]+))(?:[_ ]([^\ _;/]+))? *(?:Build|;)'
 2398     device_replacement: '$1 $2'
 2399     brand_replacement: 'Intex'
 2400     model_replacement: '$1 $2'
 2401   # tablets
 2402   - regex: '; *([iI]Buddy)[ _]?(Connect)(?:_|\?_| )?([^;/]*) *(?:Build|;)'
 2403     device_replacement: '$1 $2 $3'
 2404     brand_replacement: 'Intex'
 2405     model_replacement: 'iBuddy $2 $3'
 2406   - regex: '; *(I-Buddy)[ _]([^;/]+) *(?:Build|;)'
 2407     device_replacement: '$1 $2'
 2408     brand_replacement: 'Intex'
 2409     model_replacement: 'iBuddy $2'
 2410 
 2411   #########
 2412   # iOCEAN
 2413   # @ref: http://www.iocean.cc/
 2414   #########
 2415   - regex: '; *(iOCEAN) ([^/]+) Build'
 2416     regex_flag: 'i'
 2417     device_replacement: '$1 $2'
 2418     brand_replacement: 'iOCEAN'
 2419     model_replacement: '$2'
 2420 
 2421   #########
 2422   # i.onik
 2423   # @ref: http://www.i-onik.de/
 2424   #########
 2425   - regex: '; *(TP\d+(?:\.\d+)?\-\d[^;/]+) Build'
 2426     device_replacement: 'ionik $1'
 2427     brand_replacement: 'ionik'
 2428     model_replacement: '$1'
 2429 
 2430   #########
 2431   # IRU.ru
 2432   # @ref: http://www.iru.ru/catalog/soho/planetable/
 2433   #########
 2434   - regex: '; *(M702pro) Build'
 2435     device_replacement: '$1'
 2436     brand_replacement: 'Iru'
 2437     model_replacement: '$1'
 2438 
 2439   #########
 2440   # Ivio
 2441   # @ref: http://www.ivio.com/mobile.php
 2442   # @models: DG80,DG20,DE38,DE88,MD70
 2443   #########
 2444   - regex: '; *(DE88Plus|MD70) Build'
 2445     device_replacement: '$1'
 2446     brand_replacement: 'Ivio'
 2447     model_replacement: '$1'
 2448   - regex: '; *IVIO[_\-]([^;/]+) Build'
 2449     device_replacement: '$1'
 2450     brand_replacement: 'Ivio'
 2451     model_replacement: '$1'
 2452 
 2453   #########
 2454   # Jaytech
 2455   # @ref: http://www.jay-tech.de/jaytech/servlet/frontend/
 2456   #########
 2457   - regex: '; *(TPC-\d+|JAY-TECH) Build'
 2458     device_replacement: '$1'
 2459     brand_replacement: 'Jaytech'
 2460     model_replacement: '$1'
 2461 
 2462   #########
 2463   # Jiayu
 2464   # @ref: http://www.ejiayu.com/en/Product.html
 2465   #########
 2466   - regex: '; *(JY-[^;/]+|G[234]S?) Build'
 2467     device_replacement: '$1'
 2468     brand_replacement: 'Jiayu'
 2469     model_replacement: '$1'
 2470 
 2471   #########
 2472   # JXD
 2473   # @ref: http://www.jxd.hk/
 2474   #########
 2475   - regex: '; *(JXD)[ _\-]([^;/]+) Build'
 2476     device_replacement: '$1 $2'
 2477     brand_replacement: 'JXD'
 2478     model_replacement: '$2'
 2479 
 2480   #########
 2481   # Karbonn
 2482   # @ref: http://www.karbonnmobiles.com/products_tablet.php
 2483   #########
 2484   - regex: '; *Karbonn[ _]?([^;/]+) *(?:Build|;)'
 2485     regex_flag: 'i'
 2486     device_replacement: '$1'
 2487     brand_replacement: 'Karbonn'
 2488     model_replacement: '$1'
 2489   - regex: '; *([^;]+) Build/Karbonn'
 2490     device_replacement: '$1'
 2491     brand_replacement: 'Karbonn'
 2492     model_replacement: '$1'
 2493   - regex: '; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\d) +Build'
 2494     device_replacement: '$1'
 2495     brand_replacement: 'Karbonn'
 2496     model_replacement: '$1'
 2497 
 2498   #########
 2499   # KDDI (Operator Branded Device)
 2500   # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
 2501   #########
 2502   - regex: '; *(IS01|IS03|IS05|IS\d{2}SH) Build'
 2503     device_replacement: '$1'
 2504     brand_replacement: 'Sharp'
 2505     model_replacement: '$1'
 2506   - regex: '; *(IS04) Build'
 2507     device_replacement: '$1'
 2508     brand_replacement: 'Regza'
 2509     model_replacement: '$1'
 2510   - regex: '; *(IS06|IS\d{2}PT) Build'
 2511     device_replacement: '$1'
 2512     brand_replacement: 'Pantech'
 2513     model_replacement: '$1'
 2514   - regex: '; *(IS11S) Build'
 2515     device_replacement: '$1'
 2516     brand_replacement: 'SonyEricsson'
 2517     model_replacement: 'Xperia Acro'
 2518   - regex: '; *(IS11CA) Build'
 2519     device_replacement: '$1'
 2520     brand_replacement: 'Casio'
 2521     model_replacement: 'GzOne $1'
 2522   - regex: '; *(IS11LG) Build'
 2523     device_replacement: '$1'
 2524     brand_replacement: 'LG'
 2525     model_replacement: 'Optimus X'
 2526   - regex: '; *(IS11N) Build'
 2527     device_replacement: '$1'
 2528     brand_replacement: 'Medias'
 2529     model_replacement: '$1'
 2530   - regex: '; *(IS11PT) Build'
 2531     device_replacement: '$1'
 2532     brand_replacement: 'Pantech'
 2533     model_replacement: 'MIRACH'
 2534   - regex: '; *(IS12F) Build'
 2535     device_replacement: '$1'
 2536     brand_replacement: 'Fujitsu'
 2537     model_replacement: 'Arrows ES'
 2538   # @ref: https://ja.wikipedia.org/wiki/IS12M
 2539   - regex: '; *(IS12M) Build'
 2540     device_replacement: '$1'
 2541     brand_replacement: 'Motorola'
 2542     model_replacement: 'XT909'
 2543   - regex: '; *(IS12S) Build'
 2544     device_replacement: '$1'
 2545     brand_replacement: 'SonyEricsson'
 2546     model_replacement: 'Xperia Acro HD'
 2547   - regex: '; *(ISW11F) Build'
 2548     device_replacement: '$1'
 2549     brand_replacement: 'Fujitsu'
 2550     model_replacement: 'Arrowz Z'
 2551   - regex: '; *(ISW11HT) Build'
 2552     device_replacement: '$1'
 2553     brand_replacement: 'HTC'
 2554     model_replacement: 'EVO'
 2555   - regex: '; *(ISW11K) Build'
 2556     device_replacement: '$1'
 2557     brand_replacement: 'Kyocera'
 2558     model_replacement: 'DIGNO'
 2559   - regex: '; *(ISW11M) Build'
 2560     device_replacement: '$1'
 2561     brand_replacement: 'Motorola'
 2562     model_replacement: 'Photon'
 2563   - regex: '; *(ISW11SC) Build'
 2564     device_replacement: '$1'
 2565     brand_replacement: 'Samsung'
 2566     model_replacement: 'GALAXY S II WiMAX'
 2567   - regex: '; *(ISW12HT) Build'
 2568     device_replacement: '$1'
 2569     brand_replacement: 'HTC'
 2570     model_replacement: 'EVO 3D'
 2571   - regex: '; *(ISW13HT) Build'
 2572     device_replacement: '$1'
 2573     brand_replacement: 'HTC'
 2574     model_replacement: 'J'
 2575   - regex: '; *(ISW?[0-9]{2}[A-Z]{0,2}) Build'
 2576     device_replacement: '$1'
 2577     brand_replacement: 'KDDI'
 2578     model_replacement: '$1'
 2579   - regex: '; *(INFOBAR [^;/]+) Build'
 2580     device_replacement: '$1'
 2581     brand_replacement: 'KDDI'
 2582     model_replacement: '$1'
 2583 
 2584   #########
 2585   # Kingcom
 2586   # @ref: http://www.e-kingcom.com
 2587   #########
 2588   - regex: '; *(JOYPAD|Joypad)[ _]([^;/]+) Build/'
 2589     device_replacement: '$1 $2'
 2590     brand_replacement: 'Kingcom'
 2591     model_replacement: '$1 $2'
 2592 
 2593   #########
 2594   # Kobo
 2595   # @ref: https://en.wikipedia.org/wiki/Kobo_Inc.
 2596   # @ref: http://www.kobo.com/devices#tablets
 2597   #########
 2598   - regex: '; *(Vox|VOX|Arc|K080) Build/'
 2599     regex_flag: 'i'
 2600     device_replacement: '$1'
 2601     brand_replacement: 'Kobo'
 2602     model_replacement: '$1'
 2603   - regex: '\b(Kobo Touch)\b'
 2604     device_replacement: '$1'
 2605     brand_replacement: 'Kobo'
 2606     model_replacement: '$1'
 2607 
 2608   #########
 2609   # K-Touch
 2610   # @ref: ??
 2611   #########
 2612   - regex: '; *(K-Touch)[ _]([^;/]+) Build'
 2613     regex_flag: 'i'
 2614     device_replacement: '$1 $2'
 2615     brand_replacement: 'Ktouch'
 2616     model_replacement: '$2'
 2617 
 2618   #########
 2619   # KT Tech
 2620   # @ref: http://www.kttech.co.kr
 2621   #########
 2622   - regex: '; *((?:EV|KM)-S\d+[A-Z]?) Build'
 2623     regex_flag: 'i'
 2624     device_replacement: '$1'
 2625     brand_replacement: 'KTtech'
 2626     model_replacement: '$1'
 2627 
 2628   #########
 2629   # Kyocera
 2630   # @ref: http://www.android.com/devices/?country=all&m=kyocera
 2631   #########
 2632   - regex: '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\d{2}) Build/'
 2633     device_replacement: '$1'
 2634     brand_replacement: 'Kyocera'
 2635     model_replacement: '$1'
 2636 
 2637   #########
 2638   # Lava
 2639   # @ref: http://www.lavamobiles.com/
 2640   #########
 2641   - regex: '; *(?:LAVA[ _])?IRIS[ _\-]?([^/;\)]+) *(?:;|\)|Build)'
 2642     regex_flag: 'i'
 2643     device_replacement: 'Iris $1'
 2644     brand_replacement: 'Lava'
 2645     model_replacement: 'Iris $1'
 2646   - regex: '; *LAVA[ _]([^;/]+) Build'
 2647     device_replacement: '$1'
 2648     brand_replacement: 'Lava'
 2649     model_replacement: '$1'
 2650 
 2651   #########
 2652   # Lemon
 2653   # @ref: http://www.lemonmobiles.com/products.php?type=1
 2654   #########
 2655   - regex: '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_? Build'
 2656     device_replacement: 'Lemon $1$2'
 2657     brand_replacement: 'Lemon'
 2658     model_replacement: '$1$2'
 2659 
 2660   #########
 2661   # Lenco
 2662   # @ref: http://www.lenco.com/c/tablets/
 2663   #########
 2664   - regex: '; *(TAB-1012) Build/'
 2665     device_replacement: 'Lenco $1'
 2666     brand_replacement: 'Lenco'
 2667     model_replacement: '$1'
 2668   - regex: '; Lenco ([^;/]+) Build/'
 2669     device_replacement: 'Lenco $1'
 2670     brand_replacement: 'Lenco'
 2671     model_replacement: '$1'
 2672 
 2673   #########
 2674   # Lenovo
 2675   # @ref: http://support.lenovo.com/en_GB/downloads/default.page?#
 2676   #########
 2677   - regex: '; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build'
 2678     device_replacement: '$1'
 2679     brand_replacement: 'Lenovo'
 2680     model_replacement: '$1'
 2681   - regex: '; *(Idea[Tp]ab)[ _]([^;/]+);? Build'
 2682     device_replacement: 'Lenovo $1 $2'
 2683     brand_replacement: 'Lenovo'
 2684     model_replacement: '$1 $2'
 2685   - regex: '; *(Idea(?:Tab|pad)) ?([^;/]+) Build'
 2686     device_replacement: 'Lenovo $1 $2'
 2687     brand_replacement: 'Lenovo'
 2688     model_replacement: '$1 $2'
 2689   - regex: '; *(ThinkPad) ?(Tablet) Build/'
 2690     device_replacement: 'Lenovo $1 $2'
 2691     brand_replacement: 'Lenovo'
 2692     model_replacement: '$1 $2'
 2693   - regex: '; *(?:LNV-)?(?:=?[Ll]enovo[ _\-]?|LENOVO[ _])+(.+?)(?:Build|[;/\)])'
 2694     device_replacement: 'Lenovo $1'
 2695     brand_replacement: 'Lenovo'
 2696     model_replacement: '$1'
 2697   - regex: '[;,] (?:Vodafone )?(SmartTab) ?(II) ?(\d+) Build/'
 2698     device_replacement: 'Lenovo $1 $2 $3'
 2699     brand_replacement: 'Lenovo'
 2700     model_replacement: '$1 $2 $3'
 2701   - regex: '; *(?:Ideapad )?K1 Build/'
 2702     device_replacement: 'Lenovo Ideapad K1'
 2703     brand_replacement: 'Lenovo'
 2704     model_replacement: 'Ideapad K1'
 2705   - regex: '; *(3GC101|3GW10[01]|A390) Build/'
 2706     device_replacement: '$1'
 2707     brand_replacement: 'Lenovo'
 2708     model_replacement: '$1'
 2709   - regex: '\b(?:Lenovo|LENOVO)+[ _\-]?([^,;:/ ]+)'
 2710     device_replacement: 'Lenovo $1'
 2711     brand_replacement: 'Lenovo'
 2712     model_replacement: '$1'
 2713 
 2714   #########
 2715   # Lexibook
 2716   # @ref: http://www.lexibook.com/fr
 2717   #########
 2718   - regex: '; *(MFC\d+)[A-Z]{2}([^;,/]*),? Build'
 2719     device_replacement: '$1$2'
 2720     brand_replacement: 'Lexibook'
 2721     model_replacement: '$1$2'
 2722 
 2723   #########
 2724   # LG
 2725   # @ref: http://www.lg.com/uk/mobile
 2726   #########
 2727   - regex: '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)'
 2728     device_replacement: '$1'
 2729     brand_replacement: 'LG'
 2730     model_replacement: '$1'
 2731   - regex: '[;:] *(L-\d+[A-Z]|LGL\d+[A-Z]?)(?:/V\d+)? *(?:Build|[;\)])'
 2732     device_replacement: '$1'
 2733     brand_replacement: 'LG'
 2734     model_replacement: '$1'
 2735   - regex: '; *(LG-)([A-Z]{1,2}\d{2,}[^,;/\)\(]*?)(?:Build| V\d+|[,;/\)\(]|$)'
 2736     device_replacement: '$1$2'
 2737     brand_replacement: 'LG'
 2738     model_replacement: '$2'
 2739   - regex: '; *(LG[ \-]|LG)([^;/]+)[;/]? Build'
 2740     device_replacement: '$1$2'
 2741     brand_replacement: 'LG'
 2742     model_replacement: '$2'
 2743   - regex: '^(LG)-([^;/]+)/ Mozilla/.*; Android'
 2744     device_replacement: '$1 $2'
 2745     brand_replacement: 'LG'
 2746     model_replacement: '$2'
 2747   - regex: '(Web0S); Linux/(SmartTV)'
 2748     device_replacement: 'LG $1 $2'
 2749     brand_replacement: 'LG'
 2750     model_replacement: '$1 $2'
 2751 
 2752   #########
 2753   # Malata
 2754   # @ref: http://www.malata.com/en/products.aspx?classid=680
 2755   #########
 2756   - regex: '; *((?:SMB|smb)[^;/]+) Build/'
 2757     device_replacement: '$1'
 2758     brand_replacement: 'Malata'
 2759     model_replacement: '$1'
 2760   - regex: '; *(?:Malata|MALATA) ([^;/]+) Build/'
 2761     device_replacement: '$1'
 2762     brand_replacement: 'Malata'
 2763     model_replacement: '$1'
 2764 
 2765   #########
 2766   # Manta
 2767   # @ref: http://www.manta.com.pl/en
 2768   #########
 2769   - regex: '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9]) Build/'
 2770     device_replacement: '$1'
 2771     brand_replacement: 'Manta'
 2772     model_replacement: '$1'
 2773 
 2774   #########
 2775   # Match
 2776   # @ref: http://www.match.net.cn/products.asp
 2777   #########
 2778   - regex: '; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980) Build/'
 2779     device_replacement: '$1'
 2780     brand_replacement: 'Match'
 2781     model_replacement: '$1'
 2782 
 2783   #########
 2784   # Maxx
 2785   # @ref: http://www.maxxmobile.in/
 2786   # @models: Maxx MSD7-Play, Maxx MX245+ Trance, Maxx AX8 Race, Maxx MSD7 3G- AX50, Maxx Genx Droid 7 - AX40, Maxx AX5 Duo,
 2787   #   Maxx AX3 Duo, Maxx AX3, Maxx AX8 Note II (Note 2), Maxx AX8 Note I, Maxx AX8, Maxx AX5 Plus, Maxx MSD7 Smarty,
 2788   #   Maxx AX9Z Race,
 2789   #   Maxx MT150, Maxx MQ601, Maxx M2020, Maxx Sleek MX463neo, Maxx MX525, Maxx MX192-Tune, Maxx Genx Droid 7 AX353,
 2790   # @note: Need more User-Agents!!!
 2791   #########
 2792   - regex: '; *(GenxDroid7|MSD7.*|AX\d.*|Tab 701|Tab 722) Build/'
 2793     device_replacement: 'Maxx $1'
 2794     brand_replacement: 'Maxx'
 2795     model_replacement: '$1'
 2796 
 2797   #########
 2798   # Mediacom
 2799   # @ref: http://www.mediacomeurope.it/
 2800   #########
 2801   - regex: '; *(M-PP[^;/]+|PhonePad ?\d{2,}[^;/]+) Build'
 2802     device_replacement: 'Mediacom $1'
 2803     brand_replacement: 'Mediacom'
 2804     model_replacement: '$1'
 2805   - regex: '; *(M-MP[^;/]+|SmartPad ?\d{2,}[^;/]+) Build'
 2806     device_replacement: 'Mediacom $1'
 2807     brand_replacement: 'Mediacom'
 2808     model_replacement: '$1'
 2809 
 2810   #########
 2811   # Medion
 2812   # @ref: http://www.medion.com/en/
 2813   #########
 2814   - regex: '; *(?:MD_)?LIFETAB[ _]([^;/]+) Build'
 2815     regex_flag: 'i'
 2816     device_replacement: 'Medion Lifetab $1'
 2817     brand_replacement: 'Medion'
 2818     model_replacement: 'Lifetab $1'
 2819   - regex: '; *MEDION ([^;/]+) Build'
 2820     device_replacement: 'Medion $1'
 2821     brand_replacement: 'Medion'
 2822     model_replacement: '$1'
 2823 
 2824   #########
 2825   # Meizu
 2826   # @ref: http://www.meizu.com
 2827   #########
 2828   - regex: '; *(M030|M031|M035|M040|M065|m9) Build'
 2829     device_replacement: 'Meizu $1'
 2830     brand_replacement: 'Meizu'
 2831     model_replacement: '$1'
 2832   - regex: '; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\)])'
 2833     device_replacement: 'Meizu $1'
 2834     brand_replacement: 'Meizu'
 2835     model_replacement: '$1'
 2836 
 2837   #########
 2838   # Micromax
 2839   # @ref: http://www.micromaxinfo.com
 2840   #########
 2841   - regex: '; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build'
 2842     regex_flag: 'i'
 2843     device_replacement: 'Micromax $1$2'
 2844     brand_replacement: 'Micromax'
 2845     model_replacement: '$1$2'
 2846   - regex: '; *Micromax[ _](A\d{2,3}[^;/]*) Build'
 2847     regex_flag: 'i'
 2848     device_replacement: 'Micromax $1'
 2849     brand_replacement: 'Micromax'
 2850     model_replacement: '$1'
 2851   # be careful here with Acer e.g. A500
 2852   - regex: '; *(A\d{2}|A[12]\d{2}|A90S|A110Q) Build'
 2853     regex_flag: 'i'
 2854     device_replacement: 'Micromax $1'
 2855     brand_replacement: 'Micromax'
 2856     model_replacement: '$1'
 2857   - regex: '; *Micromax[ _](P\d{3}[^;/]*) Build'
 2858     regex_flag: 'i'
 2859     device_replacement: 'Micromax $1'
 2860     brand_replacement: 'Micromax'
 2861     model_replacement: '$1'
 2862   - regex: '; *(P\d{3}|P\d{3}\(Funbook\)) Build'
 2863     regex_flag: 'i'
 2864     device_replacement: 'Micromax $1'
 2865     brand_replacement: 'Micromax'
 2866     model_replacement: '$1'
 2867 
 2868   #########
 2869   # Mito
 2870   # @ref: http://new.mitomobile.com/
 2871   #########
 2872   - regex: '; *(MITO)[ _\-]?([^;/]+) Build'
 2873     regex_flag: 'i'
 2874     device_replacement: '$1 $2'
 2875     brand_replacement: 'Mito'
 2876     model_replacement: '$2'
 2877 
 2878   #########
 2879   # Mobistel
 2880   # @ref: http://www.mobistel.com/
 2881   #########
 2882   - regex: '; *(Cynus)[ _](F5|T\d|.+?) *(?:Build|[;/\)])'
 2883     regex_flag: 'i'
 2884     device_replacement: '$1 $2'
 2885     brand_replacement: 'Mobistel'
 2886     model_replacement: '$1 $2'
 2887 
 2888   #########
 2889   # Modecom
 2890   # @ref: http://www.modecom.eu/tablets/portal/
 2891   #########
 2892   - regex: '; *(MODECOM )?(FreeTab) ?([^;/]+) Build'
 2893     regex_flag: 'i'
 2894     device_replacement: '$1$2 $3'
 2895     brand_replacement: 'Modecom'
 2896     model_replacement: '$2 $3'
 2897   - regex: '; *(MODECOM )([^;/]+) Build'
 2898     regex_flag: 'i'
 2899     device_replacement: '$1 $2'
 2900     brand_replacement: 'Modecom'
 2901     model_replacement: '$2'
 2902 
 2903   #########
 2904   # Motorola
 2905   # @ref: http://www.motorola.com/us/shop-all-mobile-phones/
 2906   #########
 2907   - regex: '; *(MZ\d{3}\+?|MZ\d{3} 4G|Xoom|XOOM[^;/]*) Build'
 2908     device_replacement: 'Motorola $1'
 2909     brand_replacement: 'Motorola'
 2910     model_replacement: '$1'
 2911   - regex: '; *(Milestone )(XT[^;/]*) Build'
 2912     device_replacement: 'Motorola $1$2'
 2913     brand_replacement: 'Motorola'
 2914     model_replacement: '$2'
 2915   - regex: '; *(Motoroi ?x|Droid X|DROIDX) Build'
 2916     regex_flag: 'i'
 2917     device_replacement: 'Motorola $1'
 2918     brand_replacement: 'Motorola'
 2919     model_replacement: 'DROID X'
 2920   - regex: '; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build'
 2921     device_replacement: 'Motorola $1'
 2922     brand_replacement: 'Motorola'
 2923     model_replacement: '$1'
 2924   - regex: '; *(A555|A85[34][^;/]*|A95[356]|ME[58]\d{2}\+?|ME600|ME632|ME722|MB\d{3}\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\d{3,4}[A-Z\+]*|CL[iI]Q|CL[iI]Q XT) Build'
 2925     device_replacement: '$1'
 2926     brand_replacement: 'Motorola'
 2927     model_replacement: '$1'
 2928   - regex: '; *(Motorola MOT-|Motorola[ _\-]|MOT\-?)([^;/]+) Build'
 2929     device_replacement: '$1$2'
 2930     brand_replacement: 'Motorola'
 2931     model_replacement: '$2'
 2932   - regex: '; *(Moto[_ ]?|MOT\-)([^;/]+) Build'
 2933     device_replacement: '$1$2'
 2934     brand_replacement: 'Motorola'
 2935     model_replacement: '$2'
 2936 
 2937   #########
 2938   # MpMan
 2939   # @ref: http://www.mpmaneurope.com
 2940   #########
 2941   - regex: '; *((?:MP[DQ]C|MPG\d{1,4}|MP\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*) Build'
 2942     device_replacement: '$1'
 2943     brand_replacement: 'Mpman'
 2944     model_replacement: '$1'
 2945 
 2946   #########
 2947   # MSI
 2948   # @ref: http://www.msi.com/product/windpad/
 2949   #########
 2950   - regex: '; *(?:MSI[ _])?(Primo\d+|Enjoy[ _\-][^;/]+) Build'
 2951     regex_flag: 'i'
 2952     device_replacement: '$1'
 2953     brand_replacement: 'Msi'
 2954     model_replacement: '$1'
 2955 
 2956   #########
 2957   # Multilaser
 2958   # http://www.multilaser.com.br/listagem_produtos.php?cat=5
 2959   #########
 2960   - regex: '; *Multilaser[ _]([^;/]+) Build'
 2961     device_replacement: '$1'
 2962     brand_replacement: 'Multilaser'
 2963     model_replacement: '$1'
 2964 
 2965   #########
 2966   # MyPhone
 2967   # @ref: http://myphone.com.ph/
 2968   #########
 2969   - regex: '; *(My)[_]?(Pad)[ _]([^;/]+) Build'
 2970     device_replacement: '$1$2 $3'
 2971     brand_replacement: 'MyPhone'
 2972     model_replacement: '$1$2 $3'
 2973   - regex: '; *(My)\|?(Phone)[ _]([^;/]+) Build'
 2974     device_replacement: '$1$2 $3'
 2975     brand_replacement: 'MyPhone'
 2976     model_replacement: '$3'
 2977   - regex: '; *(A\d+)[ _](Duo)? Build'
 2978     regex_flag: 'i'
 2979     device_replacement: '$1 $2'
 2980     brand_replacement: 'MyPhone'
 2981     model_replacement: '$1 $2'
 2982 
 2983   #########
 2984   # Mytab
 2985   # @ref: http://www.mytab.eu/en/category/mytab-products/
 2986   #########
 2987   - regex: '; *(myTab[^;/]*) Build'
 2988     device_replacement: '$1'
 2989     brand_replacement: 'Mytab'
 2990     model_replacement: '$1'
 2991 
 2992   #########
 2993   # Nabi
 2994   # @ref: https://www.nabitablet.com
 2995   #########
 2996   - regex: '; *(NABI2?-)([^;/]+) Build/'
 2997     device_replacement: '$1$2'
 2998     brand_replacement: 'Nabi'
 2999     model_replacement: '$2'
 3000 
 3001   #########
 3002   # Nec Medias
 3003   # @ref: http://www.n-keitai.com/
 3004   #########
 3005   - regex: '; *(N-\d+[CDE]) Build/'
 3006     device_replacement: '$1'
 3007     brand_replacement: 'Nec'
 3008     model_replacement: '$1'
 3009   - regex: '; ?(NEC-)(.*) Build/'
 3010     device_replacement: '$1$2'
 3011     brand_replacement: 'Nec'
 3012     model_replacement: '$2'
 3013   - regex: '; *(LT-NA7) Build/'
 3014     device_replacement: '$1'
 3015     brand_replacement: 'Nec'
 3016     model_replacement: 'Lifetouch Note'
 3017 
 3018   #########
 3019   # Nextbook
 3020   # @ref: http://nextbookusa.com
 3021   #########
 3022   - regex: '; *(NXM\d+[A-z0-9_]*|Next\d[A-z0-9_ \-]*|NEXT\d[A-z0-9_ \-]*|Nextbook [A-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\);])'
 3023     device_replacement: '$1'
 3024     brand_replacement: 'Nextbook'
 3025     model_replacement: '$1'
 3026 
 3027   #########
 3028   # Nokia
 3029   # @ref: http://www.nokia.com
 3030   #########
 3031   - regex: '; *(Nokia)([ _\-]*)([^;/]*) Build'
 3032     regex_flag: 'i'
 3033     device_replacement: '$1$2$3'
 3034     brand_replacement: 'Nokia'
 3035     model_replacement: '$3'
 3036 
 3037   #########
 3038   # Nook
 3039   # @ref:
 3040   # TODO nook browser/1.0
 3041   #########
 3042   - regex: '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+) Build'
 3043     device_replacement: '$1$2'
 3044     brand_replacement: 'Nook'
 3045     model_replacement: '$2'
 3046   - regex: '; *(NOOK )?(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build'
 3047     device_replacement: '$1$2'
 3048     brand_replacement: 'Nook'
 3049     model_replacement: '$2'
 3050   - regex: '; Build/(Nook)'
 3051     device_replacement: '$1'
 3052     brand_replacement: 'Nook'
 3053     model_replacement: 'Tablet'
 3054 
 3055   #########
 3056   # Olivetti
 3057   # @ref: http://www.olivetti.de/EN/Page/t02/view_html?idp=348
 3058   #########
 3059   - regex: '; *(OP110|OliPad[^;/]+) Build'
 3060     device_replacement: 'Olivetti $1'
 3061     brand_replacement: 'Olivetti'
 3062     model_replacement: '$1'
 3063 
 3064   #########
 3065   # Omega
 3066   # @ref: http://omega-technology.eu/en/produkty/346/tablets
 3067   # @note: MID tablets might get matched by CobyKyros first
 3068   # @models: (T107|MID(?:700[2-5]|7031|7108|7132|750[02]|8001|8500|9001|971[12])
 3069   #########
 3070   - regex: '; *OMEGA[ _\-](MID[^;/]+) Build'
 3071     device_replacement: 'Omega $1'
 3072     brand_replacement: 'Omega'
 3073     model_replacement: '$1'
 3074   - regex: '^(MID7500|MID\d+) Mozilla/5\.0 \(iPad;'
 3075     device_replacement: 'Omega $1'
 3076     brand_replacement: 'Omega'
 3077     model_replacement: '$1'
 3078 
 3079   #########
 3080   # OpenPeak
 3081   # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
 3082   #########
 3083   - regex: '; *((?:CIUS|cius)[^;/]*) Build'
 3084     device_replacement: 'Openpeak $1'
 3085     brand_replacement: 'Openpeak'
 3086     model_replacement: '$1'
 3087 
 3088   #########
 3089   # Oppo
 3090   # @ref: http://en.oppo.com/products/
 3091   #########
 3092   - regex: '; *(Find ?(?:5|7a)|R8[012]\d{1,2}|T703\d{0,1}|U70\d{1,2}T?|X90\d{1,2}) Build'
 3093     device_replacement: 'Oppo $1'
 3094     brand_replacement: 'Oppo'
 3095     model_replacement: '$1'
 3096   - regex: '; *OPPO ?([^;/]+) Build/'
 3097     device_replacement: 'Oppo $1'
 3098     brand_replacement: 'Oppo'
 3099     model_replacement: '$1'
 3100 
 3101   #########
 3102   # Odys
 3103   # @ref: http://odys.de
 3104   #########
 3105   - regex: '; *(?:Odys\-|ODYS\-|ODYS )([^;/]+) Build'
 3106     device_replacement: 'Odys $1'
 3107     brand_replacement: 'Odys'
 3108     model_replacement: '$1'
 3109   - regex: '; *(SELECT) ?(7) Build'
 3110     device_replacement: 'Odys $1 $2'
 3111     brand_replacement: 'Odys'
 3112     model_replacement: '$1 $2'
 3113   - regex: '; *(PEDI)_(PLUS)_(W) Build'
 3114     device_replacement: 'Odys $1 $2 $3'
 3115     brand_replacement: 'Odys'
 3116     model_replacement: '$1 $2 $3'
 3117   # Weltbild - Tablet PC 4 = Cat Phoenix = Odys Tablet PC 4?
 3118   - regex: '; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\d+ ?[Pp]ro|XENO10|XPRESS PRO) Build'
 3119     device_replacement: 'Odys $1'
 3120     brand_replacement: 'Odys'
 3121     model_replacement: '$1'
 3122 
 3123   #########
 3124   # OnePlus
 3125   # @ref https://oneplus.net/
 3126   #########
 3127   - regex: '; (ONE [a-zA-Z]\d+) Build/'
 3128     device_replacement: 'OnePlus $1'
 3129     brand_replacement: 'OnePlus'
 3130     model_replacement: '$1'
 3131   - regex: '; (ONEPLUS [a-zA-Z]\d+) Build/'
 3132     device_replacement: 'OnePlus $1'
 3133     brand_replacement: 'OnePlus'
 3134     model_replacement: '$1'
 3135 
 3136   #########
 3137   # Orion
 3138   # @ref: http://www.orion.ua/en/products/computer-products/tablet-pcs.html
 3139   #########
 3140   - regex: '; *(TP-\d+) Build/'
 3141     device_replacement: 'Orion $1'
 3142     brand_replacement: 'Orion'
 3143     model_replacement: '$1'
 3144 
 3145   #########
 3146   # PackardBell
 3147   # @ref: http://www.packardbell.com/pb/en/AE/content/productgroup/tablets
 3148   #########
 3149   - regex: '; *(G100W?) Build/'
 3150     device_replacement: 'PackardBell $1'
 3151     brand_replacement: 'PackardBell'
 3152     model_replacement: '$1'
 3153 
 3154   #########
 3155   # Panasonic
 3156   # @ref: http://panasonic.jp/mobile/
 3157   # @models: T11, T21, T31, P11, P51, Eluga Power, Eluga DL1
 3158   # @models: (tab) Toughpad FZ-A1, Toughpad JT-B1
 3159   #########
 3160   - regex: '; *(Panasonic)[_ ]([^;/]+) Build'
 3161     device_replacement: '$1 $2'
 3162     brand_replacement: '$1'
 3163     model_replacement: '$2'
 3164   # Toughpad
 3165   - regex: '; *(FZ-A1B|JT-B1) Build'
 3166     device_replacement: 'Panasonic $1'
 3167     brand_replacement: 'Panasonic'
 3168     model_replacement: '$1'
 3169   # Eluga Power
 3170   - regex: '; *(dL1|DL1) Build'
 3171     device_replacement: 'Panasonic $1'
 3172     brand_replacement: 'Panasonic'
 3173     model_replacement: '$1'
 3174 
 3175   #########
 3176   # Pantech
 3177   # @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=PANTECH
 3178   # @href: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA
 3179   # @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
 3180   #########
 3181   - regex: '; *(SKY[ _])?(IM\-[AT]\d{3}[^;/]+).* Build/'
 3182     device_replacement: 'Pantech $1$2'
 3183     brand_replacement: 'Pantech'
 3184     model_replacement: '$1$2'
 3185   - regex: '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G)?) Build/'
 3186     device_replacement: '$1'
 3187     brand_replacement: 'Pantech'
 3188     model_replacement: '$1'
 3189   - regex: '; *Pantech([^;/]+).* Build/'
 3190     device_replacement: 'Pantech $1'
 3191     brand_replacement: 'Pantech'
 3192     model_replacement: '$1'
 3193 
 3194   #########
 3195   # Papayre
 3196   # @ref: http://grammata.es/
 3197   #########
 3198   - regex: '; *(papyre)[ _\-]([^;/]+) Build/'
 3199     regex_flag: 'i'
 3200     device_replacement: '$1 $2'
 3201     brand_replacement: 'Papyre'
 3202     model_replacement: '$2'
 3203 
 3204   #########
 3205   # Pearl
 3206   # @ref: http://www.pearl.de/c-1540.shtml
 3207   #########
 3208   - regex: '; *(?:Touchlet )?(X10\.[^;/]+) Build/'
 3209     device_replacement: 'Pearl $1'
 3210     brand_replacement: 'Pearl'
 3211     model_replacement: '$1'
 3212 
 3213   #########
 3214   # Phicomm
 3215   # @ref: http://www.phicomm.com.cn/
 3216   #########
 3217   - regex: '; PHICOMM (i800) Build/'
 3218     device_replacement: 'Phicomm $1'
 3219     brand_replacement: 'Phicomm'
 3220     model_replacement: '$1'
 3221   - regex: '; PHICOMM ([^;/]+) Build/'
 3222     device_replacement: 'Phicomm $1'
 3223     brand_replacement: 'Phicomm'
 3224     model_replacement: '$1'
 3225   - regex: '; *(FWS\d{3}[^;/]+) Build/'
 3226     device_replacement: 'Phicomm $1'
 3227     brand_replacement: 'Phicomm'
 3228     model_replacement: '$1'
 3229 
 3230   #########
 3231   # Philips
 3232   # @ref: http://www.support.philips.com/support/catalog/products.jsp?_dyncharset=UTF-8&country=&categoryid=MOBILE_PHONES_SMART_SU_CN_CARE&userLanguage=en&navCount=2&groupId=PC_PRODUCTS_AND_PHONES_GR_CN_CARE&catalogType=&navAction=push&userCountry=cn&title=Smartphones&cateId=MOBILE_PHONES_CA_CN_CARE
 3233   # @TODO: Philips Tablets User-Agents missing!
 3234   # @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
 3235   #########
 3236   # @note: this a best guess according to available philips models. Need more User-Agents
 3237   - regex: '; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930) Build'
 3238     device_replacement: '$1'
 3239     brand_replacement: 'Philips'
 3240     model_replacement: '$1'
 3241   - regex: '; *(?:Philips|PHILIPS)[ _]([^;/]+) Build'
 3242     device_replacement: 'Philips $1'
 3243     brand_replacement: 'Philips'
 3244     model_replacement: '$1'
 3245 
 3246   #########
 3247   # Pipo
 3248   # @ref: http://www.pipo.cn/En/
 3249   #########
 3250   - regex: 'Android 4\..*; *(M[12356789]|U[12368]|S[123])\ ?(pro)? Build'
 3251     device_replacement: 'Pipo $1$2'
 3252     brand_replacement: 'Pipo'
 3253     model_replacement: '$1$2'
 3254 
 3255   #########
 3256   # Ployer
 3257   # @ref: http://en.ployer.cn/
 3258   #########
 3259   - regex: '; *(MOMO[^;/]+) Build'
 3260     device_replacement: '$1'
 3261     brand_replacement: 'Ployer'
 3262     model_replacement: '$1'
 3263 
 3264   #########
 3265   # Polaroid/ Acho
 3266   # @ref: http://polaroidstore.com/store/start.asp?category_id=382&category_id2=0&order=title&filter1=&filter2=&filter3=&view=all
 3267   #########
 3268   - regex: '; *(?:Polaroid[ _])?((?:MIDC\d{3,}|PMID\d{2,}|PTAB\d{3,})[^;/]*)(\/[^;/]*)? Build/'
 3269     device_replacement: '$1'
 3270     brand_replacement: 'Polaroid'
 3271     model_replacement: '$1'
 3272   - regex: '; *(?:Polaroid )(Tablet) Build/'
 3273     device_replacement: '$1'
 3274     brand_replacement: 'Polaroid'
 3275     model_replacement: '$1'
 3276 
 3277   #########
 3278   # Pomp
 3279   # @ref: http://pompmobileshop.com/
 3280   #########
 3281   #~ TODO
 3282   - regex: '; *(POMP)[ _\-](.+?) *(?:Build|[;/\)])'
 3283     device_replacement: '$1 $2'
 3284     brand_replacement: 'Pomp'
 3285     model_replacement: '$2'
 3286 
 3287   #########
 3288   # Positivo
 3289   # @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/
 3290   #########
 3291   - regex: '; *(TB07STA|TB10STA|TB07FTA|TB10FTA) Build/'
 3292     device_replacement: '$1'
 3293     brand_replacement: 'Positivo'
 3294     model_replacement: '$1'
 3295   - regex: '; *(?:Positivo )?((?:YPY|Ypy)[^;/]+) Build/'
 3296     device_replacement: '$1'
 3297     brand_replacement: 'Positivo'
 3298     model_replacement: '$1'
 3299 
 3300   #########
 3301   # POV
 3302   # @ref: http://www.pointofview-online.com/default2.php
 3303   # @TODO: Smartphone Models MOB-3515, MOB-5045-B missing
 3304   #########
 3305   - regex: '; *(MOB-[^;/]+) Build/'
 3306     device_replacement: '$1'
 3307     brand_replacement: 'POV'
 3308     model_replacement: '$1'
 3309   - regex: '; *POV[ _\-]([^;/]+) Build/'
 3310     device_replacement: 'POV $1'
 3311     brand_replacement: 'POV'
 3312     model_replacement: '$1'
 3313   - regex: '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\-]|TAB-P)[^;/]*) Build/'
 3314     device_replacement: 'POV $1'
 3315     brand_replacement: 'POV'
 3316     model_replacement: '$1'
 3317 
 3318   #########
 3319   # Prestigio
 3320   # @ref: http://www.prestigio.com/catalogue/MultiPhones
 3321   # @ref: http://www.prestigio.com/catalogue/MultiPads
 3322   #########
 3323   - regex: '; *(?:Prestigio )?((?:PAP|PMP)\d[^;/]+) Build/'
 3324     device_replacement: 'Prestigio $1'
 3325     brand_replacement: 'Prestigio'
 3326     model_replacement: '$1'
 3327 
 3328   #########
 3329   # Proscan
 3330   # @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr=
 3331   #########
 3332   - regex: '; *(PLT[0-9]{4}.*) Build/'
 3333     device_replacement: '$1'
 3334     brand_replacement: 'Proscan'
 3335     model_replacement: '$1'
 3336 
 3337   #########
 3338   # QMobile
 3339   # @ref: http://www.qmobile.com.pk/
 3340   #########
 3341   - regex: '; *(A2|A5|A8|A900)_?(Classic)? Build'
 3342     device_replacement: '$1 $2'
 3343     brand_replacement: 'Qmobile'
 3344     model_replacement: '$1 $2'
 3345   - regex: '; *(Q[Mm]obile)_([^_]+)_([^_]+) Build'
 3346     device_replacement: 'Qmobile $2 $3'
 3347     brand_replacement: 'Qmobile'
 3348     model_replacement: '$2 $3'
 3349   - regex: '; *(Q\-?[Mm]obile)[_ ](A[^;/]+) Build'
 3350     device_replacement: 'Qmobile $2'
 3351     brand_replacement: 'Qmobile'
 3352     model_replacement: '$2'
 3353 
 3354   #########
 3355   # Qmobilevn
 3356   # @ref: http://qmobile.vn/san-pham.html
 3357   #########
 3358   - regex: '; *(Q\-Smart)[ _]([^;/]+) Build/'
 3359     device_replacement: '$1 $2'
 3360     brand_replacement: 'Qmobilevn'
 3361     model_replacement: '$2'
 3362   - regex: '; *(Q\-?[Mm]obile)[ _\-](S[^;/]+) Build/'
 3363     device_replacement: '$1 $2'
 3364     brand_replacement: 'Qmobilevn'
 3365     model_replacement: '$2'
 3366 
 3367   #########
 3368   # Quanta
 3369   # @ref: ?
 3370   #########
 3371   - regex: '; *(TA1013) Build'
 3372     device_replacement: '$1'
 3373     brand_replacement: 'Quanta'
 3374     model_replacement: '$1'
 3375 
 3376   #########
 3377   # RCA
 3378   # @ref: http://rcamobilephone.com/
 3379   #########
 3380   - regex: '; (RCT\w+) Build/'
 3381     device_replacement: '$1'
 3382     brand_replacement: 'RCA'
 3383     model_replacement: '$1'
 3384 
 3385   #########
 3386   # Rockchip
 3387   # @ref: http://www.rock-chips.com/a/cn/product/index.html
 3388   # @note: manufacturer sells chipsets - I assume that these UAs are dev-boards
 3389   #########
 3390   - regex: '; *(RK\d+),? Build/'
 3391     device_replacement: '$1'
 3392     brand_replacement: 'Rockchip'
 3393     model_replacement: '$1'
 3394   - regex: ' Build/(RK\d+)'
 3395     device_replacement: '$1'
 3396     brand_replacement: 'Rockchip'
 3397     model_replacement: '$1'
 3398 
 3399   #########
 3400   # Samsung Android Devices
 3401   # @ref: http://www.samsung.com/us/mobile/cell-phones/all-products
 3402   #########
 3403   - regex: '; *(SAMSUNG |Samsung )?((?:Galaxy (?:Note II|S\d)|GT-I9082|GT-I9205|GT-N7\d{3}|SM-N9005)[^;/]*)\/?[^;/]* Build/'
 3404     device_replacement: 'Samsung $1$2'
 3405     brand_replacement: 'Samsung'
 3406     model_replacement: '$2'
 3407   - regex: '; *(Google )?(Nexus [Ss](?: 4G)?) Build/'
 3408     device_replacement: 'Samsung $1$2'
 3409     brand_replacement: 'Samsung'
 3410     model_replacement: '$2'
 3411   - regex: '; *(SAMSUNG |Samsung )([^\/]*)\/[^ ]* Build/'
 3412     device_replacement: 'Samsung $2'
 3413     brand_replacement: 'Samsung'
 3414     model_replacement: '$2'
 3415   - regex: '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G)?) Build/'
 3416     device_replacement: 'Samsung $1'
 3417     brand_replacement: 'Samsung'
 3418     model_replacement: '$1'
 3419   - regex: '; *(SAMSUNG[ _\-] *)+([^;/]+) Build'
 3420     device_replacement: 'Samsung $2'
 3421     brand_replacement: 'Samsung'
 3422     model_replacement: '$2'
 3423   - regex: '; *(SAMSUNG-)?(GT\-[BINPS]\d{4}[^\/]*)(\/[^ ]*) Build'
 3424     device_replacement: 'Samsung $1$2$3'
 3425     brand_replacement: 'Samsung'
 3426     model_replacement: '$2'
 3427   - regex: '(?:; *|^)((?:GT\-[BIiNPS]\d{4}|I9\d{2}0[A-Za-z\+]?\b)[^;/\)]*?)(?:Build|Linux|MIUI|[;/\)])'
 3428     device_replacement: 'Samsung $1'
 3429     brand_replacement: 'Samsung'
 3430     model_replacement: '$1'
 3431   - regex: '; (SAMSUNG-)([A-Za-z0-9\-]+).* Build/'
 3432     device_replacement: 'Samsung $1$2'
 3433     brand_replacement: 'Samsung'
 3434     model_replacement: '$2'
 3435   - regex: '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\-[A-Za-z0-9 ]+)(/?[^ ]*)? Build'
 3436     device_replacement: 'Samsung $1'
 3437     brand_replacement: 'Samsung'
 3438     model_replacement: '$1'
 3439   - regex: ' ((?:SCH)\-[A-Za-z0-9 ]+)(/?[^ ]*)? Build'
 3440     device_replacement: 'Samsung $1'
 3441     brand_replacement: 'Samsung'
 3442     model_replacement: '$1'
 3443   - regex: '; *(Behold ?(?:2|II)|YP\-G[^;/]+|EK-GC100|SCL21|I9300) Build'
 3444     device_replacement: 'Samsung $1'
 3445     brand_replacement: 'Samsung'
 3446     model_replacement: '$1'
 3447 
 3448   #########
 3449   # Sharp
 3450   # @ref: http://www.sharp-phone.com/en/index.html
 3451   # @ref: http://www.android.com/devices/?country=all&m=sharp
 3452   #########
 3453   - regex: '; *(SH\-?\d\d[^;/]+|SBM\d[^;/]+) Build'
 3454     device_replacement: '$1'
 3455     brand_replacement: 'Sharp'
 3456     model_replacement: '$1'
 3457   - regex: '; *(SHARP[ -])([^;/]+) Build'
 3458     device_replacement: '$1$2'
 3459     brand_replacement: 'Sharp'
 3460     model_replacement: '$2'
 3461 
 3462   #########
 3463   # Simvalley
 3464   # @ref: http://www.simvalley-mobile.de/
 3465   #########
 3466   - regex: '; *(SPX[_\-]\d[^;/]*) Build/'
 3467     device_replacement: '$1'
 3468     brand_replacement: 'Simvalley'
 3469     model_replacement: '$1'
 3470   - regex: '; *(SX7\-PEARL\.GmbH) Build/'
 3471     device_replacement: '$1'
 3472     brand_replacement: 'Simvalley'
 3473     model_replacement: '$1'
 3474   - regex: '; *(SP[T]?\-\d{2}[^;/]*) Build/'
 3475     device_replacement: '$1'
 3476     brand_replacement: 'Simvalley'
 3477     model_replacement: '$1'
 3478 
 3479   #########
 3480   # SK Telesys
 3481   # @ref: http://www.sk-w.com/phone/phone_list.jsp
 3482   # @ref: http://www.android.com/devices/?country=all&m=sk-telesys
 3483   #########
 3484   - regex: '; *(SK\-.*) Build/'
 3485     device_replacement: '$1'
 3486     brand_replacement: 'SKtelesys'
 3487     model_replacement: '$1'
 3488 
 3489   #########
 3490   # Skytex
 3491   # @ref: http://skytex.com/android
 3492   #########
 3493   - regex: '; *(?:SKYTEX|SX)-([^;/]+) Build'
 3494     device_replacement: '$1'
 3495     brand_replacement: 'Skytex'
 3496     model_replacement: '$1'
 3497   - regex: '; *(IMAGINE [^;/]+) Build'
 3498     device_replacement: '$1'
 3499     brand_replacement: 'Skytex'
 3500     model_replacement: '$1'
 3501 
 3502   #########
 3503   # SmartQ
 3504   # @ref: http://en.smartdevices.com.cn/Products/
 3505   # @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
 3506   #########
 3507   - regex: '; *(SmartQ) ?([^;/]+) Build/'
 3508     device_replacement: '$1 $2'
 3509     brand_replacement: '$1'
 3510     model_replacement: '$2'
 3511 
 3512   #########
 3513   # Smartbitt
 3514   # @ref: http://www.smartbitt.com/
 3515   # @missing: SBT Useragents
 3516   #########
 3517   - regex: '; *(WF7C|WF10C|SBT[^;/]+) Build'
 3518     device_replacement: '$1'
 3519     brand_replacement: 'Smartbitt'
 3520     model_replacement: '$1'
 3521 
 3522   #########
 3523   # Softbank (Operator Branded Devices)
 3524   # @ref: http://www.ipentec.com/document/document.aspx?page=android-useragent
 3525   #########
 3526   - regex: '; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build'
 3527     device_replacement: '$1'
 3528     brand_replacement: 'Sharp'
 3529     model_replacement: '$1'
 3530   - regex: '; *(003P|101P|101P11C|102P) Build'
 3531     device_replacement: '$1'
 3532     brand_replacement: 'Panasonic'
 3533     model_replacement: '$1'
 3534   - regex: '; *(00\dZ) Build/'
 3535     device_replacement: '$1'
 3536     brand_replacement: 'ZTE'
 3537     model_replacement: '$1'
 3538   - regex: '; HTC(X06HT) Build'
 3539     device_replacement: '$1'
 3540     brand_replacement: 'HTC'
 3541     model_replacement: '$1'
 3542   - regex: '; *(001HT|X06HT) Build'
 3543     device_replacement: '$1'
 3544     brand_replacement: 'HTC'
 3545     model_replacement: '$1'
 3546   - regex: '; *(201M) Build'
 3547     device_replacement: '$1'
 3548     brand_replacement: 'Motorola'
 3549     model_replacement: 'XT902'
 3550 
 3551   #########
 3552   # Trekstor
 3553   # @ref: http://www.trekstor.co.uk/surftabs-en.html
 3554   # @note: Must come before SonyEricsson
 3555   #########
 3556   - regex: '; *(ST\d{4}.*)Build/ST'
 3557     device_replacement: 'Trekstor $1'
 3558     brand_replacement: 'Trekstor'
 3559     model_replacement: '$1'
 3560   - regex: '; *(ST\d{4}.*) Build/'
 3561     device_replacement: 'Trekstor $1'
 3562     brand_replacement: 'Trekstor'
 3563     model_replacement: '$1'
 3564 
 3565   #########
 3566   # SonyEricsson
 3567   # @note: Must come before nokia since they also use symbian
 3568   # @ref: http://www.android.com/devices/?country=all&m=sony-ericssons
 3569   # @TODO: type!
 3570   #########
 3571   # android matchers
 3572   - regex: '; *(Sony ?Ericsson ?)([^;/]+) Build'
 3573     device_replacement: '$1$2'
 3574     brand_replacement: 'SonyEricsson'
 3575     model_replacement: '$2'
 3576   - regex: '; *((?:SK|ST|E|X|LT|MK|MT|WT)\d{2}[a-z0-9]*(?:-o)?|R800i|U20i) Build'
 3577     device_replacement: '$1'
 3578     brand_replacement: 'SonyEricsson'
 3579     model_replacement: '$1'
 3580   # TODO X\d+ is wrong
 3581   - regex: '; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\d+)[^;/]*) Build'
 3582     regex_flag: 'i'
 3583     device_replacement: '$1'
 3584     brand_replacement: 'SonyEricsson'
 3585     model_replacement: '$1'
 3586 
 3587   #########
 3588   # Sony
 3589   # @ref: http://www.sonymobile.co.jp/index.html
 3590   # @ref: http://www.sonymobile.com/global-en/products/phones/
 3591   # @ref: http://www.sony.jp/tablet/
 3592   #########
 3593   - regex: '; Sony (Tablet[^;/]+) Build'
 3594     device_replacement: 'Sony $1'
 3595     brand_replacement: 'Sony'
 3596     model_replacement: '$1'
 3597   - regex: '; Sony ([^;/]+) Build'
 3598     device_replacement: 'Sony $1'
 3599     brand_replacement: 'Sony'
 3600     model_replacement: '$1'
 3601   - regex: '; *(Sony)([A-Za-z0-9\-]+) Build'
 3602     device_replacement: '$1 $2'
 3603     brand_replacement: '$1'
 3604     model_replacement: '$2'
 3605   - regex: '; *(Xperia [^;/]+) Build'
 3606     device_replacement: '$1'
 3607     brand_replacement: 'Sony'
 3608     model_replacement: '$1'
 3609   - regex: '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\d{3}|D6[56]\d{2}) Build'
 3610     device_replacement: '$1'
 3611     brand_replacement: 'Sony'
 3612     model_replacement: '$1'
 3613   - regex: '; *(SGP\d{3}|SGPT\d{2}) Build'
 3614     device_replacement: '$1'
 3615     brand_replacement: 'Sony'
 3616     model_replacement: '$1'
 3617   - regex: '; *(NW-Z1000Series) Build'
 3618     device_replacement: '$1'
 3619     brand_replacement: 'Sony'
 3620     model_replacement: '$1'
 3621 
 3622   ##########
 3623   # Sony PlayStation
 3624   # @ref: http://playstation.com
 3625   # The Vita spoofs the Kindle
 3626   ##########
 3627   - regex: 'PLAYSTATION 3'
 3628     device_replacement: 'PlayStation 3'
 3629     brand_replacement: 'Sony'
 3630     model_replacement: 'PlayStation 3'
 3631   - regex: '(PlayStation (?:Portable|Vita|\d+))'
 3632     device_replacement: '$1'
 3633     brand_replacement: 'Sony'
 3634     model_replacement: '$1'
 3635 
 3636   #########
 3637   # Spice
 3638   # @ref: http://www.spicemobilephones.co.in/
 3639   #########
 3640   - regex: '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\-]?)?([Mm][Ii])([ _\-])?(\d{3}[^;/]*) Build/'
 3641     device_replacement: '$1$2$3$4'
 3642     brand_replacement: 'Spice'
 3643     model_replacement: 'Mi$4'
 3644 
 3645   #########
 3646   # Sprint (Operator Branded Devices)
 3647   # @ref:
 3648   #########
 3649   - regex: '; *(Sprint )(.+?) *(?:Build|[;/])'
 3650     device_replacement: '$1$2'
 3651     brand_replacement: 'Sprint'
 3652     model_replacement: '$2'
 3653   - regex: '\b(Sprint)[: ]([^;,/ ]+)'
 3654     device_replacement: '$1$2'
 3655     brand_replacement: 'Sprint'
 3656     model_replacement: '$2'
 3657 
 3658   #########
 3659   # Tagi
 3660   # @ref: ??
 3661   #########
 3662   - regex: '; *(TAGI[ ]?)(MID) ?([^;/]+) Build/'
 3663     device_replacement: '$1$2$3'
 3664     brand_replacement: 'Tagi'
 3665     model_replacement: '$2$3'
 3666 
 3667   #########
 3668   # Tecmobile
 3669   # @ref: http://www.tecmobile.com/
 3670   #########
 3671   - regex: '; *(Oyster500|Opal 800) Build'
 3672     device_replacement: 'Tecmobile $1'
 3673     brand_replacement: 'Tecmobile'
 3674     model_replacement: '$1'
 3675 
 3676   #########
 3677   # Tecno
 3678   # @ref: www.tecno-mobile.com/‎
 3679   #########
 3680   - regex: '; *(TECNO[ _])([^;/]+) Build/'
 3681     device_replacement: '$1$2'
 3682     brand_replacement: 'Tecno'
 3683     model_replacement: '$2'
 3684 
 3685   #########
 3686   # Telechips, Techvision evaluation boards
 3687   # @ref:
 3688   #########
 3689   - regex: '; *Android for (Telechips|Techvision) ([^ ]+) '
 3690     regex_flag: 'i'
 3691     device_replacement: '$1 $2'
 3692     brand_replacement: '$1'
 3693     model_replacement: '$2'
 3694 
 3695   #########
 3696   # Telstra
 3697   # @ref: http://www.telstra.com.au/home-phone/thub-2/
 3698   # @ref: https://support.google.com/googleplay/answer/1727131?hl=en
 3699   #########
 3700   - regex: '; *(T-Hub2) Build/'
 3701     device_replacement: '$1'
 3702     brand_replacement: 'Telstra'
 3703     model_replacement: '$1'
 3704 
 3705   #########
 3706   # Terra
 3707   # @ref: http://www.wortmann.de/
 3708   #########
 3709   - regex: '; *(PAD) ?(100[12]) Build/'
 3710     device_replacement: 'Terra $1$2'
 3711     brand_replacement: 'Terra'
 3712     model_replacement: '$1$2'
 3713 
 3714   #########
 3715   # Texet
 3716   # @ref: http://www.texet.ru/tablet/
 3717   #########
 3718   - regex: '; *(T[BM]-\d{3}[^;/]+) Build/'
 3719     device_replacement: '$1'
 3720     brand_replacement: 'Texet'
 3721     model_replacement: '$1'
 3722 
 3723   #########
 3724   # Thalia
 3725   # @ref: http://www.thalia.de/shop/tolino-shine-ereader/show/
 3726   #########
 3727   - regex: '; *(tolino [^;/]+) Build'
 3728     device_replacement: '$1'
 3729     brand_replacement: 'Thalia'
 3730     model_replacement: '$1'
 3731   - regex: '; *Build/.* (TOLINO_BROWSER)'
 3732     device_replacement: '$1'
 3733     brand_replacement: 'Thalia'
 3734     model_replacement: 'Tolino Shine'
 3735 
 3736   #########
 3737   # Thl
 3738   # @ref: http://en.thl.com.cn/Mobile
 3739   # @ref: http://thlmobilestore.com
 3740   #########
 3741   - regex: '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+) Build/'
 3742     device_replacement: '$1 $2'
 3743     brand_replacement: 'Thl'
 3744     model_replacement: '$2'
 3745   - regex: '; *(T100|T200|T5|W100|W200|W8s) Build/'
 3746     device_replacement: '$1'
 3747     brand_replacement: 'Thl'
 3748     model_replacement: '$1'
 3749 
 3750   #########
 3751   # T-Mobile (Operator Branded Devices)
 3752   #########
 3753   # @ref: https://en.wikipedia.org/wiki/HTC_Hero
 3754   - regex: '; *(T-Mobile[ _]G2[ _]Touch) Build'
 3755     device_replacement: '$1'
 3756     brand_replacement: 'HTC'
 3757     model_replacement: 'Hero'
 3758   # @ref: https://en.wikipedia.org/wiki/HTC_Desire_Z
 3759   - regex: '; *(T-Mobile[ _]G2) Build'
 3760     device_replacement: '$1'
 3761     brand_replacement: 'HTC'
 3762     model_replacement: 'Desire Z'
 3763   - regex: '; *(T-Mobile myTouch Q) Build'
 3764     device_replacement: '$1'
 3765     brand_replacement: 'Huawei'
 3766     model_replacement: 'U8730'
 3767   - regex: '; *(T-Mobile myTouch) Build'
 3768     device_replacement: '$1'
 3769     brand_replacement: 'Huawei'
 3770     model_replacement: 'U8680'
 3771   - regex: '; *(T-Mobile_Espresso) Build'
 3772     device_replacement: '$1'
 3773     brand_replacement: 'HTC'
 3774     model_replacement: 'Espresso'
 3775   - regex: '; *(T-Mobile G1) Build'
 3776     device_replacement: '$1'
 3777     brand_replacement: 'HTC'
 3778     model_replacement: 'Dream'
 3779   - regex: '\b(T-Mobile ?)?(myTouch)[ _]?([34]G)[ _]?([^\/]*) (?:Mozilla|Build)'
 3780     device_replacement: '$1$2 $3 $4'
 3781     brand_replacement: 'HTC'
 3782     model_replacement: '$2 $3 $4'
 3783   - regex: '\b(T-Mobile)_([^_]+)_(.*) Build'
 3784     device_replacement: '$1 $2 $3'
 3785     brand_replacement: 'Tmobile'
 3786     model_replacement: '$2 $3'
 3787   - regex: '\b(T-Mobile)[_ ]?(.*?)Build'
 3788     device_replacement: '$1 $2'
 3789     brand_replacement: 'Tmobile'
 3790     model_replacement: '$2'
 3791 
 3792   #########
 3793   # Tomtec
 3794   # @ref: http://www.tom-tec.eu/pages/tablets.php
 3795   #########
 3796   - regex: ' (ATP[0-9]{4}) Build'
 3797     device_replacement: '$1'
 3798     brand_replacement: 'Tomtec'
 3799     model_replacement: '$1'
 3800 
 3801   #########
 3802   # Tooky
 3803   # @ref: http://www.tookymobile.com/
 3804   #########
 3805   - regex: ' *(TOOKY)[ _\-]([^;/]+) ?(?:Build|;)'
 3806     regex_flag: 'i'
 3807     device_replacement: '$1 $2'
 3808     brand_replacement: 'Tooky'
 3809     model_replacement: '$2'
 3810 
 3811   #########
 3812   # Toshiba
 3813   # @ref: http://www.toshiba.co.jp/
 3814   # @missing: LT170, Thrive 7, TOSHIBA STB10
 3815   #########
 3816   - regex: '\b(TOSHIBA_AC_AND_AZ|TOSHIBA_FOLIO_AND_A|FOLIO_AND_A)'
 3817     device_replacement: '$1'
 3818     brand_replacement: 'Toshiba'
 3819     model_replacement: 'Folio 100'
 3820   - regex: '; *([Ff]olio ?100) Build/'
 3821     device_replacement: '$1'
 3822     brand_replacement: 'Toshiba'
 3823     model_replacement: 'Folio 100'
 3824   - regex: '; *(AT[0-9]{2,3}(?:\-A|LE\-A|PE\-A|SE|a)?|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive) Build/'
 3825     device_replacement: 'Toshiba $1'
 3826     brand_replacement: 'Toshiba'
 3827     model_replacement: '$1'
 3828 
 3829   #########
 3830   # Touchmate
 3831   # @ref: http://touchmatepc.com/new/
 3832   #########
 3833   - regex: '; *(TM-MID\d+[^;/]+|TOUCHMATE|MID-750) Build'
 3834     device_replacement: '$1'
 3835     brand_replacement: 'Touchmate'
 3836     model_replacement: '$1'
 3837   # @todo: needs verification user-agents missing
 3838   - regex: '; *(TM-SM\d+[^;/]+) Build'
 3839     device_replacement: '$1'
 3840     brand_replacement: 'Touchmate'
 3841     model_replacement: '$1'
 3842 
 3843   #########
 3844   # Treq
 3845   # @ref: http://www.treq.co.id/product
 3846   #########
 3847   - regex: '; *(A10 [Bb]asic2?) Build/'
 3848     device_replacement: '$1'
 3849     brand_replacement: 'Treq'
 3850     model_replacement: '$1'
 3851   - regex: '; *(TREQ[ _\-])([^;/]+) Build'
 3852     regex_flag: 'i'
 3853     device_replacement: '$1$2'
 3854     brand_replacement: 'Treq'
 3855     model_replacement: '$2'
 3856 
 3857   #########
 3858   # Umeox
 3859   # @ref: http://umeox.com/
 3860   # @models: A936|A603|X-5|X-3
 3861   #########
 3862   # @todo: guessed markers
 3863   - regex: '; *(X-?5|X-?3) Build/'
 3864     device_replacement: '$1'
 3865     brand_replacement: 'Umeox'
 3866     model_replacement: '$1'
 3867   # @todo: guessed markers
 3868   - regex: '; *(A502\+?|A936|A603|X1|X2) Build/'
 3869     device_replacement: '$1'
 3870     brand_replacement: 'Umeox'
 3871     model_replacement: '$1'
 3872 
 3873   #########
 3874   # Versus
 3875   # @ref: http://versusuk.com/support.html
 3876   #########
 3877   - regex: '(TOUCH(?:TAB|PAD).+?) Build/'
 3878     regex_flag: 'i'
 3879     device_replacement: 'Versus $1'
 3880     brand_replacement: 'Versus'
 3881     model_replacement: '$1'
 3882 
 3883   #########
 3884   # Vertu
 3885   # @ref: http://www.vertu.com/
 3886   #########
 3887   - regex: '(VERTU) ([^;/]+) Build/'
 3888     device_replacement: '$1 $2'
 3889     brand_replacement: 'Vertu'
 3890     model_replacement: '$2'
 3891 
 3892   #########
 3893   # Videocon
 3894   # @ref: http://www.videoconmobiles.com
 3895   #########
 3896   - regex: '; *(Videocon)[ _\-]([^;/]+) *(?:Build|;)'
 3897     device_replacement: '$1 $2'
 3898     brand_replacement: 'Videocon'
 3899     model_replacement: '$2'
 3900   - regex: ' (VT\d{2}[A-Za-z]*) Build'
 3901     device_replacement: '$1'
 3902     brand_replacement: 'Videocon'
 3903     model_replacement: '$1'
 3904 
 3905   #########
 3906   # Viewsonic
 3907   # @ref: http://viewsonic.com
 3908   #########
 3909   - regex: '; *((?:ViewPad|ViewPhone|VSD)[^;/]+) Build/'
 3910     device_replacement: '$1'
 3911     brand_replacement: 'Viewsonic'
 3912     model_replacement: '$1'
 3913   - regex: '; *(ViewSonic-)([^;/]+) Build/'
 3914     device_replacement: '$1$2'
 3915     brand_replacement: 'Viewsonic'
 3916     model_replacement: '$2'
 3917   - regex: '; *(GTablet.*) Build/'
 3918     device_replacement: '$1'
 3919     brand_replacement: 'Viewsonic'
 3920     model_replacement: '$1'
 3921 
 3922   #########
 3923   # vivo
 3924   # @ref: http://vivo.cn/
 3925   #########
 3926   - regex: '; *([Vv]ivo)[ _]([^;/]+) Build'
 3927     device_replacement: '$1 $2'
 3928     brand_replacement: 'vivo'
 3929     model_replacement: '$2'
 3930 
 3931   #########
 3932   # Vodafone (Operator Branded Devices)
 3933   # @ref: ??
 3934   #########
 3935   - regex: '(Vodafone) (.*) Build/'
 3936     device_replacement: '$1 $2'
 3937     brand_replacement: '$1'
 3938     model_replacement: '$2'
 3939 
 3940   #########
 3941   # Walton
 3942   # @ref: http://www.waltonbd.com/
 3943   #########
 3944   - regex: '; *(?:Walton[ _\-])?(Primo[ _\-][^;/]+) Build'
 3945     regex_flag: 'i'
 3946     device_replacement: 'Walton $1'
 3947     brand_replacement: 'Walton'
 3948     model_replacement: '$1'
 3949 
 3950   #########
 3951   # Wiko
 3952   # @ref: http://fr.wikomobile.com/collection.php?s=Smartphones
 3953   #########
 3954   - regex: '; *(?:WIKO[ \-])?(CINK\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+) Build/'
 3955     regex_flag: 'i'
 3956     device_replacement: 'Wiko $1'
 3957     brand_replacement: 'Wiko'
 3958     model_replacement: '$1'
 3959 
 3960   #########
 3961   # WellcoM
 3962   # @ref: ??
 3963   #########
 3964   - regex: '; *WellcoM-([^;/]+) Build'
 3965     device_replacement: 'Wellcom $1'
 3966     brand_replacement: 'Wellcom'
 3967     model_replacement: '$1'
 3968 
 3969   ##########
 3970   # WeTab
 3971   # @ref: http://wetab.mobi/
 3972   ##########
 3973   - regex: '(?:(WeTab)-Browser|; (wetab) Build)'
 3974     device_replacement: '$1'
 3975     brand_replacement: 'WeTab'
 3976     model_replacement: 'WeTab'
 3977 
 3978   #########
 3979   # Wolfgang
 3980   # @ref: http://wolfgangmobile.com/
 3981   #########
 3982   - regex: '; *(AT-AS[^;/]+) Build'
 3983     device_replacement: 'Wolfgang $1'
 3984     brand_replacement: 'Wolfgang'
 3985     model_replacement: '$1'
 3986 
 3987   #########
 3988   # Woxter
 3989   # @ref: http://www.woxter.es/es-es/categories/index
 3990   #########
 3991   - regex: '; *(?:Woxter|Wxt) ([^;/]+) Build'
 3992     device_replacement: 'Woxter $1'
 3993     brand_replacement: 'Woxter'
 3994     model_replacement: '$1'
 3995 
 3996   #########
 3997   # Yarvik Zania
 3998   # @ref: http://yarvik.com
 3999   #########
 4000   - regex: '; *(?:Xenta |Luna )?(TAB[234][0-9]{2}|TAB0[78]-\d{3}|TAB0?9-\d{3}|TAB1[03]-\d{3}|SMP\d{2}-\d{3}) Build/'
 4001     device_replacement: 'Yarvik $1'
 4002     brand_replacement: 'Yarvik'
 4003     model_replacement: '$1'
 4004 
 4005   #########
 4006   # Yifang
 4007   # @note: Needs to be at the very last as manufacturer builds for other brands.
 4008   # @ref: http://www.yifangdigital.com/
 4009   # @models: M1010, M1011, M1007, M1008, M1005, M899, M899LP, M909, M8000,
 4010   #   M8001, M8002, M8003, M849, M815, M816, M819, M805, M878, M780LPW,
 4011   #   M778, M7000, M7000AD, M7000NBD, M7001, M7002, M7002KBD, M777, M767,
 4012   #   M789, M799, M769, M757, M755, M753, M752, M739, M729, M723, M712, M727
 4013   #########
 4014   - regex: '; *([A-Z]{2,4})(M\d{3,}[A-Z]{2})([^;\)\/]*)(?: Build|[;\)])'
 4015     device_replacement: 'Yifang $1$2$3'
 4016     brand_replacement: 'Yifang'
 4017     model_replacement: '$2'
 4018 
 4019   #########
 4020   # XiaoMi
 4021   # @ref: http://www.xiaomi.com/event/buyphone
 4022   #########
 4023   - regex: '; *((MI|HM|MI-ONE|Redmi)[ -](NOTE |Note )?[^;/]*) (Build|MIUI)/'
 4024     device_replacement: 'XiaoMi $1'
 4025     brand_replacement: 'XiaoMi'
 4026     model_replacement: '$1'
 4027 
 4028   #########
 4029   # Xolo
 4030   # @ref: http://www.xolo.in/
 4031   #########
 4032   - regex: '; *XOLO[ _]([^;/]*tab.*) Build'
 4033     regex_flag: 'i'
 4034     device_replacement: 'Xolo $1'
 4035     brand_replacement: 'Xolo'
 4036     model_replacement: '$1'
 4037   - regex: '; *XOLO[ _]([^;/]+) Build'
 4038     regex_flag: 'i'
 4039     device_replacement: 'Xolo $1'
 4040     brand_replacement: 'Xolo'
 4041     model_replacement: '$1'
 4042   - regex: '; *(q\d0{2,3}[a-z]?) Build'
 4043     regex_flag: 'i'
 4044     device_replacement: 'Xolo $1'
 4045     brand_replacement: 'Xolo'
 4046     model_replacement: '$1'
 4047 
 4048   #########
 4049   # Xoro
 4050   # @ref: http://www.xoro.de/produkte/
 4051   #########
 4052   - regex: '; *(PAD ?[79]\d+[^;/]*|TelePAD\d+[^;/]) Build'
 4053     device_replacement: 'Xoro $1'
 4054     brand_replacement: 'Xoro'
 4055     model_replacement: '$1'
 4056 
 4057   #########
 4058   # Zopo
 4059   # @ref: http://www.zopomobiles.com/products.html
 4060   #########
 4061   - regex: '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+)|(ZP ?(?:\d{2}[^;/]+|C2))|(C[2379])) Build'
 4062     device_replacement: '$1$2$3'
 4063     brand_replacement: 'Zopo'
 4064     model_replacement: '$1$2$3'
 4065 
 4066   #########
 4067   # ZiiLabs
 4068   # @ref: http://www.ziilabs.com/products/platforms/androidreferencetablets.php
 4069   #########
 4070   - regex: '; *(ZiiLABS) (Zii[^;/]*) Build'
 4071     device_replacement: '$1 $2'
 4072     brand_replacement: 'ZiiLabs'
 4073     model_replacement: '$2'
 4074   - regex: '; *(Zii)_([^;/]*) Build'
 4075     device_replacement: '$1 $2'
 4076     brand_replacement: 'ZiiLabs'
 4077     model_replacement: '$2'
 4078 
 4079   #########
 4080   # ZTE
 4081   # @ref: http://www.ztedevices.com/
 4082   #########
 4083   - regex: '; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*|Era|Memo[^;]*)|JOE|(?:Kis|KIS)\b[^;]*|Libra|Light [^;]*|N8[056][01]|N850L|N8000|N9[15]\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*|RacerII|RACERII|San Francisco[^;]*|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?) Build'
 4084     device_replacement: '$1'
 4085     brand_replacement: 'ZTE'
 4086     model_replacement: '$1'
 4087   - regex: '; *([A-Z]\d+)_USA_[^;]* Build'
 4088     device_replacement: '$1'
 4089     brand_replacement: 'ZTE'
 4090     model_replacement: '$1'
 4091   - regex: '; *(SmartTab\d+)[^;]* Build'
 4092     device_replacement: '$1'
 4093     brand_replacement: 'ZTE'
 4094     model_replacement: '$1'
 4095   - regex: '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*) Build'
 4096     device_replacement: 'ZTE Blade$1'
 4097     brand_replacement: 'ZTE'
 4098     model_replacement: 'Blade$1'
 4099   - regex: '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*) Build'
 4100     device_replacement: 'ZTE Skate$1'
 4101     brand_replacement: 'ZTE'
 4102     model_replacement: 'Skate$1'
 4103   - regex: '; *(Orange |Optimus )(Monte Carlo|San Francisco) Build'
 4104     device_replacement: '$1$2'
 4105     brand_replacement: 'ZTE'
 4106     model_replacement: '$1$2'
 4107   - regex: '; *(?:ZXY-ZTE_|ZTE\-U |ZTE[\- _]|ZTE-C[_ ])([^;/]+) Build'
 4108     device_replacement: 'ZTE $1'
 4109     brand_replacement: 'ZTE'
 4110     model_replacement: '$1'
 4111   # operator specific
 4112   - regex: '; (BASE) (lutea|Lutea 2|Tab[^;]*) Build'
 4113     device_replacement: '$1 $2'
 4114     brand_replacement: 'ZTE'
 4115     model_replacement: '$1 $2'
 4116   - regex: '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link) Build'
 4117     regex_flag: 'i'
 4118     device_replacement: '$1'
 4119     brand_replacement: 'ZTE'
 4120     model_replacement: '$1'
 4121   - regex: '; *(vp9plus)\)'
 4122     device_replacement: '$1'
 4123     brand_replacement: 'ZTE'
 4124     model_replacement: '$1'
 4125 
 4126   ##########
 4127   # Zync
 4128   # @ref: http://www.zync.in/index.php/our-products/tablet-phablets
 4129   ##########
 4130   - regex: '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900) Build/'
 4131     device_replacement: '$1'
 4132     brand_replacement: 'Zync'
 4133     model_replacement: '$1'
 4134 
 4135   ##########
 4136   # Kindle
 4137   # @note: Needs to be after Sony Playstation Vita as this UA contains Silk/3.2
 4138   # @ref: https://developer.amazon.com/sdk/fire/specifications.html
 4139   # @ref: http://amazonsilk.wordpress.com/useful-bits/silk-user-agent/
 4140   ##########
 4141   - regex: '; ?(KFOT|Kindle Fire) Build\b'
 4142     device_replacement: 'Kindle Fire'
 4143     brand_replacement: 'Amazon'
 4144     model_replacement: 'Kindle Fire'
 4145   - regex: '; ?(KFOTE|Amazon Kindle Fire2) Build\b'
 4146     device_replacement: 'Kindle Fire 2'
 4147     brand_replacement: 'Amazon'
 4148     model_replacement: 'Kindle Fire 2'
 4149   - regex: '; ?(KFTT) Build\b'
 4150     device_replacement: 'Kindle Fire HD'
 4151     brand_replacement: 'Amazon'
 4152     model_replacement: 'Kindle Fire HD 7"'
 4153   - regex: '; ?(KFJWI) Build\b'
 4154     device_replacement: 'Kindle Fire HD 8.9" WiFi'
 4155     brand_replacement: 'Amazon'
 4156     model_replacement: 'Kindle Fire HD 8.9" WiFi'
 4157   - regex: '; ?(KFJWA) Build\b'
 4158     device_replacement: 'Kindle Fire HD 8.9" 4G'
 4159     brand_replacement: 'Amazon'
 4160     model_replacement: 'Kindle Fire HD 8.9" 4G'
 4161   - regex: '; ?(KFSOWI) Build\b'
 4162     device_replacement: 'Kindle Fire HD 7" WiFi'
 4163     brand_replacement: 'Amazon'
 4164     model_replacement: 'Kindle Fire HD 7" WiFi'
 4165   - regex: '; ?(KFTHWI) Build\b'
 4166     device_replacement: 'Kindle Fire HDX 7" WiFi'
 4167     brand_replacement: 'Amazon'
 4168     model_replacement: 'Kindle Fire HDX 7" WiFi'
 4169   - regex: '; ?(KFTHWA) Build\b'
 4170     device_replacement: 'Kindle Fire HDX 7" 4G'
 4171     brand_replacement: 'Amazon'
 4172     model_replacement: 'Kindle Fire HDX 7" 4G'
 4173   - regex: '; ?(KFAPWI) Build\b'
 4174     device_replacement: 'Kindle Fire HDX 8.9" WiFi'
 4175     brand_replacement: 'Amazon'
 4176     model_replacement: 'Kindle Fire HDX 8.9" WiFi'
 4177   - regex: '; ?(KFAPWA) Build\b'
 4178     device_replacement: 'Kindle Fire HDX 8.9" 4G'
 4179     brand_replacement: 'Amazon'
 4180     model_replacement: 'Kindle Fire HDX 8.9" 4G'
 4181   - regex: '; ?Amazon ([^;/]+) Build\b'
 4182     device_replacement: '$1'
 4183     brand_replacement: 'Amazon'
 4184     model_replacement: '$1'
 4185   - regex: '; ?(Kindle) Build\b'
 4186     device_replacement: 'Kindle'
 4187     brand_replacement: 'Amazon'
 4188     model_replacement: 'Kindle'
 4189   - regex: '; ?(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))? Build\b'
 4190     device_replacement: 'Kindle Fire'
 4191     brand_replacement: 'Amazon'
 4192     model_replacement: 'Kindle Fire$2'
 4193   - regex: ' (Kindle)/(\d+\.\d+)'
 4194     device_replacement: 'Kindle'
 4195     brand_replacement: 'Amazon'
 4196     model_replacement: '$1 $2'
 4197   - regex: ' (Silk|Kindle)/(\d+)\.'
 4198     device_replacement: 'Kindle'
 4199     brand_replacement: 'Amazon'
 4200     model_replacement: 'Kindle'
 4201 
 4202   #########
 4203   # Devices from chinese manufacturer(s)
 4204   # @note: identified by x-wap-profile http://218.249.47.94/Xianghe/.*
 4205   #########
 4206   - regex: '(sprd)\-([^/]+)/'
 4207     device_replacement: '$1 $2'
 4208     brand_replacement: '$1'
 4209     model_replacement: '$2'
 4210   # @ref: http://eshinechina.en.alibaba.com/
 4211   - regex: '; *(H\d{2}00\+?) Build'
 4212     device_replacement: '$1'
 4213     brand_replacement: 'Hero'
 4214     model_replacement: '$1'
 4215   - regex: '; *(iphone|iPhone5) Build/'
 4216     device_replacement: 'Xianghe $1'
 4217     brand_replacement: 'Xianghe'
 4218     model_replacement: '$1'
 4219   - regex: '; *(e\d{4}[a-z]?_?v\d+|v89_[^;/]+)[^;/]+ Build/'
 4220     device_replacement: 'Xianghe $1'
 4221     brand_replacement: 'Xianghe'
 4222     model_replacement: '$1'
 4223 
 4224   #########
 4225   # Cellular
 4226   # @ref:
 4227   # @note: Operator branded devices
 4228   #########
 4229   - regex: '\bUSCC[_\-]?([^ ;/\)]+)'
 4230     device_replacement: '$1'
 4231     brand_replacement: 'Cellular'
 4232     model_replacement: '$1'
 4233 
 4234   ######################################################################
 4235   # Windows Phone Parsers
 4236   ######################################################################
 4237 
 4238   #########
 4239   # Alcatel Windows Phones
 4240   #########
 4241   - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:ALCATEL)[^;]*; *([^;,\)]+)'
 4242     device_replacement: 'Alcatel $1'
 4243     brand_replacement: 'Alcatel'
 4244     model_replacement: '$1'
 4245 
 4246   #########
 4247   # Asus Windows Phones
 4248   #########
 4249   #~ - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
 4250   - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:ASUS|Asus)[^;]*; *([^;,\)]+)'
 4251     device_replacement: 'Asus $1'
 4252     brand_replacement: 'Asus'
 4253     model_replacement: '$1'
 4254 
 4255   #########
 4256   # Dell Windows Phones
 4257   #########
 4258   - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:DELL|Dell)[^;]*; *([^;,\)]+)'
 4259     device_replacement: 'Dell $1'
 4260     brand_replacement: 'Dell'
 4261     model_replacement: '$1'
 4262 
 4263   #########
 4264   # HTC Windows Phones
 4265   #########
 4266   - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC)?([^;,\)]+)'
 4267     device_replacement: 'HTC $1'
 4268     brand_replacement: 'HTC'
 4269     model_replacement: '$1'
 4270 
 4271   #########
 4272   # Huawei Windows Phones
 4273   #########
 4274   - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:HUAWEI)[^;]*; *(?:HUAWEI )?([^;,\)]+)'
 4275     device_replacement: 'Huawei $1'
 4276     brand_replacement: 'Huawei'
 4277     model_replacement: '$1'
 4278 
 4279   #########
 4280   # LG Windows Phones
 4281   #########
 4282   - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:LG|Lg)[^;]*; *(?:LG[ \-])?([^;,\)]+)'
 4283     device_replacement: 'LG $1'
 4284     brand_replacement: 'LG'
 4285     model_replacement: '$1'
 4286 
 4287   #########
 4288   # Noka Windows Phones
 4289   #########
 4290   - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:rv:11; )?(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?)*(\d{3,}[^;\)]*)'
 4291     device_replacement: 'Lumia $1'
 4292     brand_replacement: 'Nokia'
 4293     model_replacement: 'Lumia $1'
 4294   - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:NOKIA|Nokia)[^;]*; *(RM-\d{3,})'
 4295     device_replacement: 'Nokia $1'
 4296     brand_replacement: 'Nokia'
 4297     model_replacement: '$1'
 4298   - regex: '(?:Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?)?(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?)*([^;\)]+)'
 4299     device_replacement: 'Nokia $1'
 4300     brand_replacement: 'Nokia'
 4301     model_replacement: '$1'
 4302 
 4303   #########
 4304   # Microsoft Windows Phones
 4305   #########
 4306   - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:Microsoft(?: Corporation)?)[^;]*; *([^;,\)]+)'
 4307     device_replacement: 'Microsoft $1'
 4308     brand_replacement: 'Microsoft'
 4309     model_replacement: '$1'
 4310 
 4311   #########
 4312   # Samsung Windows Phones
 4313   #########
 4314   - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:SAMSUNG)[^;]*; *(?:SAMSUNG )?([^;,\.\)]+)'
 4315     device_replacement: 'Samsung $1'
 4316     brand_replacement: 'Samsung'
 4317     model_replacement: '$1'
 4318 
 4319   #########
 4320   # Toshiba Windows Phones
 4321   #########
 4322   - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\)]+)'
 4323     device_replacement: 'Toshiba $1'
 4324     brand_replacement: 'Toshiba'
 4325     model_replacement: '$1'
 4326 
 4327   #########
 4328   # Generic Windows Phones
 4329   #########
 4330   - regex: 'Windows Phone [^;]+; .*?IEMobile/[^;\)]+[;\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?([^;]+); *([^;,\)]+)'
 4331     device_replacement: '$1 $2'
 4332     brand_replacement: '$1'
 4333     model_replacement: '$2'
 4334 
 4335   ######################################################################
 4336   # Other Devices Parser
 4337   ######################################################################
 4338 
 4339   #########
 4340   # Samsung Bada Phones
 4341   #########
 4342   - regex: '(?:^|; )SAMSUNG\-([A-Za-z0-9\-]+).* Bada/'
 4343     device_replacement: 'Samsung $1'
 4344     brand_replacement: 'Samsung'
 4345     model_replacement: '$1'
 4346 
 4347   #########
 4348   # Firefox OS
 4349   #########
 4350   - regex: '\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+)?; rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
 4351     device_replacement: 'Alcatel $1 $2 $3'
 4352     brand_replacement: 'Alcatel'
 4353     model_replacement: 'One Touch $3'
 4354   - regex: '\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\)]+\) Gecko/[^\/]+ Firefox/'
 4355     device_replacement: 'ZTE $1$2'
 4356     brand_replacement: 'ZTE'
 4357     model_replacement: '$1$2'
 4358 
 4359   ##########
 4360   # NOKIA
 4361   # @note: NokiaN8-00 comes before iphone. Sometimes spoofs iphone
 4362   ##########
 4363   - regex: 'Nokia(N[0-9]+)([A-z_\-][A-z0-9_\-]*)'
 4364     device_replacement: 'Nokia $1'
 4365     brand_replacement: 'Nokia'
 4366     model_replacement: '$1$2'
 4367   - regex: '(?:NOKIA|Nokia)(?:\-| *)(?:([A-Za-z0-9]+)\-[0-9a-f]{32}|([A-Za-z0-9\-]+)(?:UCBrowser)|([A-Za-z0-9\-]+))'
 4368     device_replacement: 'Nokia $1$2$3'
 4369     brand_replacement: 'Nokia'
 4370     model_replacement: '$1$2$3'
 4371   - regex: 'Lumia ([A-Za-z0-9\-]+)'
 4372     device_replacement: 'Lumia $1'
 4373     brand_replacement: 'Nokia'
 4374     model_replacement: 'Lumia $1'
 4375   # UCWEB Browser on Symbian
 4376   - regex: '\(Symbian; U; S60 V5; [A-z]{2}\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+)\)'
 4377     device_replacement: '$1 $2'
 4378     brand_replacement: '$1'
 4379     model_replacement: '$2'
 4380   # Nokia Symbian
 4381   - regex: '\(Symbian(?:/3)?; U; ([^;]+);'
 4382     device_replacement: 'Nokia $1'
 4383     brand_replacement: 'Nokia'
 4384     model_replacement: '$1'
 4385 
 4386   ##########
 4387   # BlackBerry
 4388   # @ref: http://www.useragentstring.com/pages/BlackBerry/
 4389   ##########
 4390   - regex: 'BB10; ([A-Za-z0-9\- ]+)\)'
 4391     device_replacement: 'BlackBerry $1'
 4392     brand_replacement: 'BlackBerry'
 4393     model_replacement: '$1'
 4394   - regex: 'Play[Bb]ook.+RIM Tablet OS'
 4395     device_replacement: 'BlackBerry Playbook'
 4396     brand_replacement: 'BlackBerry'
 4397     model_replacement: 'Playbook'
 4398   - regex: 'Black[Bb]erry ([0-9]+);'
 4399     device_replacement: 'BlackBerry $1'
 4400     brand_replacement: 'BlackBerry'
 4401     model_replacement: '$1'
 4402   - regex: 'Black[Bb]erry([0-9]+)'
 4403     device_replacement: 'BlackBerry $1'
 4404     brand_replacement: 'BlackBerry'
 4405     model_replacement: '$1'
 4406   - regex: 'Black[Bb]erry;'
 4407     device_replacement: 'BlackBerry'
 4408     brand_replacement: 'BlackBerry'
 4409 
 4410   ##########
 4411   # PALM / HP
 4412   # @note: some palm devices must come before iphone. sometimes spoofs iphone in ua
 4413   ##########
 4414   - regex: '(Pre|Pixi)/\d+\.\d+'
 4415     device_replacement: 'Palm $1'
 4416     brand_replacement: 'Palm'
 4417     model_replacement: '$1'
 4418   - regex: 'Palm([0-9]+)'
 4419     device_replacement: 'Palm $1'
 4420     brand_replacement: 'Palm'
 4421     model_replacement: '$1'
 4422   - regex: 'Treo([A-Za-z0-9]+)'
 4423     device_replacement: 'Palm Treo $1'
 4424     brand_replacement: 'Palm'
 4425     model_replacement: 'Treo $1'
 4426   - regex: 'webOS.*(P160U(?:NA)?)/(\d+).(\d+)'
 4427     device_replacement: 'HP Veer'
 4428     brand_replacement: 'HP'
 4429     model_replacement: 'Veer'
 4430   - regex: '(Touch[Pp]ad)/\d+\.\d+'
 4431     device_replacement: 'HP TouchPad'
 4432     brand_replacement: 'HP'
 4433     model_replacement: 'TouchPad'
 4434   - regex: 'HPiPAQ([A-Za-z0-9]+)/\d+.\d+'
 4435     device_replacement: 'HP iPAQ $1'
 4436     brand_replacement: 'HP'
 4437     model_replacement: 'iPAQ $1'
 4438   - regex: 'PDA; (PalmOS)/sony/model ([a-z]+)/Revision'
 4439     device_replacement: '$1'
 4440     brand_replacement: 'Sony'
 4441     model_replacement: '$1 $2'
 4442 
 4443   ##########
 4444   # AppleTV
 4445   # No built in browser that I can tell
 4446   # Stack Overflow indicated iTunes-AppleTV/4.1 as a known UA for app available and I'm seeing it in live traffic
 4447   ##########
 4448   - regex: '(Apple\s?TV)'
 4449     device_replacement: 'AppleTV'
 4450     brand_replacement: 'Apple'
 4451     model_replacement: 'AppleTV'
 4452 
 4453   #########
 4454   # Tesla Model S
 4455   #########
 4456   - regex: '(QtCarBrowser)'
 4457     device_replacement: 'Tesla Model S'
 4458     brand_replacement: 'Tesla'
 4459     model_replacement: 'Model S'
 4460 
 4461   ##########
 4462   # iSTUFF
 4463   # @note: complete but probably catches spoofs
 4464   #   ipad and ipod must be parsed before iphone
 4465   #   cannot determine specific device type from ua string. (3g, 3gs, 4, etc)
 4466   ##########
 4467   # @note: on some ua the device can be identified e.g. iPhone5,1
 4468   - regex: '(iPhone|iPad|iPod)(\d+,\d+)'
 4469     device_replacement: '$1'
 4470     brand_replacement: 'Apple'
 4471     model_replacement: '$1$2'
 4472   # @note: iPad needs to be before iPhone
 4473   - regex: '(iPad)(?:;| Simulator;)'
 4474     device_replacement: '$1'
 4475     brand_replacement: 'Apple'
 4476     model_replacement: '$1'
 4477   - regex: '(iPod)(?:;| touch;| Simulator;)'
 4478     device_replacement: '$1'
 4479     brand_replacement: 'Apple'
 4480     model_replacement: '$1'
 4481   - regex: '(iPhone)(?:;| Simulator;)'
 4482     device_replacement: '$1'
 4483     brand_replacement: 'Apple'
 4484     model_replacement: '$1'
 4485   # @note: desktop applications show device info
 4486   - regex: 'CFNetwork/.* Darwin/\d.*\(((?:Mac|iMac|PowerMac|PowerBook)[^\d]*)(\d+)(?:,|%2C)(\d+)'
 4487     device_replacement: '$1$2,$3'
 4488     brand_replacement: 'Apple'
 4489     model_replacement: '$1$2,$3'
 4490   # @note: newer desktop applications don't show device info
 4491   # This is here so as to not have them recorded as iOS-Device
 4492   - regex: 'CFNetwork/.* Darwin/\d+\.\d+\.\d+ \(x86_64\)'
 4493     device_replacement: 'Mac'
 4494     brand_replacement: 'Apple'
 4495     model_replacement: 'Mac'
 4496   # @note: iOS applications do not show device info
 4497   - regex: 'CFNetwork/.* Darwin/\d'
 4498     device_replacement: 'iOS-Device'
 4499     brand_replacement: 'Apple'
 4500     model_replacement: 'iOS-Device'
 4501 
 4502   ##########
 4503   # Acer
 4504   ##########
 4505   - regex: 'acer_([A-Za-z0-9]+)_'
 4506     device_replacement: 'Acer $1'
 4507     brand_replacement: 'Acer'
 4508     model_replacement: '$1'
 4509 
 4510   ##########
 4511   # Alcatel
 4512   ##########
 4513   - regex: '(?:ALCATEL|Alcatel)-([A-Za-z0-9\-]+)'
 4514     device_replacement: 'Alcatel $1'
 4515     brand_replacement: 'Alcatel'
 4516     model_replacement: '$1'
 4517 
 4518   ##########
 4519   # Amoi
 4520   ##########
 4521   - regex: '(?:Amoi|AMOI)\-([A-Za-z0-9]+)'
 4522     device_replacement: 'Amoi $1'
 4523     brand_replacement: 'Amoi'
 4524     model_replacement: '$1'
 4525 
 4526   ##########
 4527   # Asus
 4528   ##########
 4529   - regex: '(?:; |\/|^)((?:Transformer (?:Pad|Prime) |Transformer |PadFone[ _]?)[A-Za-z0-9]*)'
 4530     device_replacement: 'Asus $1'
 4531     brand_replacement: 'Asus'
 4532     model_replacement: '$1'
 4533   - regex: '(?:asus.*?ASUS|Asus|ASUS|asus)[\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _])?[A-Za-z0-9]+)'
 4534     device_replacement: 'Asus $1'
 4535     brand_replacement: 'Asus'
 4536     model_replacement: '$1'
 4537 
 4538 
 4539   ##########
 4540   # Bird
 4541   ##########
 4542   - regex: '\bBIRD[ \-\.]([A-Za-z0-9]+)'
 4543     device_replacement: 'Bird $1'
 4544     brand_replacement: 'Bird'
 4545     model_replacement: '$1'
 4546 
 4547   ##########
 4548   # Dell
 4549   ##########
 4550   - regex: '\bDell ([A-Za-z0-9]+)'
 4551     device_replacement: 'Dell $1'
 4552     brand_replacement: 'Dell'
 4553     model_replacement: '$1'
 4554 
 4555   ##########
 4556   # DoCoMo
 4557   ##########
 4558   - regex: 'DoCoMo/2\.0 ([A-Za-z0-9]+)'
 4559     device_replacement: 'DoCoMo $1'
 4560     brand_replacement: 'DoCoMo'
 4561     model_replacement: '$1'
 4562   - regex: '([A-Za-z0-9]+)_W;FOMA'
 4563     device_replacement: 'DoCoMo $1'
 4564     brand_replacement: 'DoCoMo'
 4565     model_replacement: '$1'
 4566   - regex: '([A-Za-z0-9]+);FOMA'
 4567     device_replacement: 'DoCoMo $1'
 4568     brand_replacement: 'DoCoMo'
 4569     model_replacement: '$1'
 4570 
 4571   ##########
 4572   # htc
 4573   ##########
 4574   - regex: '\b(?:HTC/|HTC/[a-z0-9]+/)?HTC[ _\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\(\)]|$)'
 4575     device_replacement: 'HTC $1'
 4576     brand_replacement: 'HTC'
 4577     model_replacement: '$1'
 4578 
 4579   ##########
 4580   # Huawei
 4581   ##########
 4582   - regex: 'Huawei([A-Za-z0-9]+)'
 4583     device_replacement: 'Huawei $1'
 4584     brand_replacement: 'Huawei'
 4585     model_replacement: '$1'
 4586   - regex: 'HUAWEI-([A-Za-z0-9]+)'
 4587     device_replacement: 'Huawei $1'
 4588     brand_replacement: 'Huawei'
 4589     model_replacement: '$1'
 4590   - regex: 'vodafone([A-Za-z0-9]+)'
 4591     device_replacement: 'Huawei Vodafone $1'
 4592     brand_replacement: 'Huawei'
 4593     model_replacement: 'Vodafone $1'
 4594 
 4595   ##########
 4596   # i-mate
 4597   ##########
 4598   - regex: 'i\-mate ([A-Za-z0-9]+)'
 4599     device_replacement: 'i-mate $1'
 4600     brand_replacement: 'i-mate'
 4601     model_replacement: '$1'
 4602 
 4603   ##########
 4604   # kyocera
 4605   ##########
 4606   - regex: 'Kyocera\-([A-Za-z0-9]+)'
 4607     device_replacement: 'Kyocera $1'
 4608     brand_replacement: 'Kyocera'
 4609     model_replacement: '$1'
 4610   - regex: 'KWC\-([A-Za-z0-9]+)'
 4611     device_replacement: 'Kyocera $1'
 4612     brand_replacement: 'Kyocera'
 4613     model_replacement: '$1'
 4614 
 4615   ##########
 4616   # lenovo
 4617   ##########
 4618   - regex: 'Lenovo[_\-]([A-Za-z0-9]+)'
 4619     device_replacement: 'Lenovo $1'
 4620     brand_replacement: 'Lenovo'
 4621     model_replacement: '$1'
 4622 
 4623   ##########
 4624   # HbbTV (European and Australian standard)
 4625   # written before the LG regexes, as LG is making HbbTV too
 4626   ##########
 4627   - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]*; *(LG)E *; *([^;]*) *;[^;]*;[^;]*;\)'
 4628     device_replacement: '$1'
 4629     brand_replacement: '$2'
 4630     model_replacement: '$3'
 4631   - regex: '(HbbTV)/1\.1\.1.*CE-HTML/1\.\d;(Vendor/)*(THOM[^;]*?)[;\s](?:.*SW-Version/.*)*(LF[^;]+);?'
 4632     device_replacement: '$1'
 4633     brand_replacement: 'Thomson'
 4634     model_replacement: '$4'
 4635   - regex: '(HbbTV)(?:/1\.1\.1)?(?: ?\(;;;;;\))?; *CE-HTML(?:/1\.\d)?; *([^ ]+) ([^;]+);'
 4636     device_replacement: '$1'
 4637     brand_replacement: '$2'
 4638     model_replacement: '$3'
 4639   - regex: '(HbbTV)/1\.1\.1 \(;;;;;\) Maple_2011'
 4640     device_replacement: '$1'
 4641     brand_replacement: 'Samsung'
 4642   - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+ \([^;]*; *(?:CUS:([^;]*)|([^;]+)) *; *([^;]*) *;.*;'
 4643     device_replacement: '$1'
 4644     brand_replacement: '$2$3'
 4645     model_replacement: '$4'
 4646   - regex: '(HbbTV)/[0-9]+\.[0-9]+\.[0-9]+'
 4647     device_replacement: '$1'
 4648 
 4649   ##########
 4650   # LGE NetCast TV
 4651   ##########
 4652   - regex: 'LGE; (?:Media\/)?([^;]*);[^;]*;[^;]*;?\); "?LG NetCast(\.TV|\.Media|)-\d+'
 4653     device_replacement: 'NetCast$2'
 4654     brand_replacement: 'LG'
 4655     model_replacement: '$1'
 4656 
 4657   ##########
 4658   # InettvBrowser
 4659   ##########
 4660   - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;(Sony)([^;]*);[^;]*;[^\)]*\)'
 4661     device_replacement: 'Inettv'
 4662     brand_replacement: '$1'
 4663     model_replacement: '$2'
 4664   - regex: 'InettvBrowser/[0-9]+\.[0-9A-Z]+ \([^;]*;([^;]*);[^;]*;[^\)]*\)'
 4665     device_replacement: 'Inettv'
 4666     brand_replacement: 'Generic_Inettv'
 4667     model_replacement: '$1'
 4668   - regex: '(?:InettvBrowser|TSBNetTV|NETTV|HBBTV)'
 4669     device_replacement: 'Inettv'
 4670     brand_replacement: 'Generic_Inettv'
 4671 
 4672   ##########
 4673   # lg
 4674   ##########
 4675   # LG Symbian Phones
 4676   - regex: 'Series60/\d\.\d (LG)[\-]?([A-Za-z0-9 \-]+)'
 4677     device_replacement: '$1 $2'
 4678     brand_replacement: '$1'
 4679     model_replacement: '$2'
 4680   # other LG phones
 4681   - regex: '\b(?:LGE[ \-]LG\-(?:AX)?|LGE |LGE?-LG|LGE?[ \-]|LG[ /\-]|lg[\-])([A-Za-z0-9]+)\b'
 4682     device_replacement: 'LG $1'
 4683     brand_replacement: 'LG'
 4684     model_replacement: '$1'
 4685   - regex: '(?:^LG[\-]?|^LGE[\-/]?)([A-Za-z]+[0-9]+[A-Za-z]*)'
 4686     device_replacement: 'LG $1'
 4687     brand_replacement: 'LG'
 4688     model_replacement: '$1'
 4689   - regex: '^LG([0-9]+[A-Za-z]*)'
 4690     device_replacement: 'LG $1'
 4691     brand_replacement: 'LG'
 4692     model_replacement: '$1'
 4693 
 4694   ##########
 4695   # microsoft
 4696   ##########
 4697   - regex: '(KIN\.[^ ]+) (\d+)\.(\d+)'
 4698     device_replacement: 'Microsoft $1'
 4699     brand_replacement: 'Microsoft'
 4700     model_replacement: '$1'
 4701   - regex: '(?:MSIE|XBMC).*\b(Xbox)\b'
 4702     device_replacement: '$1'
 4703     brand_replacement: 'Microsoft'
 4704     model_replacement: '$1'
 4705   - regex: '; ARM; Trident/6\.0; Touch[\);]'
 4706     device_replacement: 'Microsoft Surface RT'
 4707     brand_replacement: 'Microsoft'
 4708     model_replacement: 'Surface RT'
 4709 
 4710   ##########
 4711   # motorola
 4712   ##########
 4713   - regex: 'Motorola\-([A-Za-z0-9]+)'
 4714     device_replacement: 'Motorola $1'
 4715     brand_replacement: 'Motorola'
 4716     model_replacement: '$1'
 4717   - regex: 'MOTO\-([A-Za-z0-9]+)'
 4718     device_replacement: 'Motorola $1'
 4719     brand_replacement: 'Motorola'
 4720     model_replacement: '$1'
 4721   - regex: 'MOT\-([A-z0-9][A-z0-9\-]*)'
 4722     device_replacement: 'Motorola $1'
 4723     brand_replacement: 'Motorola'
 4724     model_replacement: '$1'
 4725 
 4726   ##########
 4727   # nintendo
 4728   ##########
 4729   - regex: 'Nintendo WiiU'
 4730     device_replacement: 'Nintendo Wii U'
 4731     brand_replacement: 'Nintendo'
 4732     model_replacement: 'Wii U'
 4733   - regex: 'Nintendo (DS|3DS|DSi|Wii);'
 4734     device_replacement: 'Nintendo $1'
 4735     brand_replacement: 'Nintendo'
 4736     model_replacement: '$1'
 4737 
 4738   ##########
 4739   # pantech
 4740   ##########
 4741   - regex: '(?:Pantech|PANTECH)[ _-]?([A-Za-z0-9\-]+)'
 4742     device_replacement: 'Pantech $1'
 4743     brand_replacement: 'Pantech'
 4744     model_replacement: '$1'
 4745 
 4746   ##########
 4747   # philips
 4748   ##########
 4749   - regex: 'Philips([A-Za-z0-9]+)'
 4750     device_replacement: 'Philips $1'
 4751     brand_replacement: 'Philips'
 4752     model_replacement: '$1'
 4753   - regex: 'Philips ([A-Za-z0-9]+)'
 4754     device_replacement: 'Philips $1'
 4755     brand_replacement: 'Philips'
 4756     model_replacement: '$1'
 4757 
 4758   ##########
 4759   # Samsung
 4760   ##########
 4761   # Samsung Smart-TV
 4762   - regex: '(SMART-TV); .* Tizen '
 4763     device_replacement: 'Samsung $1'
 4764     brand_replacement: 'Samsung'
 4765     model_replacement: '$1'
 4766   # Samsung Symbian Devices
 4767   - regex: 'SymbianOS/9\.\d.* Samsung[/\-]([A-Za-z0-9 \-]+)'
 4768     device_replacement: 'Samsung $1'
 4769     brand_replacement: 'Samsung'
 4770     model_replacement: '$1'
 4771   - regex: '(Samsung)(SGH)(i[0-9]+)'
 4772     device_replacement: '$1 $2$3'
 4773     brand_replacement: '$1'
 4774     model_replacement: '$2-$3'
 4775   - regex: 'SAMSUNG-ANDROID-MMS/([^;/]+)'
 4776     device_replacement: '$1'
 4777     brand_replacement: 'Samsung'
 4778     model_replacement: '$1'
 4779   # Other Samsung
 4780   #- regex: 'SAMSUNG(?:; |-)([A-Za-z0-9\-]+)'
 4781   - regex: 'SAMSUNG(?:; |[ -/])([A-Za-z0-9\-]+)'
 4782     regex_flag: 'i'
 4783     device_replacement: 'Samsung $1'
 4784     brand_replacement: 'Samsung'
 4785     model_replacement: '$1'
 4786 
 4787   ##########
 4788   # Sega
 4789   ##########
 4790   - regex: '(Dreamcast)'
 4791     device_replacement: 'Sega $1'
 4792     brand_replacement: 'Sega'
 4793     model_replacement: '$1'
 4794 
 4795   ##########
 4796   # Siemens mobile
 4797   ##########
 4798   - regex: '^SIE-([A-Za-z0-9]+)'
 4799     device_replacement: 'Siemens $1'
 4800     brand_replacement: 'Siemens'
 4801     model_replacement: '$1'
 4802 
 4803   ##########
 4804   # Softbank
 4805   ##########
 4806   - regex: 'Softbank/[12]\.0/([A-Za-z0-9]+)'
 4807     device_replacement: 'Softbank $1'
 4808     brand_replacement: 'Softbank'
 4809     model_replacement: '$1'
 4810 
 4811   ##########
 4812   # SonyEricsson
 4813   ##########
 4814   - regex: 'SonyEricsson ?([A-Za-z0-9\-]+)'
 4815     device_replacement: 'Ericsson $1'
 4816     brand_replacement: 'SonyEricsson'
 4817     model_replacement: '$1'
 4818 
 4819   ##########
 4820   # Sony
 4821   ##########
 4822   - regex: 'Android [^;]+; ([^ ]+) (Sony)/'
 4823     device_replacement: '$2 $1'
 4824     brand_replacement: '$2'
 4825     model_replacement: '$1'
 4826   - regex: '(Sony)(?:BDP\/|\/)?([^ /;\)]+)[ /;\)]'
 4827     device_replacement: '$1 $2'
 4828     brand_replacement: '$1'
 4829     model_replacement: '$2'
 4830 
 4831   #########
 4832   # Puffin Browser Device detect
 4833   # A=Android, I=iOS, P=Phone, T=Tablet
 4834   # AT=Android+Tablet
 4835   #########
 4836   - regex: 'Puffin/[\d\.]+IT'
 4837     device_replacement: 'iPad'
 4838     brand_replacement: 'Apple'
 4839     model_replacement: 'iPad'
 4840   - regex: 'Puffin/[\d\.]+IP'
 4841     device_replacement: 'iPhone'
 4842     brand_replacement: 'Apple'
 4843     model_replacement: 'iPhone'
 4844   - regex: 'Puffin/[\d\.]+AT'
 4845     device_replacement: 'Generic Tablet'
 4846     brand_replacement: 'Generic'
 4847     model_replacement: 'Tablet'
 4848   - regex: 'Puffin/[\d\.]+AP'
 4849     device_replacement: 'Generic Smartphone'
 4850     brand_replacement: 'Generic'
 4851     model_replacement: 'Smartphone'
 4852 
 4853   #########
 4854   # Android General Device Matching (far from perfect)
 4855   #########
 4856   - regex: 'Android[\- ][\d]+\.[\d]+; [A-Za-z]{2}\-[A-Za-z]{0,2}; WOWMobile (.+) Build[/ ]'
 4857     brand_replacement: 'Generic_Android'
 4858     model_replacement: '$1'
 4859   - regex: 'Android[\- ][\d]+\.[\d]+\-update1; [A-Za-z]{2}\-[A-Za-z]{0,2} *; *(.+?) Build[/ ]'
 4860     brand_replacement: 'Generic_Android'
 4861     model_replacement: '$1'
 4862   - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[A-Za-z]{2}[_\-][A-Za-z]{0,2}\-? *; *(.+?) Build[/ ]'
 4863     brand_replacement: 'Generic_Android'
 4864     model_replacement: '$1'
 4865   - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[A-Za-z]{0,2}\- *; *(.+?) Build[/ ]'
 4866     brand_replacement: 'Generic_Android'
 4867     model_replacement: '$1'
 4868   # No build info at all - "Build" follows locale immediately
 4869   - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *[a-z]{0,2}[_\-]?[A-Za-z]{0,2};? Build[/ ]'
 4870     device_replacement: 'Generic Smartphone'
 4871     brand_replacement: 'Generic'
 4872     model_replacement: 'Smartphone'
 4873   - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}; *\-?[A-Za-z]{2}; *(.+?) Build[/ ]'
 4874     brand_replacement: 'Generic_Android'
 4875     model_replacement: '$1'
 4876   - regex: 'Android[\- ][\d]+(?:\.[\d]+){1,2}(?:;.*)?; *(.+?) Build[/ ]'
 4877     brand_replacement: 'Generic_Android'
 4878     model_replacement: '$1'
 4879 
 4880   ##########
 4881   # Google TV
 4882   ##########
 4883   - regex: '(GoogleTV)'
 4884     brand_replacement: 'Generic_Inettv'
 4885     model_replacement: '$1'
 4886 
 4887   ##########
 4888   # WebTV
 4889   ##########
 4890   - regex: '(WebTV)/\d+.\d+'
 4891     brand_replacement: 'Generic_Inettv'
 4892     model_replacement: '$1'
 4893   # Roku Digital-Video-Players https://www.roku.com/
 4894   - regex: '^(Roku)/DVP-\d+\.\d+'
 4895     brand_replacement: 'Generic_Inettv'
 4896     model_replacement: '$1'
 4897 
 4898   ##########
 4899   # Generic Tablet
 4900   ##########
 4901   - regex: '(Android 3\.\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))'
 4902     regex_flag: 'i'
 4903     device_replacement: 'Generic Tablet'
 4904     brand_replacement: 'Generic'
 4905     model_replacement: 'Tablet'
 4906 
 4907   ##########
 4908   # Generic Smart Phone
 4909   ##########
 4910   - regex: '(Symbian|\bS60(Version|V\d)|\bS60\b|\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .+Firefox/|iPhone OS|Android|MobileSafari|Windows *Phone|\(webOS/|PalmOS)'
 4911     device_replacement: 'Generic Smartphone'
 4912     brand_replacement: 'Generic'
 4913     model_replacement: 'Smartphone'
 4914   - regex: '(hiptop|avantgo|plucker|xiino|blazer|elaine)'
 4915     regex_flag: 'i'
 4916     device_replacement: 'Generic Smartphone'
 4917     brand_replacement: 'Generic'
 4918     model_replacement: 'Smartphone'
 4919 
 4920   ##########
 4921   # Spiders (this is hack...)
 4922   ##########
 4923   - regex: '(bot|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify)'
 4924     regex_flag: 'i'
 4925     device_replacement: 'Spider'
 4926     brand_replacement: 'Spider'
 4927     model_replacement: 'Desktop'
 4928 
 4929   ##########
 4930   # Generic Feature Phone
 4931   # take care to do case insensitive matching
 4932   ##########
 4933   - regex: '^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\-|airn|alav|asus|attw|au\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bmobile|bell|bird|bw\-n|bw\-u|beck|benq|bilb|blac|c55/|cdm\-|chtm|capi|comp|cond|dall|dbte|dc\-s|dica|ds\-d|ds12|dait|devi|dmob|doco|dopo|dorado|el(?:38|39|48|49|50|55|58|68)|el[3456]\d{2}dual|erk0|esl8|ex300|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\-|fly_|g\-mo|g1 u|g560|gf\-5|grun|gene|go.w|good|grad|hcit|hd\-m|hd\-p|hd\-t|hei\-|hp i|hpip|hs\-c|htc |htc\-|htca|htcg)'
 4934     regex_flag: 'i'
 4935     device_replacement: 'Generic Feature Phone'
 4936     brand_replacement: 'Generic'
 4937     model_replacement: 'Feature Phone'
 4938   - regex: '^(htcp|htcs|htct|htc_|haie|hita|huaw|hutc|i\-20|i\-go|i\-ma|i\-mobile|i230|iac|iac\-|iac/|ig01|im1k|inno|iris|jata|kddi|kgt|kgt/|kpt |kwc\-|klon|lexi|lg g|lg\-a|lg\-b|lg\-c|lg\-d|lg\-f|lg\-g|lg\-k|lg\-l|lg\-m|lg\-o|lg\-p|lg\-s|lg\-t|lg\-u|lg\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\-|lge/|leno|m1\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\-|nem\-|newg|neon)'
 4939     regex_flag: 'i'
 4940     device_replacement: 'Generic Feature Phone'
 4941     brand_replacement: 'Generic'
 4942     model_replacement: 'Feature Phone'
 4943   - regex: '^(netf|noki|nzph|o2 x|o2\-x|opwv|owg1|opti|oran|ot\-s|p800|pand|pg\-1|pg\-2|pg\-3|pg\-6|pg\-8|pg\-c|pg13|phil|pn\-2|pt\-g|palm|pana|pire|pock|pose|psio|qa\-a|qc\-2|qc\-3|qc\-5|qc\-7|qc07|qc12|qc21|qc32|qc60|qci\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\-|scp\-|sdk/|se47|sec\-|sec0|sec1|semc|sgh\-|shar|sie\-|sk\-0|sl45|slid|smb3|smt5|sp01|sph\-|spv |spv\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\-mo|t218|t250|t600|t610|t618|tcl\-|tdg\-|telm|tim\-|ts70|tsm\-|tsm3|tsm5|tx\-9|tagt)'
 4944     regex_flag: 'i'
 4945     device_replacement: 'Generic Feature Phone'
 4946     brand_replacement: 'Generic'
 4947     model_replacement: 'Feature Phone'
 4948   - regex: '^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vertu|vite|voda|vulc|w3c |w3c\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\-|your|zte\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\-|webc|whit|wmlb|xda\-|xda_)'
 4949     regex_flag: 'i'
 4950     device_replacement: 'Generic Feature Phone'
 4951     brand_replacement: 'Generic'
 4952     model_replacement: 'Feature Phone'
 4953   - regex: '^(Ice)$'
 4954     device_replacement: 'Generic Feature Phone'
 4955     brand_replacement: 'Generic'
 4956     model_replacement: 'Feature Phone'
 4957   - regex: '(wap[\-\ ]browser|maui|netfront|obigo|teleca|up\.browser|midp|Opera Mini)'
 4958     regex_flag: 'i'
 4959     device_replacement: 'Generic Feature Phone'
 4960     brand_replacement: 'Generic'
 4961     model_replacement: 'Feature Phone'