1<?php 2 3/** 4 * Device Detector - The Universal Device Detection library for parsing User Agents 5 * 6 * @link https://matomo.org 7 * 8 * @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later 9 */ 10 11declare(strict_types=1); 12 13namespace DeviceDetector\Parser\Device; 14 15use DeviceDetector\Parser\AbstractParser; 16 17/** 18 * Class AbstractDeviceParser 19 * 20 * Abstract class for all device parsers 21 */ 22abstract class AbstractDeviceParser extends AbstractParser 23{ 24 /** 25 * @var ?int 26 */ 27 protected $deviceType = null; 28 29 /** 30 * @var string 31 */ 32 protected $model = ''; 33 34 /** 35 * @var string 36 */ 37 protected $brand = ''; 38 39 public const DEVICE_TYPE_DESKTOP = 0; 40 public const DEVICE_TYPE_SMARTPHONE = 1; 41 public const DEVICE_TYPE_TABLET = 2; 42 public const DEVICE_TYPE_FEATURE_PHONE = 3; 43 public const DEVICE_TYPE_CONSOLE = 4; 44 public const DEVICE_TYPE_TV = 5; // including set top boxes, blu-ray players,... 45 public const DEVICE_TYPE_CAR_BROWSER = 6; 46 public const DEVICE_TYPE_SMART_DISPLAY = 7; 47 public const DEVICE_TYPE_CAMERA = 8; 48 public const DEVICE_TYPE_PORTABLE_MEDIA_PAYER = 9; 49 public const DEVICE_TYPE_PHABLET = 10; 50 public const DEVICE_TYPE_SMART_SPEAKER = 11; 51 public const DEVICE_TYPE_WEARABLE = 12; // including set watches, headsets 52 public const DEVICE_TYPE_PERIPHERAL = 13; // including portable terminal, portable projector 53 54 /** 55 * Detectable device types 56 * 57 * @var array 58 */ 59 protected static $deviceTypes = [ 60 'desktop' => self::DEVICE_TYPE_DESKTOP, 61 'smartphone' => self::DEVICE_TYPE_SMARTPHONE, 62 'tablet' => self::DEVICE_TYPE_TABLET, 63 'feature phone' => self::DEVICE_TYPE_FEATURE_PHONE, 64 'console' => self::DEVICE_TYPE_CONSOLE, 65 'tv' => self::DEVICE_TYPE_TV, 66 'car browser' => self::DEVICE_TYPE_CAR_BROWSER, 67 'smart display' => self::DEVICE_TYPE_SMART_DISPLAY, 68 'camera' => self::DEVICE_TYPE_CAMERA, 69 'portable media player' => self::DEVICE_TYPE_PORTABLE_MEDIA_PAYER, 70 'phablet' => self::DEVICE_TYPE_PHABLET, 71 'smart speaker' => self::DEVICE_TYPE_SMART_SPEAKER, 72 'wearable' => self::DEVICE_TYPE_WEARABLE, 73 'peripheral' => self::DEVICE_TYPE_PERIPHERAL, 74 ]; 75 76 /** 77 * Known device brands 78 * 79 * Note: Before using a new brand in on of the regex files, it needs to be added here 80 * 81 * @var array 82 */ 83 public static $deviceBrands = [ 84 '5E' => '2E', 85 '5IV' => '5IVE', 86 '2F' => 'F2 Mobile', 87 '3Q' => '3Q', 88 'J7' => '7 Mobile', 89 '2Q' => '3GNET', 90 '4G' => '4Good', 91 '27' => '3GO', 92 '04' => '4ife', 93 '36' => '360', 94 '88' => '8848', 95 '10M' => '10moons', 96 '41' => 'A1', 97 'AK1' => 'A&K', 98 '00' => 'Accent', 99 'ACC' => 'Accesstyle', 100 'AE' => 'Ace', 101 'AC' => 'Acer', 102 'ACL' => 'Aceline', 103 'ACP' => 'Acepad', 104 '3K' => 'Acteck', 105 'ACT' => 'actiMirror', 106 'A9' => 'Advan', 107 'AD' => 'Advance', 108 'ADV' => 'Advantage Air', 109 '76' => 'Adronix', 110 'ADR' => 'Adreamer', 111 'AF' => 'AfriOne', 112 'FY' => 'AFFIX', 113 'A3' => 'AGM', 114 'AEE' => 'AEEZO', 115 'J0' => 'AG Mobile', 116 'AJI' => 'Ajib', 117 'AZ' => 'Ainol', 118 'AIR' => 'Airis', 119 'AI' => 'Airness', 120 'ARP' => 'Airpha', 121 'AT' => 'Airties', 122 '7U' => 'Airtel', 123 'AIT' => 'AirTouch', 124 'U0' => 'AIRON', 125 '0A' => 'AIS', 126 'AW' => 'Aiwa', 127 '85' => 'Aiuto', 128 'U7' => 'AIDATA', 129 'AL1' => 'AileTV', 130 'AK' => 'Akai', 131 'Q3' => 'AKIRA', 132 '1A' => 'Alba', 133 'AL' => 'Alcatel', 134 'AL0' => 'Alienware', 135 '20' => 'Alcor', 136 'XY' => 'Alps', 137 'XYA' => 'XY Auto', 138 'AAU' => 'AAUW', 139 '7L' => 'ALDI NORD', 140 '6L' => 'ALDI SÜD', 141 '3L' => 'Alfawise', 142 '4A' => 'Aligator', 143 'ALS' => 'All Star', 144 'AA' => 'AllCall', 145 '3A' => 'AllDocube', 146 'ALL' => 'allente', 147 'A2' => 'Allview', 148 'ALI' => 'ALLINmobile', 149 'A7' => 'Allwinner', 150 'ALP' => 'alpsmart', 151 'A1' => 'Altech UEC', 152 '66' => 'Altice', 153 'ALM' => 'Altimo', 154 'A5' => 'altron', 155 'ALB' => 'Altibox', 156 'ALT' => 'Altus', 157 'KN' => 'Amazon', 158 'AMZ' => 'Amazon Basics', 159 'AMA' => 'AMA', 160 'AG' => 'AMGOO', 161 '9A' => 'Amigoo', 162 'AO' => 'Amoi', 163 '3J' => 'Amino', 164 '54' => 'AMCV', 165 '60' => 'Andowl', 166 'ANX' => 'ANXONIT', 167 'ANL' => 'ANCEL', 168 'ANC' => 'ANBERNIC', 169 'AND' => 'andersson', 170 '6J' => 'Angelcare', 171 'ANG' => 'AngelTech', 172 '7A' => 'Anry', 173 'A0' => 'ANS', 174 '74' => 'Anker', 175 '3N' => 'Aoson', 176 'O8' => 'AOC', 177 'J2' => 'AOYODKG', 178 '55' => 'AOpen', 179 'RW' => 'Aoro', 180 '9Y' => 'Aocos', 181 'AOW' => 'Aocwei', 182 'AP' => 'Apple', 183 'APS' => 'ApoloSign', 184 'ARC' => 'Arçelik', 185 'AR' => 'Archos', 186 'AB' => 'Arian Space', 187 'ARI' => 'Arival', 188 'A6' => 'Ark', 189 '5A' => 'ArmPhone', 190 'AN' => 'Arnova', 191 'AS' => 'ARRIS', 192 'AQ' => 'Aspera', 193 'HJ' => 'Aquarius', 194 '40' => 'Artel', 195 '21' => 'Artizlee', 196 '59' => 'ArtLine', 197 '8A' => 'Asano', 198 '90' => 'Asanzo', 199 '1U' => 'Astro (UA)', 200 'AST' => 'astro (MY)', 201 'A4' => 'Ask', 202 'A8' => 'Assistant', 203 'ASS' => 'ASSE', 204 'AU' => 'Asus', 205 '6A' => 'AT&T', 206 'ATH' => 'Athesi', 207 'ATE' => 'Atlantic Electrics', 208 '5Q' => 'Atmaca Elektronik', 209 'YH' => 'ATMAN', 210 'ATM' => 'ATMPC', 211 '2A' => 'Atom', 212 'AT1' => 'Atozee', 213 'ATO' => 'ATOL', 214 'Z2' => 'Atvio', 215 'ATI' => 'Attila', 216 'ATU' => 'Atouch', 217 'AX' => 'Audiovox', 218 'AJ' => 'AURIS', 219 'YZ' => 'Autan', 220 'AUP' => 'AUPO', 221 'ZA' => 'Avenzo', 222 'AH' => 'AVH', 223 'AV' => 'Avvio', 224 'AVA' => 'Avaya', 225 'AXE' => 'AXEN', 226 'AY' => 'Axxion', 227 'AXX' => 'AXXA', 228 'AYA' => 'AYA', 229 'YR' => 'AYYA', 230 'XA' => 'Axioo', 231 'AM' => 'Azumi Mobile', 232 'AZE' => 'Azeyou', 233 'AZU' => 'Azupik', 234 'AZO' => 'AZOM', 235 'WW' => 'Awow', 236 'AWO' => 'AWOX', 237 'XU' => 'AUX', 238 'BAC' => 'Backcell', 239 'BFF' => 'BAFF', 240 'BO' => 'BangOlufsen', 241 'BN' => 'Barnes & Noble', 242 'BAR' => 'BARTEC', 243 'BAS' => 'BASE', 244 'BAU' => 'BAUHN', 245 'BB' => 'BBK', 246 '0B' => 'BB Mobile', 247 'B6' => 'BDF', 248 'QD' => 'BDQ', 249 '8Z' => 'BDsharing', 250 'BEF' => 'Beafon', 251 'BE' => 'Becker', 252 'B5' => 'Beeline', 253 'B0' => 'Beelink', 254 'BL' => 'Beetel', 255 'BEK' => 'Beko', 256 '2X' => 'Benco', 257 'BQ' => 'BenQ', 258 'BQL' => 'Bqeel', 259 'BS' => 'BenQ-Siemens', 260 '4Y' => 'Benzo', 261 'XJ' => 'Benesse', 262 'BEN' => 'BenWee', 263 'YB' => 'Beista', 264 'BY' => 'BS Mobile', 265 'BZ' => 'Bezkam', 266 'BEL' => 'Bell', 267 '9B' => 'Bellphone', 268 '63' => 'Beyond', 269 'BG' => 'BGH', 270 '6B' => 'Bigben', 271 'B8' => 'BIHEE', 272 '1B' => 'Billion', 273 'BA' => 'BilimLand', 274 'BIL' => 'Billow', 275 'BH' => 'BioRugged', 276 'BI' => 'Bird', 277 'BT' => 'Bitel', 278 'B7' => 'Bitmore', 279 'ZB' => 'Bittium', 280 'BIE' => 'Biegedy', 281 'BK' => 'Bkav', 282 '5B' => 'Black Bear', 283 'BLK' => 'Black Box', 284 'BF' => 'Black Fox', 285 'BPC' => 'Blackpcs', 286 'BLP' => 'Blackphone', 287 'BLT' => 'Blackton', 288 'B2' => 'Blackview', 289 '2Y' => 'b2m', 290 'BP' => 'Blaupunkt', 291 'BU' => 'Blu', 292 'BUS' => 'BluSlate', 293 'BUZ' => 'BuzzTV', 294 'B3' => 'Bluboo', 295 '2B' => 'Bluedot', 296 'BD' => 'Bluegood', 297 'LB' => 'Bluewave', 298 'J8' => 'Bluebird', 299 'BSS' => 'BlueSky', 300 '7B' => 'Blloc', 301 'UB' => 'Bleck', 302 'Q2' => 'Blow', 303 'BLI' => 'BLISS', 304 'BM' => 'Bmobile', 305 'Y5' => 'BMAX', 306 'BMX' => 'BMXC', 307 'B9' => 'Bobarry', 308 'B4' => 'bogo', 309 'BOL' => 'Bolva', 310 'BW' => 'Boway', 311 'BOO' => 'Boost', 312 'BOK' => 'Bookeen', 313 'BOT' => 'Botech', 314 'BX' => 'bq', 315 '8B' => 'Brandt', 316 'BRA' => 'BrandCode', 317 'BV' => 'Bravis', 318 'BRV' => 'BRAVE', 319 'BRG' => 'Brigmton', 320 'BR' => 'Brondi', 321 'XF' => 'BROR', 322 'BJ' => 'BrightSign', 323 'B1' => 'Bush', 324 '4Q' => 'Bundy', 325 'Y8' => 'Bubblegum', 326 'BMW' => 'BMW', 327 'BYJ' => 'BYJU\'S', 328 'BYY' => 'BYYBUO', 329 'BYD' => 'BYD', 330 'C9' => 'CAGI', 331 'CAD' => 'CADENA', 332 'CAI' => 'Caixun', 333 'CT' => 'Capitel', 334 'GRD' => 'G-Guard', 335 'G3' => 'CG Mobile', 336 '37' => 'CGV', 337 'CP' => 'Captiva', 338 'CPD' => 'CPDEVICE', 339 'CF' => 'Carrefour', 340 'CA1' => 'Carbon Mobile', 341 'CS' => 'Casio', 342 'R4' => 'Casper', 343 'CA' => 'Cat', 344 'BC' => 'Camfone', 345 'CJ' => 'Cavion', 346 'CNM' => 'Canaima', 347 'CAN' => 'Canal+', 348 '4D' => 'Canal Digital', 349 'CNG' => 'Canguro', 350 'CNT' => 'CCIT', 351 'CEC' => 'Cecotec', 352 'CEP' => 'CEPTER', 353 'CEI' => 'Ceibal', 354 '02' => 'Cell-C', 355 'CEL' => 'Cellacom', 356 '34' => 'CellAllure', 357 '7C' => 'Celcus', 358 'CE' => 'Celkon', 359 'CG' => 'Cellution', 360 '62' => 'Centric', 361 'CEN' => 'CENTEK', 362 'C2' => 'Changhong', 363 'CHA' => 'Chainway', 364 'CHG' => 'ChiliGreen', 365 'CH' => 'Cherry Mobile', 366 'C3' => 'China Mobile', 367 'U9' => 'China Telecom', 368 'CI' => 'Chico Mobile', 369 'CHC' => 'CHCNAV', 370 'CIA' => 'C Idea', 371 'CIP' => 'CipherLab', 372 'CIT' => 'Citycall', 373 '1C' => 'Chuwi', 374 'L8' => 'Clarmin', 375 '25' => 'Claresta', 376 'CLA' => 'CLAYTON', 377 'CLT' => 'Clovertek', 378 '1J' => 'Cloud', 379 'CD' => 'Cloudfone', 380 '6C' => 'Cloudpad', 381 'C0' => 'Clout', 382 'CN' => 'CnM', 383 'CY' => 'Coby Kyros', 384 'XC' => 'Cobalt', 385 'C6' => 'Comio', 386 'COM' => 'CommScope', 387 'CL' => 'Compal', 388 'CQ' => 'Compaq', 389 'C7' => 'ComTrade Tesla', 390 '7Z' => 'COMPUMAX', 391 'C8' => 'Concord', 392 'CC' => 'ConCorde', 393 'C5' => 'Condor', 394 'C5M' => 'C5 Mobile', 395 'COE' => 'Cogeco', 396 '4C' => 'Conquest', 397 'COG' => 'CONSUNG', 398 '3C' => 'Contixo', 399 '8C' => 'Connex', 400 '53' => 'Connectce', 401 'CON' => 'Conceptum', 402 'CED' => 'Continental Edison', 403 '9C' => 'Colors', 404 'COL' => 'COLORROOM', 405 'CAA' => 'coocaa', 406 'CO' => 'Coolpad', 407 'COO' => 'Coopers', 408 'CDE' => 'COOD-E', 409 '4R' => 'CORN', 410 '1O' => 'Cosmote', 411 'CW' => 'Cowon', 412 '75' => 'Covia', 413 'QG' => 'COYOTE', 414 'CKK' => 'CKK Mobile', 415 'YW' => 'ClearPHONE', 416 '33' => 'Clementoni', 417 'CR' => 'CreNova', 418 'CX' => 'Crescent', 419 'CRE' => 'Crestron', 420 'CK' => 'Cricket', 421 'CM' => 'Crius Mea', 422 'CMF' => 'CMF', 423 '0C' => 'Crony', 424 'C1' => 'Crosscall', 425 '4W' => 'Crown', 426 'CTR' => 'Ctroniq', 427 'CU' => 'Cube', 428 'CB' => 'CUBOT', 429 'CUI' => 'Cuiud', 430 'CUL' => 'Cultraview', 431 'CV' => 'CVTE', 432 'CWO' => 'Cwowdefu', 433 'CX0' => 'CX', 434 'C4' => 'Cyrus', 435 'D5' => 'Daewoo', 436 'DA' => 'Danew', 437 'DAN' => 'Dany', 438 'DA1' => 'DangcapHD', 439 'DAR' => 'Daria', 440 'DT' => 'Datang', 441 'D7' => 'Datawind', 442 '7D' => 'Datamini', 443 '6D' => 'Datalogic', 444 'D1' => 'Datsun', 445 'DZ' => 'Dazen', 446 'DAS' => 'DASS', 447 'DAW' => 'Dawlance', 448 'DB' => 'Dbtel', 449 'DBP' => 'DbPhone', 450 'DCO' => 'Dcode', 451 'DL' => 'Dell', 452 'DL0' => 'DL', 453 'DE' => 'Denver', 454 'DS' => 'Desay', 455 'DSD' => 'DSDevices', 456 'DSI' => 'DSIC', 457 'DW' => 'DeWalt', 458 'DX' => 'DEXP', 459 'DEY' => 'DEYI', 460 'DEN' => 'Denali', 461 'DEA' => 'DEALDIG', 462 'DNK' => 'Denka', 463 '8D' => 'DF', 464 'DGT' => 'DGTEC', 465 'DG' => 'Dialog', 466 'DIA' => 'DIALN', 467 'DI' => 'Dicam', 468 'D4' => 'Digi', 469 'D3' => 'Digicel', 470 'DDG' => 'Digidragon', 471 'DH' => 'Digihome', 472 'DD' => 'Digiland', 473 'DIJ' => 'DIJITSU', 474 'DIG' => 'Digit4G', 475 'DIC' => 'DIGICOM', 476 'Q0' => 'DIGIFORS', 477 'DIK' => 'DIKOM', 478 'DQ' => 'DISH', 479 'DIS' => 'Disney', 480 '9D' => 'Ditecma', 481 'D2' => 'Digma', 482 '1D' => 'Diva', 483 'DIV' => 'DiverMax', 484 'D6' => 'Divisat', 485 'DIO' => 'DIORA', 486 'DIF' => 'Diofox', 487 'X6' => 'DIXON', 488 'DIM' => 'DIMO', 489 '5D' => 'DING DING', 490 'DIN' => 'Dinax', 491 'DNA' => 'Dinalink', 492 'DM' => 'DMM', 493 'DMO' => 'DMOAO', 494 'DN' => 'DNS', 495 'DC' => 'DoCoMo', 496 'DF' => 'Doffler', 497 'D9' => 'Dolamee', 498 'DO' => 'Doogee', 499 'D0' => 'Doopro', 500 'DV' => 'Doov', 501 'DOM' => 'Dom.ru', 502 'DP' => 'Dopod', 503 'DPA' => 'DPA', 504 'JQ' => 'Doppio', 505 'DR' => 'Doro', 506 'DOR' => 'Dora', 507 'ZD' => 'DORLAND', 508 'DRO' => 'Droidlogic', 509 'D8' => 'Droxio', 510 'DJ' => 'Dragon Touch', 511 'DRA' => 'DRAGON', 512 'DY' => 'Dreamgate', 513 'DRE' => 'DreamTab', 514 'DR1' => 'DreamStar', 515 'DTA' => 'Dtac', 516 'DU' => 'Dune HD', 517 'DUO' => 'DuoTV', 518 'UD' => 'DUNNS Mobile', 519 'DUU' => 'Duubee', 520 'DUR' => 'Durabook', 521 'DUD' => 'DUDU AUTO', 522 'DYO' => 'Dyon', 523 'DYM' => 'Dykemann', 524 'DTE' => 'D-Tech', 525 'DLI' => 'D-Link', 526 'ENO' => 'eNOVA', 527 'IN2' => 'iNOVA', 528 'IN3' => 'inovo', 529 'INH' => 'Inhon', 530 'IND' => 'Indurama', 531 'EB' => 'E-Boda', 532 'EJ' => 'Engel', 533 'ENA' => 'ENACOM', 534 'END' => 'ENDURO', 535 'ENI' => 'ENIE', 536 '2E' => 'E-Ceros', 537 'E8' => 'E-tel', 538 'ETH' => 'E-TACHI', 539 'EAS' => 'EAS Electric', 540 'EP' => 'Easypix', 541 'EQ' => 'Eagle', 542 'EGS' => 'EagleSoar', 543 'EA' => 'EBEST', 544 'YC' => 'EBEN', 545 'E4' => 'Echo Mobiles', 546 'EQ1' => 'Equator', 547 'ES' => 'ECS', 548 '35' => 'ECON', 549 'ECC' => 'ECOO', 550 'ZZ' => 'ecom', 551 'ECS' => 'EcoStar', 552 'EDE' => 'Edenwood', 553 'E6' => 'EE', 554 'GW' => 'EGL', 555 'EGO' => 'EGOTEK', 556 'EFT' => 'EFT', 557 'EK' => 'EKO', 558 'EY' => 'Einstein', 559 'EM' => 'Eks Mobility', 560 'UE' => 'Ematic', 561 'EMR' => 'Emporia', 562 '4K' => 'EKT', 563 'EKI' => 'EKINOX', 564 '7E' => 'ELARI', 565 '03' => 'Electroneum', 566 'Z8' => 'ELECTRONIA', 567 'ELG' => 'ELE-GATE', 568 'EL1' => 'Elecson', 569 'ELK' => 'Elektroland', 570 'L0' => 'Element', 571 'EG' => 'Elenberg', 572 'EL' => 'Elephone', 573 'JE' => 'Elekta', 574 'ELE' => 'Elevate', 575 'ELS' => 'Elista', 576 'ELT' => 'elit', 577 '4E' => 'Eltex', 578 'ELM' => 'Elong Mobile', 579 'ED' => 'Energizer', 580 'E1' => 'Energy Sistem', 581 '3E' => 'Enot', 582 'ENT' => 'Entity', 583 'ENV' => 'Envizen', 584 '8E' => 'Epik One', 585 'EPK' => 'Epic', 586 'XP' => 'Epson', 587 'EPH' => 'Ephone', 588 'E7' => 'Ergo', 589 'EC' => 'Ericsson', 590 '05' => 'Erisson', 591 'ER' => 'Ericy', 592 'EE' => 'Essential', 593 'E2' => 'Essentielb', 594 '6E' => 'eSTAR', 595 'ETO' => 'ETOE', 596 'EN' => 'Eton', 597 'ET' => 'eTouch', 598 '1E' => 'Etuline', 599 'EHL' => 'Ehlel', 600 'EU' => 'Eurostar', 601 '4J' => 'Eurocase', 602 'EUR' => 'EUROLUX', 603 'EUD' => 'Eudora', 604 'E9' => 'Evercoss', 605 'EV' => 'Evertek', 606 'EVE' => 'Everest', 607 'EV1' => 'Everex', 608 'EVR' => 'Everis', 609 'EVF' => 'Everfine', 610 'E3' => 'Evolio', 611 'EO' => 'Evolveo', 612 '0Q' => 'Evoo', 613 '5U' => 'EVPAD', 614 'EVV' => 'evvoli', 615 'E0' => 'EvroMedia', 616 'XE' => 'ExMobile', 617 '4Z' => 'Exmart', 618 'EH' => 'EXO', 619 'EX' => 'Explay', 620 'EXP' => 'Express LUCK', 621 'E5' => 'Extrem', 622 'EXL' => 'ExtraLink', 623 'EF' => 'EXCEED', 624 'QE' => 'EWIS', 625 'EI' => 'Ezio', 626 'EZ' => 'Ezze', 627 'UF' => 'EYU', 628 'EYE' => 'Eyemoo', 629 'UE1' => 'UE', 630 '5F' => 'F150', 631 'FPS' => 'F+', 632 'F6' => 'Facebook', 633 'FAC' => 'Facetel', 634 'FA1' => 'Facime', 635 'FA' => 'Fairphone', 636 'FM' => 'Famoco', 637 'FAM' => 'Famous', 638 '17' => 'FarEasTone', 639 '9R' => 'FaRao Pro', 640 'FAR' => 'Farassoo', 641 'FB' => 'Fantec', 642 'FE' => 'Fengxiang', 643 'FEN' => 'Fenoti', 644 'F7' => 'Fero', 645 '67' => 'FEONAL', 646 'FI' => 'FiGO', 647 'J9' => 'FiGi', 648 'FIG' => 'Figgers', 649 'F9' => 'FiiO', 650 'F1' => 'FinePower', 651 'FX' => 'Finlux', 652 'F3' => 'FireFly Mobile', 653 'F8' => 'FISE', 654 'FIS' => 'Fision', 655 'FIT' => 'FITCO', 656 'FLM' => 'Filimo', 657 'FIL' => 'FILIX', 658 'FIN' => 'FINIX', 659 'FL' => 'Fly', 660 'QC' => 'FLYCAT', 661 'FLY' => 'FLYCOAY', 662 'FLU' => 'Fluo', 663 'FN' => 'FNB', 664 'FOB' => 'Fobem', 665 'FD' => 'Fondi', 666 '0F' => 'Fourel', 667 '44' => 'Four Mobile', 668 'F0' => 'Fonos', 669 'F0N' => 'FONTEL', 670 'F2' => 'FORME', 671 'FRM' => 'Formovie', 672 'F5' => 'Formuler', 673 'FR' => 'Forstar', 674 'RF' => 'Fortis', 675 'FRT' => 'FortuneShip', 676 'FO' => 'Foxconn', 677 'FOD' => 'FoxxD', 678 'FJ' => 'FOODO', 679 'FOS' => 'FOSSiBOT', 680 'FRE' => 'free', 681 'FT' => 'Freetel', 682 'FTH' => 'FRESH', 683 'FEY' => 'FreeYond', 684 'FRU' => 'Frunsi', 685 'F4' => 'F&U', 686 '1F' => 'FMT', 687 'FPT' => 'FPT', 688 'FG' => 'Fuego', 689 'FUJ' => 'FUJICOM', 690 'FU' => 'Fujitsu', 691 '4F' => 'Funai', 692 '5J' => 'Fusion5', 693 'FF' => 'Future Mobile Technology', 694 'FFF' => 'FFF SmartLife', 695 'FW' => 'FNF', 696 'FXT' => 'Fxtec', 697 'GT' => 'G-TiDE', 698 'G9' => 'G-Touch', 699 'GFO' => 'Gfone', 700 'GTM' => 'GTMEDIA', 701 'GTX' => 'GTX', 702 'GDL' => 'GDL', 703 '0G' => 'GFive', 704 'GM' => 'Garmin-Asus', 705 'GA' => 'Gateway', 706 '99' => 'Galaxy Innovations', 707 'GA1' => 'Galactic', 708 'GAT' => 'Galatec', 709 'GAM' => 'Gamma', 710 'GAZ' => 'Gazer', 711 'GAL' => 'Gazal', 712 'GEA' => 'Geanee', 713 'GEN' => 'Geant', 714 'GD' => 'Gemini', 715 'GN' => 'General Mobile', 716 '2G' => 'Genesis', 717 'GEP' => 'Geo Phone', 718 'G2' => 'GEOFOX', 719 'GE' => 'Geotel', 720 'Q4' => 'Geotex', 721 'GEO' => 'GEOZON', 722 'GNO' => 'Getnord', 723 'GER' => 'Gear Mobile', 724 'GH' => 'Ghia', 725 '2C' => 'Ghong', 726 'GJ' => 'Ghost', 727 'GG' => 'Gigabyte', 728 'GS' => 'Gigaset', 729 'GZ' => 'Ginzzu', 730 '1G' => 'Gini', 731 'GI' => 'Gionee', 732 'GIR' => 'GIRASOLE', 733 'G4' => 'Globex', 734 'GLB' => 'Globmall', 735 'GME' => 'GlocalMe', 736 '38' => 'GLONYX', 737 'U6' => 'Glofiish', 738 'GLO' => 'Glory Star', 739 'GNE' => 'GN Electronics', 740 'G7' => 'GoGEN', 741 'GC' => 'GOCLEVER', 742 '5G' => 'Gocomma', 743 'GB' => 'Gol Mobile', 744 'GL' => 'Goly', 745 'GOL' => 'GoldMaster', 746 'GOS' => 'GoldStar', 747 'GOB' => 'GOLDBERG', 748 'GX' => 'GLX', 749 'G5' => 'Gome', 750 'G1' => 'GoMobile', 751 'GO' => 'Google', 752 'G0' => 'Goophone', 753 '6G' => 'Gooweel', 754 'GOO' => 'GOODTEL', 755 'GO1' => 'GOtv', 756 'GPL' => 'G-PLUS', 757 '8G' => 'Gplus', 758 'GR' => 'Gradiente', 759 'GRE' => 'Graetz', 760 'GP' => 'Grape', 761 'G6' => 'Gree', 762 'GRA' => 'Great Asia', 763 '3G' => 'Greentel', 764 'GRO' => 'Green Orange', 765 'GRL' => 'Green Lion', 766 'GR1' => 'GroBerwert', 767 'GF' => 'Gretel', 768 '82' => 'Gresso', 769 'GRB' => 'Grünberg', 770 'GU' => 'Grundig', 771 'GV' => 'Gtel', 772 'CUO' => 'Guophone', 773 'CUD' => 'CUD', 774 'GVC' => 'GVC Pro', 775 'H13' => 'H133', 776 '9Z' => 'H96', 777 'HF' => 'Hafury', 778 '9F' => 'HAOVM', 779 'HAQ' => 'HAOQIN', 780 'HA' => 'Haier', 781 'HEC' => 'HEC', 782 'XH' => 'Haipai', 783 'XHU' => 'Haixu', 784 'HAN' => 'Handheld', 785 'HE' => 'HannSpree', 786 'HNS' => 'Hanseatic', 787 'HA2' => 'Hanson', 788 'HK' => 'Hardkernel', 789 'HAR' => 'Harper', 790 'HA1' => 'Hartens', 791 'HS' => 'Hasee', 792 '8H' => 'Hamlet', 793 'HAM' => 'Hammer', 794 'HAT' => 'Hathway', 795 'HAV' => 'HAVIT', 796 'HEM' => 'Hemilton', 797 'H6' => 'Helio', 798 'HQ' => 'HERO', 799 'ZH' => 'Hezire', 800 'HEX' => 'HexaByte', 801 'HEW' => 'HeadWolf', 802 'HEI' => 'Heimat', 803 'HL' => 'Hi-Level', 804 '3H' => 'Hi', 805 'HIB' => 'Hiberg', 806 'HBY' => 'HiBy', 807 'HIH' => 'HiHi', 808 'HIK' => 'HiKing', 809 'H2' => 'Highscreen', 810 'Q1' => 'High Q', 811 'HI1' => 'HIGH1ONE', 812 'HIG' => 'HiGrace', 813 '1H' => 'Hipstreet', 814 'HIR' => 'Hiremco', 815 'HI' => 'Hisense', 816 'HIP' => 'HIPER', 817 'HC' => 'Hitachi', 818 'H8' => 'Hitech', 819 'W3' => 'HiMax', 820 '8X' => 'Hi Nova', 821 'HLL' => 'HLLO', 822 'HKC' => 'HKC', 823 'HMD' => 'HMD', 824 '8W' => 'HKPro', 825 'HOF' => 'HOFER', 826 'HOC' => 'hoco', 827 'H1' => 'Hoffmann', 828 'HOM' => 'Homatics', 829 'H0' => 'Hometech', 830 'HLB' => 'HOLLEBERG', 831 'HM' => 'Homtom', 832 'HM1' => 'HOMII', 833 'HOP' => 'Hopeland', 834 'HZ' => 'Hoozo', 835 'HOR' => 'Horion', 836 'H7' => 'Horizon', 837 '4H' => 'Horizont', 838 'HO' => 'Hosin', 839 'H3' => 'Hotel', 840 'HV' => 'Hotwav', 841 'U8' => 'Hot Pepper', 842 'HOT' => 'HOTACK', 843 'JH' => 'HOTREALS', 844 'HW' => 'How', 845 'WH' => 'Honeywell', 846 'HON' => 'HongTop', 847 'HOG' => 'HONKUAHG', 848 'HP' => 'HP', 849 'HDC' => 'HDC', 850 'HT' => 'HTC', 851 'QZ' => 'Huagan', 852 'HD' => 'Huadoo', 853 'HG' => 'Huavi', 854 'HU' => 'Huawei', 855 'HX' => 'Humax', 856 'HUM' => 'Humanware', 857 'HME' => 'HUMElab', 858 'HR' => 'Hurricane', 859 'H5' => 'Huskee', 860 'HUG' => 'Hugerock', 861 'HY' => 'Hyrican', 862 'HN' => 'Hyundai', 863 '7H' => 'Hyve', 864 'HYT' => 'Hytera', 865 'HYK' => 'Hykker', 866 'HYA' => 'Hyatta', 867 'IKL' => 'I KALL', 868 '3I' => 'i-Cherry', 869 'IJ' => 'i-Joy', 870 'IM' => 'i-mate', 871 'IO' => 'i-mobile', 872 'INN' => 'I-INN', 873 'IPL' => 'I-Plus', 874 'OF' => 'iOutdoor', 875 'IB' => 'iBall', 876 'IY' => 'iBerry', 877 '7I' => 'iBrit', 878 'IBO' => 'ibowin', 879 'I2' => 'IconBIT', 880 'ING' => 'Icone Gold', 881 'IC' => 'iDroid', 882 'IDI' => 'iDino', 883 '6Z' => 'iData', 884 'IDC' => 'IDC', 885 'IG' => 'iGet', 886 'IHL' => 'iHome Life', 887 'IH' => 'iHunt', 888 'IA' => 'Ikea', 889 'IYO' => 'iYou', 890 '8I' => 'IKU Mobile', 891 '2K' => 'IKI Mobile', 892 'IK' => 'iKoMo', 893 '58' => 'iKon', 894 '588' => 'iKonia', 895 'I7' => 'iLA', 896 '2I' => 'iLife', 897 '1I' => 'iMars', 898 'IMI' => 'iMI', 899 'U4' => 'iMan', 900 'ILE' => 'iLepo', 901 'IL' => 'IMO Mobile', 902 'IMA' => 'Imaq', 903 'IM1' => 'Imose', 904 'I3' => 'Impression', 905 'FC' => 'INCAR', 906 '2H' => 'Inch', 907 '6I' => 'Inco', 908 'INK' => 'Inka', 909 'IW' => 'iNew', 910 'IF' => 'Infinix', 911 'INF' => 'Infiniton', 912 'IPR' => 'InfinityPro', 913 'I0' => 'InFocus', 914 'IN1' => 'InFone', 915 'II' => 'Inkti', 916 'MIR' => 'Infomir', 917 '81' => 'InfoKit', 918 'I5' => 'InnJoo', 919 '26' => 'Innos', 920 'IN' => 'Innostream', 921 'I4' => 'Inoi', 922 'INO' => 'iNo Mobile', 923 'IQ' => 'INQ', 924 'QN' => 'iQ&T', 925 'IS' => 'Insignia', 926 'YI' => 'INSYS', 927 'IT' => 'Intek', 928 'INT' => 'Intel', 929 'IX' => 'Intex', 930 'IV' => 'Inverto', 931 '32' => 'Invens', 932 '4I' => 'Invin', 933 'IFT' => 'iFIT', 934 'INA' => 'iNavi', 935 'I1' => 'iOcean', 936 'IMU' => 'iMuz', 937 'IP' => 'iPro', 938 'X9' => 'iPEGTOP', 939 '8Q' => 'IQM', 940 'Q8' => 'IRA', 941 'I6' => 'Irbis', 942 '5I' => 'Iris', 943 'IRE' => 'iReplace', 944 'IR' => 'iRola', 945 'IU' => 'iRulu', 946 'IRO' => 'iRobot', 947 '9I' => 'iSWAG', 948 '9J' => 'iSafe Mobile', 949 'IST' => 'iStar', 950 '86' => 'IT', 951 'IZ' => 'iTel', 952 '0I' => 'iTruck', 953 'I8' => 'iVA', 954 'IE' => 'iView', 955 '0J' => 'iVooMi', 956 'UI' => 'ivvi', 957 'QW' => 'iWaylink', 958 'I9' => 'iZotron', 959 'IXT' => 'iXTech', 960 'IOT' => 'IOTWE', 961 'JA' => 'JAY-Tech', 962 'JAM' => 'Jambo', 963 'KJ' => 'Jiake', 964 'JD' => 'Jedi', 965 'JEE' => 'Jeep', 966 'J6' => 'Jeka', 967 'JF' => 'JFone', 968 'JI' => 'Jiayu', 969 'JG' => 'Jinga', 970 'JIN' => 'Jin Tu', 971 'JX' => 'Jio', 972 'VJ' => 'Jivi', 973 'JK' => 'JKL', 974 'JR1' => 'JREN', 975 'JO' => 'Jolla', 976 'JP' => 'Joy', 977 'JOY' => 'JoySurf', 978 'UJ' => 'Juniper Systems', 979 'J5' => 'Just5', 980 'JUS' => 'JUSYEA', 981 '7J' => 'Jumper', 982 'JPA' => 'JPay', 983 'JV' => 'JVC', 984 'JXD' => 'JXD', 985 'JS' => 'Jesy', 986 'KT' => 'K-Touch', 987 'KLT' => 'K-Lite', 988 'K4' => 'Kaan', 989 'K7' => 'Kaiomy', 990 'KL' => 'Kalley', 991 'K6' => 'Kanji', 992 'KA' => 'Karbonn', 993 'K5' => 'KATV1', 994 'KAP' => 'Kapsys', 995 'K0' => 'Kata', 996 'KZ' => 'Kazam', 997 '9K' => 'Kazuna', 998 'KD' => 'KDDI', 999 'KHA' => 'Khadas', 1000 'KS' => 'Kempler & Strauss', 1001 'K3' => 'Keneksi', 1002 'KHI' => 'KENSHI', 1003 'KNW' => 'KENWOOD', 1004 'KX' => 'Kenxinda', 1005 'KEN' => 'Kenbo', 1006 'KND' => 'Kendo', 1007 'KZG' => 'KZG', 1008 'K1' => 'Kiano', 1009 'KID' => 'kidiby', 1010 '5W' => 'Kingbox', 1011 'KI' => 'Kingsun', 1012 'KIS' => 'Kinstone', 1013 'KF' => 'KINGZONE', 1014 'KIN' => 'Kingstar', 1015 '46' => 'Kiowa', 1016 'KV' => 'Kivi', 1017 '64' => 'Kvant', 1018 'KVA' => 'KVADRA', 1019 '0K' => 'Klipad', 1020 'KNM' => 'KN Mobile', 1021 'KC' => 'Kocaso', 1022 'KK' => 'Kodak', 1023 'KG' => 'Kogan', 1024 'KGT' => 'KGTEL', 1025 'KM' => 'Komu', 1026 'KMC' => 'KMC', 1027 'KO' => 'Konka', 1028 'KW' => 'Konrow', 1029 'KB' => 'Koobee', 1030 '7K' => 'Koolnee', 1031 'K9' => 'Kooper', 1032 'KP' => 'KOPO', 1033 'KR' => 'Koridy', 1034 'XK' => 'Koslam', 1035 'K2' => 'KRONO', 1036 'KRX' => 'Korax', 1037 'KE' => 'Krüger&Matz', 1038 '5K' => 'KREZ', 1039 'WK' => 'KRIP', 1040 'KRA' => 'Kraft', 1041 'KH' => 'KT-Tech', 1042 'KTC' => 'KTC', 1043 'Z6' => 'KUBO', 1044 'KUG' => 'KuGou', 1045 'K8' => 'Kuliao', 1046 '8K' => 'Kult', 1047 'KU' => 'Kumai', 1048 '6K' => 'Kurio', 1049 'KYD' => 'Kydos', 1050 'KY' => 'Kyocera', 1051 'KQ' => 'Kyowon', 1052 '1K' => 'Kzen', 1053 'LQ' => 'LAIQ', 1054 'L6' => 'Land Rover', 1055 'L2' => 'Landvo', 1056 'LA' => 'Lanix', 1057 'LA1' => 'Lanin', 1058 'LK' => 'Lark', 1059 'Z3' => 'Laurus', 1060 'LEC' => 'Lectrus', 1061 'LAS' => 'Laser', 1062 'LV' => 'Lava', 1063 'LVI' => 'Lville', 1064 'LC' => 'LCT', 1065 'L5' => 'Leagoo', 1066 'U3' => 'Leben', 1067 'LEB' => 'LeBest', 1068 'LD' => 'Ledstar', 1069 'LEE' => 'Leelbox', 1070 'L1' => 'LeEco', 1071 '4B' => 'Leff', 1072 'LEG' => 'Legend', 1073 'L4' => 'Lemhoov', 1074 'W9' => 'LEMFO', 1075 'LEM' => 'Lemco', 1076 'LN' => 'Lenco', 1077 'LE' => 'Lenovo', 1078 'LT' => 'Leotec', 1079 'LP' => 'Le Pan', 1080 'ZJ' => 'Leke', 1081 'L7' => 'Lephone', 1082 'LZ' => 'Lesia', 1083 'L3' => 'Lexand', 1084 'LX' => 'Lexibook', 1085 'LG' => 'LG', 1086 '39' => 'Liberton', 1087 '5L' => 'Linsar', 1088 'LIN' => 'Linsay', 1089 'LF' => 'Lifemaxx', 1090 'LI' => 'Lingwin', 1091 'LIB' => 'Lingbo', 1092 'LIM' => 'Lime', 1093 'LJ' => 'L-Max', 1094 'LW' => 'Linnex', 1095 'JJ' => 'Listo', 1096 'LNM' => 'LNMBBS', 1097 'LO' => 'Loewe', 1098 'LNG' => 'LongTV', 1099 'YL' => 'Loview', 1100 'LOV' => 'Lovme', 1101 'LGN' => 'LOGAN', 1102 '1L' => 'Logic', 1103 'LH' => 'Logic Instrument', 1104 'LM' => 'Logicom', 1105 'LOG' => 'Logik', 1106 'LGT' => 'Logitech', 1107 'GY' => 'LOKMAT', 1108 'LPX' => 'LPX-G', 1109 '0L' => 'Lumigon', 1110 'LU' => 'Lumus', 1111 'LUM' => 'Lumitel', 1112 'L9' => 'Luna', 1113 'LNN' => 'LUNNEN', 1114 'LUO' => 'LUO', 1115 'LR' => 'Luxor', 1116 'LY' => 'LYF', 1117 'LL' => 'Leader Phone', 1118 'LTL' => 'LYOTECH LABS', 1119 'QL' => 'LT Mobile', 1120 'LW1' => 'LW', 1121 'MQ' => 'M.T.T.', 1122 'MN' => 'M4tel', 1123 'XM' => 'Macoox', 1124 '92' => 'MAC AUDIO', 1125 'MJ' => 'Majestic', 1126 'FQ' => 'Mafe', 1127 'MAG' => 'MAG', 1128 'MA2' => 'MAGCH', 1129 '6Y' => 'Magicsee', 1130 'MA4' => 'Magenta', 1131 '23' => 'Magnus', 1132 'NH' => 'Manhattan', 1133 'MAN' => 'Mango', 1134 '5M' => 'Mann', 1135 'MA' => 'Manta Multimedia', 1136 'Z0' => 'Mantra', 1137 'J4' => 'Mara', 1138 'MAR' => 'Marshal', 1139 '8Y' => 'Massgo', 1140 'MA1' => 'Mascom', 1141 '2M' => 'Masstel', 1142 '3X' => 'Mastertech', 1143 'MAS' => 'Master-G', 1144 '50' => 'Matrix', 1145 'MAT' => 'Matco Tools', 1146 '7M' => 'Maxcom', 1147 '7M1' => 'Maxfone', 1148 'ZM' => 'Maximus', 1149 '6X' => 'Maxtron', 1150 '0D' => 'MAXVI', 1151 'MAX' => 'Maxwell', 1152 'XZ' => 'MAXX', 1153 'MW' => 'Maxwest', 1154 'M0' => 'Maze', 1155 'YM' => 'Maze Speed', 1156 '87' => 'Malata', 1157 'MAU' => 'Maunfeld', 1158 'MCL' => 'McLaut', 1159 '28' => 'MBOX', 1160 'FK' => 'MBI', 1161 'MBK' => 'MBK', 1162 '3D' => 'MDC Store', 1163 '1Y' => 'MDTV', 1164 '09' => 'meanIT', 1165 'M3' => 'Mecer', 1166 'M3M' => 'M3 Mobile', 1167 '0M' => 'Mecool', 1168 'MEC' => 'MECHEN', 1169 'MEM' => 'MeMobile', 1170 'MC' => 'Mediacom', 1171 'MD' => 'Medion', 1172 'M2' => 'MEEG', 1173 'MEG' => 'MEGA VISION', 1174 'MCA' => 'Megacable', 1175 'MP' => 'MegaFon', 1176 'MGX' => 'MEGAMAX', 1177 'X0' => 'mPhone', 1178 '3M' => 'Meitu', 1179 'M1' => 'Meizu', 1180 '0E' => 'Melrose', 1181 'MU' => 'Memup', 1182 'ME' => 'Metz', 1183 'MEO' => 'MEO', 1184 'MX' => 'MEU', 1185 'MES' => 'MESWAO', 1186 'MI' => 'MicroMax', 1187 'MIP' => 'mipo', 1188 'MS' => 'Microsoft', 1189 '6Q' => 'Microtech', 1190 'MIG' => 'Mightier', 1191 '1X' => 'Minix', 1192 'OM' => 'Mintt', 1193 'MIN' => 'Mint', 1194 'MO' => 'Mio', 1195 'MOD' => 'Moondrop', 1196 'MOR' => 'MORTAL', 1197 'X7' => 'Mione', 1198 'M7' => 'Miray', 1199 'MIT' => 'Mitchell & Brown', 1200 '8M' => 'Mito', 1201 'MT' => 'Mitsubishi', 1202 '0Y' => 'Mitsui', 1203 'M5' => 'MIXC', 1204 '2D' => 'MIVO', 1205 '1Z' => 'MiXzo', 1206 'MIW' => 'MIWANG', 1207 'ML' => 'MLLED', 1208 'LS' => 'MLS', 1209 'MLA' => 'MLAB', 1210 '5H' => 'MMI', 1211 '4M' => 'Mobicel', 1212 'M6' => 'Mobiistar', 1213 'MOK' => 'Mobile Kingdom', 1214 'MH' => 'Mobiola', 1215 'MB' => 'Mobistel', 1216 'ID' => 'MobiIoT', 1217 '6W' => 'MobiWire', 1218 '9M' => 'Mobo', 1219 'MOB' => 'Mobell', 1220 'MVO' => 'Mobvoi', 1221 'M4' => 'Modecom', 1222 'MEP' => 'Mode Mobile', 1223 'MF' => 'Mofut', 1224 'MR' => 'Motorola', 1225 'MTS' => 'Motorola Solutions', 1226 'MIV' => 'Motiv', 1227 'MV' => 'Movic', 1228 'MOV' => 'Movitel', 1229 'MO1' => 'MOVISUN', 1230 'MOS' => 'Mosimosi', 1231 'MOX' => 'Moxee', 1232 'MM' => 'Mpman', 1233 'MZ' => 'MSI', 1234 '3R' => 'MStar', 1235 'M9' => 'MTC', 1236 'N4' => 'MTN', 1237 '72' => 'M-Tech', 1238 '9H' => 'M-Horse', 1239 'MKP' => 'M-KOPA', 1240 'MLB' => 'multibox', 1241 '1R' => 'Multilaser', 1242 'MPS' => 'MultiPOS', 1243 'MLT' => 'MULTYNET', 1244 '1M' => 'MYFON', 1245 'MY1' => 'myPhone (PL)', 1246 'MY' => 'MyPhone (PH)', 1247 '51' => 'Myros', 1248 'M8' => 'Myria', 1249 '6M' => 'Mystery', 1250 '3T' => 'MyTab', 1251 'MG' => 'MyWigo', 1252 'J3' => 'Mymaga', 1253 'MYM' => 'MyMobile', 1254 '07' => 'MyGica', 1255 'MYG' => 'MygPad', 1256 'MWA' => 'MwalimuPlus', 1257 'NEO' => 'neoCore', 1258 'NER' => 'Neoregent', 1259 '08' => 'Nabi', 1260 'N7' => 'National', 1261 'NC' => 'Navcity', 1262 '6N' => 'Navitech', 1263 '7V' => 'Navitel', 1264 'N3' => 'Navon', 1265 '7R' => 'NavRoad', 1266 'NAB' => 'NABO', 1267 'NAS' => 'NASCO', 1268 'NP' => 'Naomi Phone', 1269 'NAN' => 'Nanho', 1270 'NE' => 'NEC', 1271 'NDP' => 'Nedaphone', 1272 '8N' => 'Necnot', 1273 'NF' => 'Neffos', 1274 '9X' => 'Neo', 1275 'NEK' => 'NEKO', 1276 '1N' => 'Neomi', 1277 '7Q' => 'Neon IQ', 1278 '8F' => 'Neolix', 1279 'NES' => 'Nesons', 1280 'NET' => 'NetBox', 1281 'NWT' => 'NETWIT', 1282 'NA' => 'Netgear', 1283 'NEM' => 'Netmak', 1284 'NU' => 'NeuImage', 1285 'NEU' => 'NeuTab', 1286 'NEV' => 'NEVIR', 1287 'NW' => 'Newgen', 1288 'N9' => 'Newland', 1289 '0N' => 'Newman', 1290 'NS' => 'NewsMy', 1291 'ND' => 'Newsday', 1292 'HB' => 'New Balance', 1293 'BRI' => 'New Bridge', 1294 'NEW' => 'Newal', 1295 'XB' => 'NEXBOX', 1296 'NX' => 'Nexian', 1297 '7X' => 'Nexa', 1298 '7XR' => 'Nexar', 1299 'N8' => 'NEXON', 1300 'N2' => 'Nextbit', 1301 'NT' => 'NextBook', 1302 'NTT' => 'NTT West', 1303 '4N' => 'NextTab', 1304 'NEX' => 'NEXT', 1305 'NST' => 'Next & NextStar', 1306 'NJO' => 'nJoy', 1307 'NG' => 'NGM', 1308 'NZ' => 'NG Optics', 1309 'NZP' => 'NGpon', 1310 'NN' => 'Nikon', 1311 'NIL' => 'NILAIT', 1312 'NI' => 'Nintendo', 1313 'NIN' => 'NINETEC', 1314 'NI1' => 'NINETOLOGY', 1315 'N5' => 'NOA', 1316 'N1' => 'Noain', 1317 'N6' => 'Nobby', 1318 'NOC' => 'Novacom', 1319 'NOS' => 'NoviSea', 1320 'NO2' => 'NOVIS', 1321 'NOV' => 'Novey', 1322 'NO1' => 'NOVO', 1323 '57' => 'Nubia', 1324 'JN' => 'NOBUX', 1325 'NB' => 'Noblex', 1326 'OG' => 'NOGA', 1327 'NK' => 'Nokia', 1328 'NM' => 'Nomi', 1329 '2N' => 'Nomu', 1330 '6H' => 'Noontec', 1331 'NR' => 'Nordmende', 1332 'NRD' => 'Nordfrost', 1333 'NOR' => 'NORMANDE', 1334 '7N' => 'NorthTech', 1335 'NOT' => 'Nothing', 1336 '5N' => 'Nos', 1337 'NO' => 'Nous', 1338 'NQ' => 'Novex', 1339 'NOD' => 'noDROPOUT', 1340 'NJ' => 'NuAns', 1341 'NL' => 'NUU Mobile', 1342 'N0' => 'Nuvo', 1343 'NUV' => 'NuVision', 1344 'NV' => 'Nvidia', 1345 'NY' => 'NYX Mobile', 1346 'NON' => 'N-one', 1347 'O3' => 'O+', 1348 'OT' => 'O2', 1349 'O7' => 'Oale', 1350 'OC' => 'OASYS', 1351 'OB' => 'Obi', 1352 'OBR' => 'Ober', 1353 'OQ' => 'Meta', 1354 'O1' => 'Odys', 1355 'ODP' => 'Odotpad', 1356 'O9' => 'ok.', 1357 'OKA' => 'Okapi', 1358 'OA' => 'Okapia', 1359 'OKI' => 'Oking', 1360 'OLA' => 'Olax', 1361 'OLK' => 'Olkya', 1362 'OLY' => 'Olympia', 1363 'OCE' => 'OCEANIC', 1364 'OLT' => 'OLTO', 1365 'OJ' => 'Ookee', 1366 'OD' => 'Onda', 1367 'ON' => 'OnePlus', 1368 'ONC' => 'OneClick', 1369 'ONL' => 'OneLern', 1370 'OAN' => 'Oangcc', 1371 'OX' => 'Onix', 1372 'OIN' => 'Onida', 1373 '3O' => 'ONYX BOOX', 1374 'O4' => 'ONN', 1375 '9Q' => 'Onkyo', 1376 'ONV' => 'ONVO', 1377 'OOR' => 'Ooredoo', 1378 '2O' => 'OpelMobile', 1379 'OH' => 'Openbox', 1380 '7Y' => 'Obabox', 1381 'OP' => 'OPPO', 1382 'OO' => 'Opsson', 1383 'OPT' => 'Optoma', 1384 'OPH' => 'Ophone', 1385 'OR' => 'Orange', 1386 'ORP' => 'Orange Pi', 1387 'ORA' => 'Orava', 1388 'O5' => 'Orbic', 1389 'Y6' => 'Orbita', 1390 'ORB' => 'Orbsmart', 1391 'OS' => 'Ordissimo', 1392 '8O' => 'Orion', 1393 'OTT' => 'OTTO', 1394 'OK' => 'Ouki', 1395 '0O' => 'OINOM', 1396 'OIL' => 'Oilsky', 1397 'QK' => 'OKWU', 1398 'QQ' => 'OMIX', 1399 '56' => 'OKSI', 1400 'OE' => 'Oukitel', 1401 'OU' => 'OUYA', 1402 'JB' => 'OUJIA', 1403 'OV' => 'Overmax', 1404 '30' => 'Ovvi', 1405 'O2' => 'Owwo', 1406 'OSC' => 'OSCAL', 1407 'OXT' => 'OX TAB', 1408 'OY' => 'Oysters', 1409 'QF' => 'OYSIN', 1410 'O6' => 'Oyyu', 1411 'OZ' => 'OzoneHD', 1412 'OLL' => 'Ollee', 1413 '7P' => 'P-UP', 1414 'PRA' => 'Pacific Research Alliance', 1415 'PAG' => 'PAGRAER', 1416 'PAD' => 'Padpro', 1417 'YP' => 'Paladin', 1418 'PM' => 'Palm', 1419 'PN' => 'Panacom', 1420 'PA' => 'Panasonic', 1421 'PNV' => 'Panavox', 1422 'PT' => 'Pantech', 1423 'PAN' => 'Pano', 1424 'PND' => 'Panodic', 1425 'PA1' => 'Panoramic', 1426 'PLT' => 'Platoon', 1427 'PLD' => 'PLDT', 1428 '94' => 'Packard Bell', 1429 'H9' => 'Parrot Mobile', 1430 'PAR' => 'Partner Mobile', 1431 'PAP' => 'PAPYRE', 1432 'PB' => 'PCBOX', 1433 'PCS' => 'PC Smart', 1434 'PC' => 'PCD', 1435 'PD' => 'PCD Argentina', 1436 'PE' => 'PEAQ', 1437 'PEN' => 'Penta', 1438 'PG' => 'Pentagram', 1439 'PQ' => 'Pendoo', 1440 '93' => 'Perfeo', 1441 '8J' => 'Pelitt', 1442 '1P' => 'Phicomm', 1443 '4P' => 'Philco', 1444 'PH' => 'Philips', 1445 '5P' => 'Phonemax', 1446 'PO' => 'phoneOne', 1447 'PI' => 'Pioneer', 1448 'PIC' => 'Pioneer Computers', 1449 'PJ' => 'PiPO', 1450 '8P' => 'Pixelphone', 1451 '9O' => 'Pixela', 1452 'PX' => 'Pixus', 1453 'PIX' => 'PIXPRO', 1454 'QP' => 'Pico', 1455 'PIR' => 'PIRANHA', 1456 'PIN' => 'PINE', 1457 '9P' => 'Planet Computers', 1458 'PLA' => 'Play Now', 1459 'PY' => 'Ployer', 1460 'P4' => 'Plum', 1461 'PLU' => 'PlusStyle', 1462 '22' => 'Pluzz', 1463 'P8' => 'PocketBook', 1464 '0P' => 'POCO', 1465 'FH' => 'Point Mobile', 1466 'PV' => 'Point of View', 1467 'PVB' => 'PVBox', 1468 'PL' => 'Polaroid', 1469 'Q6' => 'Polar', 1470 '97' => 'PolarLine', 1471 'PP' => 'PolyPad', 1472 'P5' => 'Polytron', 1473 'P2' => 'Pomp', 1474 'P0' => 'Poppox', 1475 '0X' => 'POPTEL', 1476 'PS' => 'Positivo', 1477 '3P' => 'Positivo BGH', 1478 '3F' => 'Porsche', 1479 'PRT' => 'Portfolio', 1480 'PPD' => 'PPDS', 1481 'P3' => 'PPTV', 1482 'FP' => 'Premio', 1483 'PR1' => 'Premier', 1484 'PR' => 'Prestigio', 1485 'P9' => 'Primepad', 1486 'PRM' => 'PRIME', 1487 '6P' => 'Primux', 1488 '2P' => 'Prixton', 1489 'PRI' => 'Pritom', 1490 'PRP' => 'PRISM+', 1491 'PF' => 'PROFiLO', 1492 'P6' => 'Proline', 1493 '5O' => 'Prology', 1494 'P1' => 'ProScan', 1495 'PRO' => 'PROSONIC', 1496 'P7' => 'Protruly', 1497 'R0' => 'ProVision', 1498 '7O' => 'Polestar', 1499 'PU' => 'PULID', 1500 'UP' => 'Purism', 1501 'PUN' => 'Punos', 1502 'QFX' => 'QFX', 1503 'Q7' => 'Q-Box', 1504 'QH' => 'Q-Touch', 1505 'QB' => 'Q.Bell', 1506 'QI' => 'Qilive', 1507 'QIN' => 'QIN', 1508 'QIW' => 'Qiuwoky', 1509 'QM' => 'QMobile', 1510 'QT' => 'Qtek', 1511 'Q9' => 'QTECH', 1512 'QA' => 'Quantum', 1513 'QUE' => 'Quest', 1514 'QUA' => 'Quatro', 1515 'QU' => 'Quechua', 1516 'QUI' => 'Quipus', 1517 'QO' => 'Qumo', 1518 'UQ' => 'Qubo', 1519 'QUP' => 'Qupi', 1520 'YQ' => 'QLink', 1521 'QY' => 'Qnet Mobile', 1522 'WJ' => 'Qware', 1523 'QWT' => 'QWATT', 1524 'R2' => 'R-TV', 1525 'R3D' => 'R3Di', 1526 'RA' => 'Ramos', 1527 '0R' => 'Raspberry', 1528 'R9' => 'Ravoz', 1529 'RZ' => 'Razer', 1530 'RAZ' => 'RAZZ', 1531 '95' => 'Rakuten', 1532 'RAY' => 'Raylandz', 1533 'RC' => 'RCA Tablets', 1534 'RCT' => 'RCT', 1535 '2R' => 'Reach', 1536 'RLX' => 'Realix', 1537 'REL' => 'RelNAT', 1538 'RE4' => 'Relndoo', 1539 'RB' => 'Readboy', 1540 'RE' => 'Realme', 1541 'RE1' => 'Redbean', 1542 'R8' => 'RED', 1543 'RDX' => 'RED-X', 1544 'REW' => 'Redway', 1545 '6F' => 'Redfox', 1546 'RE2' => 'RedLine', 1547 'RD' => 'Reeder', 1548 'Z9' => 'REGAL', 1549 'RH' => 'Remdun', 1550 'RP' => 'Revo', 1551 'REV' => 'Revomovil', 1552 '8R' => 'Retroid Pocket', 1553 'REN' => 'Renova', 1554 'RE3' => 'RENSO', 1555 'REP' => 'rephone', 1556 'RHI' => 'Rhino', 1557 'RIC' => 'Ricoh', 1558 'RI' => 'Rikomagic', 1559 'RM' => 'RIM', 1560 'RN' => 'Rinno', 1561 'RNB' => 'Ringing Bells', 1562 'RX' => 'Ritmix', 1563 'R7' => 'Ritzviva', 1564 'RV' => 'Riviera', 1565 '6R' => 'Rivo', 1566 'RIZ' => 'Rizzen', 1567 'RR' => 'Roadrover', 1568 'QR' => 'ROADMAX', 1569 'ROH' => 'ROCH', 1570 'ROC' => 'Roam Cat', 1571 'ROT' => 'Rocket', 1572 'R1' => 'Rokit', 1573 'ROI' => 'ROiK', 1574 'RK' => 'Roku', 1575 'R3' => 'Rombica', 1576 'RUA' => 'Romsat', 1577 'R5' => 'Ross&Moor', 1578 'RO' => 'Rover', 1579 'R6' => 'RoverPad', 1580 'RQ' => 'RoyQueen', 1581 'RJ' => 'Royole', 1582 'RT' => 'RT Project', 1583 'RTK' => 'RTK', 1584 'RG' => 'RugGear', 1585 'RUG' => 'Ruggex', 1586 'RUT' => 'RuggeTech', 1587 'RU' => 'Runbo', 1588 'RUP' => 'Rupa', 1589 'RL' => 'Ruio', 1590 'RY' => 'Ryte', 1591 'X5' => 'Saba', 1592 '8L' => 'S-TELL', 1593 '8L1' => 'S-Color', 1594 '4O' => 'S2Tel', 1595 '89' => 'Seatel', 1596 'SEW' => 'Sewoo', 1597 'SE1' => 'SEEWO', 1598 'SEN' => 'SENNA', 1599 'SER' => 'SERVO', 1600 'Y7' => 'Saiet', 1601 'SLF' => 'SAILF', 1602 'X1' => 'Safaricom', 1603 'SG' => 'Sagem', 1604 'SAG' => 'Sagemcom', 1605 '4L' => 'Salora', 1606 'SA' => 'Samsung', 1607 'SAT' => 'Samtech', 1608 'SAM' => 'Samtron', 1609 'SAB' => 'Sambox', 1610 'SNA' => 'SNAMI', 1611 'S0' => 'Sanei', 1612 '12' => 'Sansui', 1613 'SAK' => 'Sankey', 1614 'SQ' => 'Santin', 1615 'SY' => 'Sanyo', 1616 'SAN' => 'SANY', 1617 'S9' => 'Savio', 1618 'Y4' => 'TCL SCBC', 1619 'SCH' => 'SCHAUB LORENZ', 1620 'CZ' => 'Schneider', 1621 'SHO' => 'SCHONTECH', 1622 'SCO' => 'Scosmos', 1623 'SC1' => 'Scoole', 1624 'ZG' => 'Schok', 1625 'G8' => 'SEG', 1626 'SEX' => 'SEHMAX', 1627 'SD' => 'Sega', 1628 '0U' => 'Selecline', 1629 '9G' => 'Selenga', 1630 'SV' => 'Selevision', 1631 'SL' => 'Selfix', 1632 '0S' => 'SEMP TCL', 1633 'S1' => 'Sencor', 1634 'SNM' => 'Sencrom', 1635 'SN' => 'Sendo', 1636 '01' => 'Senkatel', 1637 'S6' => 'Senseit', 1638 'EW' => 'Senwa', 1639 '24' => 'Seeken', 1640 'SEB' => 'SEBBE', 1641 '61' => 'Seuic', 1642 'SX' => 'SFR', 1643 'SGI' => 'SGIN', 1644 'SH' => 'Sharp', 1645 'JU' => 'Shanling', 1646 '7S' => 'Shift Phones', 1647 '78' => 'Shivaki', 1648 'RS' => 'Shtrikh-M', 1649 '3S' => 'Shuttle', 1650 '13' => 'Sico', 1651 'SI' => 'Siemens', 1652 '1S' => 'Sigma', 1653 '70' => 'Silelis', 1654 'SJ' => 'Silent Circle', 1655 'SIL' => 'Silva Schneider', 1656 '10' => 'Simbans', 1657 '98' => 'Simply', 1658 'SIM' => 'simfer', 1659 '52' => 'Singtech', 1660 'SIN' => 'SINGER', 1661 '31' => 'Siragon', 1662 'SIS' => 'Siswoo', 1663 '83' => 'Sirin Labs', 1664 '5Z' => 'SK Broadband', 1665 'GK' => 'SKG', 1666 'SW' => 'Sky', 1667 'SK' => 'Skyworth', 1668 'SKY' => 'Skyline', 1669 'SK1' => 'SkyStream', 1670 'SKT' => 'Skytech', 1671 'SKK' => 'SKK Mobile', 1672 '14' => 'Smadl', 1673 '19' => 'Smailo', 1674 'SR' => 'Smart Electronic', 1675 'SMA' => 'Smart Kassel', 1676 'STE' => 'Smart Tech', 1677 '49' => 'Smart', 1678 '47' => 'SmartBook', 1679 '3B' => 'Smartab', 1680 '80' => 'SMARTEC', 1681 'SM1' => 'Smartex', 1682 'SC' => 'Smartfren', 1683 'S7' => 'Smartisan', 1684 'SMU' => 'SMUX', 1685 'SMT' => 'SMT Telecom', 1686 'JR' => 'Sylvania', 1687 'SYH' => 'SYH', 1688 '3Y' => 'Smarty', 1689 'HH' => 'Smooth Mobile', 1690 '1Q' => 'Smotreshka', 1691 'SF' => 'Softbank', 1692 '9L' => 'SOLE', 1693 'JL' => 'SOLO', 1694 'SOS' => 'SOSH', 1695 'SOD' => 'Soda', 1696 'SOL' => 'Solas', 1697 '16' => 'Solone', 1698 'OI' => 'Sonim', 1699 'SVE' => 'Sveon', 1700 'SO' => 'Sony', 1701 'SE' => 'Sony Ericsson', 1702 'X2' => 'Soundmax', 1703 'SUL' => 'SoulLink', 1704 '8S' => 'Soyes', 1705 '77' => 'SONOS', 1706 '68' => 'Soho Style', 1707 'SOB' => 'SobieTech', 1708 'SOW' => 'SOWLY', 1709 'PK' => 'Spark', 1710 'SPX' => 'Sparx', 1711 'FS' => 'SPC', 1712 '6S' => 'Spectrum', 1713 '43' => 'Spectralink', 1714 'SP' => 'Spice', 1715 'SPD' => 'Spider', 1716 '84' => 'Sprint', 1717 'SPU' => 'SPURT', 1718 'QS' => 'SQOOL', 1719 'S4' => 'Star', 1720 'OL' => 'Starlight', 1721 'STA' => 'Star-Light', 1722 '18' => 'Starmobile', 1723 '2S' => 'Starway', 1724 '45' => 'Starwind', 1725 'SB' => 'STF Mobile', 1726 'S8' => 'STK', 1727 'GQ' => 'STG Telecom', 1728 'S2' => 'Stonex', 1729 'ST' => 'Storex', 1730 'STR' => 'Stream', 1731 '71' => 'StrawBerry', 1732 '96' => 'STRONG', 1733 '69' => 'Stylo', 1734 'STI' => 'Stilevs', 1735 '9S' => 'Sugar', 1736 'SUR' => 'Surge', 1737 'SUF' => 'Surfans', 1738 '06' => 'Subor', 1739 'SUT' => 'SULPICE TV', 1740 'SZ' => 'Sumvision', 1741 '0H' => 'Sunstech', 1742 'S3' => 'SunVan', 1743 '5S' => 'Sunvell', 1744 '5Y' => 'Sunny', 1745 'W8' => 'SUNWIND', 1746 'SBX' => 'SuperBOX', 1747 'SBM' => 'Supermax', 1748 'SBR' => 'Sber', 1749 'SGE' => 'Super General', 1750 'SU' => 'SuperSonic', 1751 '79' => 'SuperTab', 1752 'STV' => 'SuperTV', 1753 'S5' => 'Supra', 1754 'SUP' => 'Supraim', 1755 'ZS' => 'Suzuki', 1756 '2J' => 'Sunmi', 1757 'SUN' => 'Sunmax', 1758 '0W' => 'Swipe', 1759 'SWI' => 'Switel', 1760 'SS' => 'SWISSMOBILITY', 1761 '1W' => 'Swisstone', 1762 'SWO' => 'SWOFY', 1763 'SSK' => 'SSKY', 1764 'SYC' => 'Syco', 1765 'SM' => 'Symphony', 1766 '4S' => 'Syrox', 1767 'SYS' => 'System76', 1768 'TM' => 'T-Mobile', 1769 'T96' => 'T96', 1770 'TAD' => 'TADAAM', 1771 'TK' => 'Takara', 1772 '73' => 'Tambo', 1773 '9N' => 'Tanix', 1774 'U5' => 'Taiga System', 1775 'TAL' => 'Talius', 1776 '7G' => 'TAG Tech', 1777 'TLB' => 'TALBERG', 1778 'TAU' => 'TAUBE', 1779 'T5' => 'TB Touch', 1780 'TC' => 'TCL', 1781 'T0' => 'TD Systems', 1782 'YY' => 'TD Tech', 1783 'H4' => 'Technicolor', 1784 'TEA' => 'TeachTouch', 1785 'Z5' => 'Technika', 1786 'TE1' => 'TechSmart', 1787 'TX' => 'TechniSat', 1788 'TT' => 'TechnoTrend', 1789 'TTS' => 'TECHNOSAT', 1790 'TM1' => 'Temigereev', 1791 'TP' => 'TechPad', 1792 'TPS' => 'TPS', 1793 '9E' => 'Techwood', 1794 '7F' => 'Technopc', 1795 'TCH' => 'Techstorm', 1796 'T7' => 'Teclast', 1797 'TB' => 'Tecno Mobile', 1798 'TEC' => 'TecToy', 1799 '91' => 'TEENO', 1800 'TLK' => 'Telkom', 1801 '2L' => 'Tele2', 1802 'TL' => 'Telefunken', 1803 'TG' => 'Telego', 1804 'T2' => 'Telenor', 1805 'TE' => 'Telit', 1806 '65' => 'Telia', 1807 'TLY' => 'Telly', 1808 'TEL' => 'Telma', 1809 'PW' => 'Telpo', 1810 'TLS' => 'TeloSystems', 1811 'TER' => 'Teracube', 1812 'TD' => 'Tesco', 1813 'TA' => 'Tesla', 1814 '9T' => 'Tetratab', 1815 'TET' => 'TETC', 1816 'TZ' => 'teXet', 1817 '29' => 'Teknosa', 1818 'JZ' => 'TJC', 1819 'TJD' => 'TJD', 1820 'JC' => 'TENPLUS', 1821 'T4' => 'ThL', 1822 'TN' => 'Thomson', 1823 'O0' => 'Thuraya', 1824 'TI' => 'TIANYU', 1825 'JY' => 'Tigers', 1826 '8T' => 'Time2', 1827 'TQ' => 'Timovi', 1828 'TIM' => 'TIMvision', 1829 '2T' => 'Tinai', 1830 'TF' => 'Tinmo', 1831 'TH' => 'TiPhone', 1832 'YV' => 'TiVo', 1833 'TIV' => 'Tivax', 1834 'TIB' => 'Tibuta', 1835 'Y3' => 'TOKYO', 1836 'TOX' => 'TOX', 1837 'T1' => 'Tolino', 1838 '0T' => 'Tone', 1839 'TY' => 'Tooky', 1840 'TYD' => 'TYD', 1841 'TOO' => 'TOOGO', 1842 'TPT' => 'Top-Tech', 1843 'T9' => 'Top House', 1844 'DK' => 'Topelotek', 1845 '42' => 'Topway', 1846 'TO' => 'Toplux', 1847 'TOD' => 'TOPDON', 1848 'TOP' => 'TopDevice', 1849 'TO2' => 'TOPSHOWS', 1850 '7T' => 'Torex', 1851 'TOR' => 'Torque', 1852 'TRN' => 'TORNADO', 1853 '6O' => 'TOSCIDO', 1854 'TO1' => 'Topsion', 1855 'TS' => 'Toshiba', 1856 'T8' => 'Touchmate', 1857 'TOU' => 'Touch Plus', 1858 '5R' => 'Transpeed', 1859 'T6' => 'TrekStor', 1860 'TRP' => 'Trecfone', 1861 'T3' => 'Trevi', 1862 'TRI' => 'TriaPlay', 1863 'TJ' => 'Trifone', 1864 'Q5' => 'Trident', 1865 'TRB' => 'Trimble', 1866 '4T' => 'Tronsmart', 1867 '11' => 'True', 1868 'JT' => 'True Slim', 1869 'J1' => 'Trio', 1870 'TRC' => 'Tricolor', 1871 'THT' => 'Tsinghua Tongfang', 1872 '5C' => 'TTEC', 1873 'TTF' => 'TTfone', 1874 'TTK' => 'TTK-TV', 1875 'TU' => 'Tunisie Telecom', 1876 '1T' => 'Turbo', 1877 'TR' => 'Turbo-X', 1878 '5X' => 'TurboPad', 1879 '5T' => 'TurboKids', 1880 'UR' => 'Turkcell', 1881 '4U' => 'TuCEL', 1882 'TUV' => 'Tuvio', 1883 'TUC' => 'TUCSON', 1884 '2U' => 'Türk Telekom', 1885 'TV' => 'TVC', 1886 'TVP' => 'TV+', 1887 'TW' => 'TWM', 1888 'Z1' => 'TWZ', 1889 '6T' => 'Twoe', 1890 'TWN' => 'TwinMOS', 1891 '15' => 'Tymes', 1892 'UC' => 'U.S. Cellular', 1893 'UD1' => 'UD', 1894 'UGI' => 'UGINE', 1895 'UG' => 'Ugoos', 1896 'U1' => 'Uhans', 1897 'UH' => 'Uhappy', 1898 'UL' => 'Ulefone', 1899 'UA' => 'Umax', 1900 'UM' => 'UMIDIGI', 1901 'UM2' => 'Umiio', 1902 'UNT' => 'Unitech', 1903 'UZ' => 'Unihertz', 1904 '3Z' => 'UZ Mobile', 1905 'UX' => 'Unimax', 1906 'UNQ' => 'Uniqcell', 1907 'US' => 'Uniscope', 1908 'UNI' => 'Unistrong', 1909 'U2' => 'UNIWA', 1910 'UND' => 'Uniden', 1911 'UNE' => 'UNITED', 1912 'UGR' => 'United Group', 1913 'UO' => 'Unnecto', 1914 'UNN' => 'Unnion Technologies', 1915 'UNP' => 'UnoPhone', 1916 'UU' => 'Unonu', 1917 'UN' => 'Unowhy', 1918 'UY' => 'UNNO', 1919 'UOO' => 'UOOGOU', 1920 'UNB' => 'Unblock Tech', 1921 'UK' => 'UTOK', 1922 '3U' => 'IUNI', 1923 'UT' => 'UTStarcom', 1924 '6U' => 'UTime', 1925 '9U' => 'Urovo', 1926 'UW' => 'U-Magic', 1927 '5V' => 'VAIO', 1928 'WV' => 'VAVA', 1929 'VA' => 'Vastking', 1930 'VP' => 'Vargo', 1931 'VC' => 'Vankyo', 1932 'VAL' => 'VALEM', 1933 'VA2' => 'VALE', 1934 'VAT' => 'VALTECH', 1935 'VAN' => 'VANGUARD', 1936 'VAW' => 'VANWIN', 1937 'VB' => 'VC', 1938 'VEI' => 'Veidoo', 1939 'VN' => 'Venso', 1940 'VNP' => 'VNPT Technology', 1941 'VEN' => 'Venstar', 1942 'UV' => 'Venturer', 1943 'VQ' => 'Vega', 1944 'WC' => 'VEON', 1945 '4V' => 'Verico', 1946 'V4' => 'Verizon', 1947 'VR' => 'Vernee', 1948 'VX' => 'Vertex', 1949 'VE' => 'Vertu', 1950 'VET' => 'VETAS', 1951 'VL' => 'Verykool', 1952 'QV' => 'Verssed', 1953 'VER' => 'Versus', 1954 'V8' => 'Vesta', 1955 'VEK' => 'Vekta', 1956 'VT' => 'Vestel', 1957 '48' => 'Vexia', 1958 'V6' => 'VGO TEL', 1959 'QJ' => 'VDVD', 1960 'VIC' => 'Victurio', 1961 'VD' => 'Videocon', 1962 'VW' => 'Videoweb', 1963 'VS' => 'ViewSonic', 1964 'VIE' => 'Viendo', 1965 'VIK' => 'VIKUSHA', 1966 'V7' => 'Vinga', 1967 'V7T' => 'V7', 1968 'V3' => 'Vinsoc', 1969 'XD' => 'Vinabox', 1970 'FV' => 'Vios', 1971 '0V' => 'Vipro', 1972 'ZV' => 'Virzo', 1973 'VIP' => 'Viper', 1974 'VI' => 'Vitelcom', 1975 'VIB' => 'ViBox', 1976 '8V' => 'Viumee', 1977 'V5' => 'Vivax', 1978 'VIV' => 'VIVIMAGE', 1979 'VI2' => 'VIVIBright', 1980 'VV' => 'Vivo', 1981 '6V' => 'VIWA', 1982 'VII' => 'VIIPOO', 1983 'VID' => 'VIDA', 1984 'VZ' => 'Vizio', 1985 'VIZ' => 'Vizmo', 1986 'VIT' => 'Vityaz', 1987 '9V' => 'Vision Touch', 1988 'VIS' => 'Vision Technology', 1989 'VST' => 'Visitech', 1990 'VIL' => 'Visual Land', 1991 'VI1' => 'VILLAON', 1992 'VIM' => 'VIMOQ', 1993 'VK' => 'VK Mobile', 1994 'JM' => 'v-mobile', 1995 'VHO' => 'V-HOPE', 1996 'VHM' => 'V-HOME', 1997 'VGE' => 'V-Gen', 1998 'V0' => 'VKworld', 1999 'VM' => 'Vodacom', 2000 'VOC' => 'VOCAL', 2001 'VF' => 'Vodafone', 2002 '7W' => 'VOGA', 2003 'V2' => 'Vonino', 2004 '1V' => 'Vontar', 2005 'VG' => 'Vorago', 2006 '2V' => 'Vorke', 2007 '8U' => 'Vorcom', 2008 'JW' => 'Vortex', 2009 'VRX' => 'VORTEX (RO)', 2010 'VOR' => 'Vormor', 2011 'V1' => 'Voto', 2012 'Z7' => 'VOX', 2013 'VO' => 'Voxtel', 2014 'VY' => 'Voyo', 2015 'VOL' => 'Völfen', 2016 'VO1' => 'Volt', 2017 'VOP' => 'Volla', 2018 'V02' => 'VOLIA', 2019 'VH' => 'Vsmart', 2020 'V9' => 'Vsun', 2021 'VU' => 'Vulcan', 2022 '3V' => 'VVETIME', 2023 'ZC' => 'VUCATIMES', 2024 'VO2' => 'VOLKANO', 2025 'VUE' => 'Vue Micro', 2026 'WAK' => 'Walker', 2027 'WA' => 'Walton', 2028 'WAF' => 'WAF', 2029 'WAO' => 'W&O', 2030 'WLT' => 'Waltham', 2031 'WAL' => 'Waltter', 2032 'WAI' => 'Wainyok', 2033 'WHI' => 'White Mobile', 2034 'WHO' => 'Whoop', 2035 'WBL' => 'We. by Loewe.', 2036 'WCP' => 'WeChip', 2037 'WM' => 'Weimei', 2038 'WM1' => 'Weiimi', 2039 'WE' => 'WellcoM', 2040 'W6' => 'WELLINGTON', 2041 'WD' => 'Western Digital', 2042 'WST' => 'Weston', 2043 'WT' => 'Westpoint', 2044 'WAN' => 'Wanmukang', 2045 'WA1' => 'WANSA', 2046 'WY' => 'Wexler', 2047 '3W' => 'WE', 2048 'WEC' => 'Wecool', 2049 'WEE' => 'Weelikeit', 2050 'WP' => 'Wieppo', 2051 'W2' => 'Wigor', 2052 'WI' => 'Wiko', 2053 'WF' => 'Wileyfox', 2054 'WLR' => 'WildRed', 2055 'WS' => 'Winds', 2056 'WN' => 'Wink', 2057 '9W' => 'Winmax', 2058 'W5' => 'Winnovo', 2059 'WU' => 'Wintouch', 2060 'WIS' => 'Winstar', 2061 'W0' => 'Wiseasy', 2062 '2W' => 'Wizz', 2063 'W4' => 'WIWA', 2064 'WIZ' => 'WizarPos', 2065 'WL' => 'Wolder', 2066 'WG' => 'Wolfgang', 2067 'WQ' => 'Wolki', 2068 'WON' => 'WONDER', 2069 'WO' => 'Wonu', 2070 'W1' => 'Woo', 2071 'WR' => 'Wortmann', 2072 'WX' => 'Woxter', 2073 'WOZ' => 'WOZIFAN', 2074 'XQ' => 'X-AGE', 2075 'XEL' => 'XElectron', 2076 'X3' => 'X-BO', 2077 'XBI' => 'XB', 2078 'XMO' => 'X-Mobile', 2079 'XT' => 'X-TIGI', 2080 'XV' => 'X-View', 2081 'X4' => 'X.Vision', 2082 'X88' => 'X88', 2083 'X96' => 'X96', 2084 '96Q' => 'X96Q', 2085 'A95' => 'A95X', 2086 'XG' => 'Xgody', 2087 'XGE' => 'XGEM', 2088 'QX' => 'XGIMI', 2089 'XL' => 'Xiaolajiao', 2090 'XI' => 'Xiaomi', 2091 'XW' => 'Xiaodu', 2092 'XN' => 'Xion', 2093 'XO' => 'Xolo', 2094 'XR' => 'Xoro', 2095 'XPP' => 'XPPen', 2096 'XRL' => 'XREAL', 2097 'XS' => 'Xshitou', 2098 'XSM' => 'Xsmart', 2099 '4X' => 'Xtouch', 2100 'X8' => 'Xtratech', 2101 'XCR' => 'Xcruiser', 2102 'XCO' => 'XCOM', 2103 'XCL' => 'Xcell', 2104 'XWA' => 'Xwave', 2105 'YD' => 'Yandex', 2106 'YA' => 'Yarvik', 2107 'Y2' => 'Yes', 2108 'YES' => 'Yestel', 2109 'YE' => 'Yezz', 2110 'YG' => 'YEPEN', 2111 'YEL' => 'YELLYOUTH', 2112 'YK' => 'Yoka TV', 2113 'YO' => 'Yota', 2114 'YOU' => 'Youin', 2115 'YO1' => 'Youwei', 2116 'YOO' => 'Yooz', 2117 'YT' => 'Ytone', 2118 'Y9' => 'YOTOPT', 2119 'Y1' => 'Yu', 2120 'YF' => 'YU Fly', 2121 'Y0' => 'YUHO', 2122 'YN' => 'Yuno', 2123 'YUN' => 'YUNDOO', 2124 'YUS' => 'YunSong', 2125 'YUM' => 'YUMKEM', 2126 'YU' => 'Yuandao', 2127 'YS' => 'Yusun', 2128 'YJ' => 'YASIN', 2129 'YX' => 'Yxtel', 2130 '0Z' => 'Zatec', 2131 '2Z' => 'Zaith', 2132 'ZAM' => 'Zamolxe', 2133 'ZZB' => 'ZZB', 2134 'ZEA' => 'Zealot', 2135 'PZ' => 'Zebra', 2136 'ZE1' => 'Zeblaze', 2137 'ZE' => 'Zeemi', 2138 'WZ' => 'Zeeker', 2139 'ZN' => 'Zen', 2140 'ZK' => 'Zenek', 2141 'ZL' => 'Zentality', 2142 'ZF' => 'Zfiner', 2143 'ZI' => 'Zidoo', 2144 'FZ' => 'ZIFRO', 2145 'ZIF' => 'ZIFFLER', 2146 'ZIO' => 'ZIOVO', 2147 'ZX' => 'Ziox', 2148 'ZIK' => 'ZIK', 2149 'ZKI' => 'Z-Kai', 2150 'ZIG' => 'Zigo', 2151 'ZIN' => 'Zinox', 2152 'ZO' => 'Zonda', 2153 'ZW' => 'Zonko', 2154 'ZP' => 'Zopo', 2155 'ZOO' => 'ZoomSmart', 2156 'ZO1' => 'Zoom', 2157 'ZT' => 'ZTE', 2158 'ZU' => 'Zuum', 2159 'ZY' => 'Zync', 2160 'ZR' => 'Zyrex', 2161 'ZQ' => 'ZYQ', 2162 'Z4' => 'ZH&K', 2163 'OW' => 'öwn', 2164 'WBF' => 'Webfleet', 2165 'WSS' => 'WS', 2166 // legacy brands, might be removed in future versions 2167 'WB' => 'Web TV', 2168 'XX' => 'Unknown', 2169 ]; 2170 2171 /** 2172 * Mapping formFactor types to parser device types 2173 * (not sort array the array priority result device type) 2174 * @var array 2175 */ 2176 protected static $clientHintFormFactorsMapping = [ 2177 'automotive' => self::DEVICE_TYPE_CAR_BROWSER, 2178 'xr' => self::DEVICE_TYPE_WEARABLE, 2179 'watch' => self::DEVICE_TYPE_WEARABLE, 2180 'mobile' => self::DEVICE_TYPE_SMARTPHONE, 2181 'tablet' => self::DEVICE_TYPE_TABLET, 2182 'desktop' => self::DEVICE_TYPE_DESKTOP, 2183 'eink' => self::DEVICE_TYPE_TABLET, 2184 ]; 2185 2186 /** 2187 * Returns the device type represented by one of the DEVICE_TYPE_* constants 2188 * 2189 * @return int|null 2190 */ 2191 public function getDeviceType(): ?int 2192 { 2193 return $this->deviceType; 2194 } 2195 2196 /** 2197 * Returns available device types 2198 * 2199 * @see $deviceTypes 2200 * 2201 * @return array 2202 */ 2203 public static function getAvailableDeviceTypes(): array 2204 { 2205 return self::$deviceTypes; 2206 } 2207 2208 /** 2209 * Returns names of all available device types 2210 * 2211 * @return array 2212 */ 2213 public static function getAvailableDeviceTypeNames(): array 2214 { 2215 return \array_keys(self::$deviceTypes); 2216 } 2217 2218 /** 2219 * Returns the name of the given device type 2220 * 2221 * @param int $deviceType one of the DEVICE_TYPE_* constants 2222 * 2223 * @return string 2224 */ 2225 public static function getDeviceName(int $deviceType): string 2226 { 2227 $deviceName = \array_search($deviceType, self::$deviceTypes); 2228 2229 if (\is_string($deviceName)) { 2230 return $deviceName; 2231 } 2232 2233 return ''; 2234 } 2235 2236 /** 2237 * Returns the detected device model 2238 * 2239 * @return string 2240 */ 2241 public function getModel(): string 2242 { 2243 return $this->model; 2244 } 2245 2246 /** 2247 * Returns the detected device brand 2248 * 2249 * @return string 2250 */ 2251 public function getBrand(): string 2252 { 2253 return $this->brand; 2254 } 2255 2256 /** 2257 * Returns the full brand name for the given short name 2258 * 2259 * @param string $brandId short brand name 2260 * 2261 * @return string 2262 */ 2263 public static function getFullName(string $brandId): string 2264 { 2265 if (\array_key_exists($brandId, self::$deviceBrands)) { 2266 return self::$deviceBrands[$brandId]; 2267 } 2268 2269 return ''; 2270 } 2271 2272 /** 2273 * Returns the brand short code for the given name 2274 * 2275 * @param string $brand brand name 2276 * 2277 * @return string 2278 * 2279 * @deprecated since 4.0 - short codes might be removed in next major release 2280 */ 2281 public static function getShortCode(string $brand): string 2282 { 2283 return (string) \array_search($brand, self::$deviceBrands) ?: ''; 2284 } 2285 2286 /** 2287 * Sets the useragent to be parsed 2288 * 2289 * @param string $userAgent 2290 */ 2291 public function setUserAgent(string $userAgent): void 2292 { 2293 $this->reset(); 2294 parent::setUserAgent($userAgent); 2295 } 2296 2297 /** 2298 * @inheritdoc 2299 */ 2300 public function parse(): ?array 2301 { 2302 $resultClientHint = $this->parseClientHints(); 2303 $deviceModel = $resultClientHint['model'] ?? ''; 2304 2305 $this->restoreUserAgentFromClientHints(); 2306 2307 if ('' === $deviceModel && $this->hasUserAgentClientHintsFragment()) { 2308 return $this->getResult(); 2309 } 2310 2311 if ('' === $deviceModel && $this->hasDesktopFragment()) { 2312 return $this->getResult(); 2313 } 2314 2315 $brand = ''; 2316 $regexes = $this->getRegexes(); 2317 2318 foreach ($regexes as $brand => $regex) { 2319 $matches = $this->matchUserAgent($regex['regex']); 2320 2321 if ($matches) { 2322 break; 2323 } 2324 } 2325 2326 if (empty($matches)) { 2327 $this->deviceType = $resultClientHint['deviceType'] ?? null; 2328 2329 return $resultClientHint; 2330 } 2331 2332 if ('Unknown' !== $brand) { 2333 if (!\in_array($brand, self::$deviceBrands)) { 2334 // This Exception should never be thrown. If so a defined brand name is missing in $deviceBrands 2335 throw new \Exception(\sprintf( 2336 "The brand with name '%s' should be listed in deviceBrands array. Tried to parse user agent: %s", 2337 $brand, 2338 $this->userAgent 2339 )); // @codeCoverageIgnore 2340 } 2341 2342 $this->brand = (string) $brand; 2343 } 2344 2345 if (isset($regex['device']) && \array_key_exists($regex['device'], self::$deviceTypes)) { 2346 $this->deviceType = self::$deviceTypes[$regex['device']]; 2347 } 2348 2349 $this->model = ''; 2350 2351 if (isset($regex['model'])) { 2352 $this->model = $this->buildModel($regex['model'], $matches); 2353 } 2354 2355 if (isset($regex['models'])) { 2356 $modelRegex = ''; 2357 2358 foreach ($regex['models'] as $modelRegex) { 2359 $modelMatches = $this->matchUserAgent($modelRegex['regex']); 2360 2361 if ($modelMatches) { 2362 break; 2363 } 2364 } 2365 2366 if (empty($modelMatches)) { 2367 return $this->getResult(); 2368 } 2369 2370 $this->model = $this->buildModel($modelRegex['model'], $modelMatches); 2371 2372 if (isset($modelRegex['brand']) && \in_array($modelRegex['brand'], self::$deviceBrands)) { 2373 $this->brand = (string) $modelRegex['brand']; 2374 } 2375 2376 if (isset($modelRegex['device']) && \array_key_exists($modelRegex['device'], self::$deviceTypes)) { 2377 $this->deviceType = self::$deviceTypes[$modelRegex['device']]; 2378 } 2379 } 2380 2381 return $this->getResult(); 2382 } 2383 2384 /** 2385 * @param string $model 2386 * @param array $matches 2387 * 2388 * @return string 2389 */ 2390 protected function buildModel(string $model, array $matches): string 2391 { 2392 $model = $this->buildByMatch($model, $matches); 2393 2394 $model = \str_replace('_', ' ', $model); 2395 2396 $model = \preg_replace('/ TD$/i', '', $model); 2397 2398 if ('Build' === $model || empty($model)) { 2399 return ''; 2400 } 2401 2402 return \trim($model); 2403 } 2404 2405 /** 2406 * @return array|null 2407 */ 2408 protected function parseClientHints(): ?array 2409 { 2410 if ($this->clientHints && $this->clientHints->getModel()) { 2411 $detectedDeviceType = null; 2412 $formFactors = $this->clientHints->getFormFactors(); 2413 2414 foreach (self::$clientHintFormFactorsMapping as $formFactor => $deviceType) { 2415 if (\in_array($formFactor, $formFactors)) { 2416 $detectedDeviceType = $deviceType; 2417 2418 break; 2419 } 2420 } 2421 2422 return [ 2423 'deviceType' => $detectedDeviceType, 2424 'model' => $this->clientHints->getModel(), 2425 'brand' => '', 2426 ]; 2427 } 2428 2429 return null; 2430 } 2431 2432 /** 2433 * Resets the stored values 2434 */ 2435 protected function reset(): void 2436 { 2437 $this->deviceType = null; 2438 $this->model = ''; 2439 $this->brand = ''; 2440 } 2441 2442 /** 2443 * @return array 2444 */ 2445 protected function getResult(): array 2446 { 2447 return [ 2448 'deviceType' => $this->deviceType, 2449 'model' => $this->model, 2450 'brand' => $this->brand, 2451 ]; 2452 } 2453} 2454