_regexes.py 144 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835
  1. # -*- coding: utf-8 -*-
  2. ############################################
  3. # NOTICE: This file is autogenerated from #
  4. # regexes.yaml. Do not edit by hand, #
  5. # instead, re-run `setup.py build_regexes` #
  6. ############################################
  7. from __future__ import absolute_import, unicode_literals
  8. from .user_agent_parser import (
  9. UserAgentParser, DeviceParser, OSParser,
  10. )
  11. __all__ = (
  12. 'USER_AGENT_PARSERS', 'DEVICE_PARSERS', 'OS_PARSERS',
  13. )
  14. USER_AGENT_PARSERS = [
  15. UserAgentParser(
  16. '(ESPN)[%20| ]+Radio/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork',
  17. None,
  18. None,
  19. None,
  20. ),
  21. UserAgentParser(
  22. '(Antenna)/(\\d+) CFNetwork',
  23. 'AntennaPod',
  24. None,
  25. None,
  26. ),
  27. UserAgentParser(
  28. '(TopPodcasts)Pro/(\\d+) CFNetwork',
  29. None,
  30. None,
  31. None,
  32. ),
  33. UserAgentParser(
  34. '(MusicDownloader)Lite/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork',
  35. None,
  36. None,
  37. None,
  38. ),
  39. UserAgentParser(
  40. '^(.*)-iPad/(\\d+)\\.?(\\d+)?.?(\\d+)?.?(\\d+)? CFNetwork',
  41. None,
  42. None,
  43. None,
  44. ),
  45. UserAgentParser(
  46. '^(.*)-iPhone/(\\d+)\\.?(\\d+)?.?(\\d+)?.?(\\d+)? CFNetwork',
  47. None,
  48. None,
  49. None,
  50. ),
  51. UserAgentParser(
  52. '^(.*)/(\\d+)\\.?(\\d+)?.?(\\d+)?.?(\\d+)? CFNetwork',
  53. None,
  54. None,
  55. None,
  56. ),
  57. UserAgentParser(
  58. '(espn\\.go)',
  59. 'ESPN',
  60. None,
  61. None,
  62. ),
  63. UserAgentParser(
  64. '(espnradio\\.com)',
  65. 'ESPN',
  66. None,
  67. None,
  68. ),
  69. UserAgentParser(
  70. 'ESPN APP$',
  71. 'ESPN',
  72. None,
  73. None,
  74. ),
  75. UserAgentParser(
  76. '(audioboom\\.com)',
  77. 'AudioBoom',
  78. None,
  79. None,
  80. ),
  81. UserAgentParser(
  82. ' (Rivo) RHYTHM',
  83. None,
  84. None,
  85. None,
  86. ),
  87. UserAgentParser(
  88. '(CFNetwork)(?:/(\\d+)\\.(\\d+)\\.?(\\d+)?)?',
  89. 'CFNetwork',
  90. None,
  91. None,
  92. ),
  93. UserAgentParser(
  94. '(Pingdom.com_bot_version_)(\\d+)\\.(\\d+)',
  95. 'PingdomBot',
  96. None,
  97. None,
  98. ),
  99. UserAgentParser(
  100. '(PingdomTMS)/(\\d+)\\.(\\d+)\\.(\\d+)',
  101. 'PingdomBot',
  102. None,
  103. None,
  104. ),
  105. UserAgentParser(
  106. '(NewRelicPinger)/(\\d+)\\.(\\d+)',
  107. 'NewRelicPingerBot',
  108. None,
  109. None,
  110. ),
  111. UserAgentParser(
  112. '(Tableau)/(\\d+)\\.(\\d+)',
  113. 'Tableau',
  114. None,
  115. None,
  116. ),
  117. UserAgentParser(
  118. '(\\(StatusCake\\))',
  119. 'StatusCakeBot',
  120. None,
  121. None,
  122. ),
  123. UserAgentParser(
  124. '(facebookexternalhit)/(\\d+)\\.(\\d+)',
  125. 'FacebookBot',
  126. None,
  127. None,
  128. ),
  129. UserAgentParser(
  130. 'Google.*/\\+/web/snippet',
  131. 'GooglePlusBot',
  132. None,
  133. None,
  134. ),
  135. UserAgentParser(
  136. 'via ggpht.com GoogleImageProxy',
  137. 'GmailImageProxy',
  138. None,
  139. None,
  140. ),
  141. UserAgentParser(
  142. '(Twitterbot)/(\\d+)\\.(\\d+)',
  143. 'TwitterBot',
  144. None,
  145. None,
  146. ),
  147. UserAgentParser(
  148. '/((?:Ant-)?Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \\-](\\d+)(?:\\.(\\d+)(?:\\.(\\d+))?)?',
  149. None,
  150. None,
  151. None,
  152. ),
  153. UserAgentParser(
  154. '\\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+))?)?',
  155. None,
  156. None,
  157. None,
  158. ),
  159. UserAgentParser(
  160. '(MSIE) (\\d+)\\.(\\d+)([a-z]\\d?)?;.* MSIECrawler',
  161. 'MSIECrawler',
  162. None,
  163. None,
  164. ),
  165. UserAgentParser(
  166. '(DAVdroid)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  167. None,
  168. None,
  169. None,
  170. ),
  171. UserAgentParser(
  172. '(Google-HTTP-Java-Client|Apache-HttpClient|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp)(?:[ /](\\d+)(?:\\.(\\d+)(?:\\.(\\d+))?)?)?',
  173. None,
  174. None,
  175. None,
  176. ),
  177. UserAgentParser(
  178. '(Pinterest(?:bot)?)/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+))?)?[;\\s\\(]+\\+https://www.pinterest.com/bot.html',
  179. 'Pinterestbot',
  180. None,
  181. None,
  182. ),
  183. UserAgentParser(
  184. '(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|BUbiNG|\\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|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\\.ru|Tiny Tiny RSS|TwitterBot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]+|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+))?)?)?',
  185. None,
  186. None,
  187. None,
  188. ),
  189. UserAgentParser(
  190. '(?:\\/[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+))?)?',
  191. None,
  192. None,
  193. None,
  194. ),
  195. UserAgentParser(
  196. '(?:\\/[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+))?)?',
  197. None,
  198. None,
  199. None,
  200. ),
  201. UserAgentParser(
  202. '((?:[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+))?)?)?',
  203. None,
  204. None,
  205. None,
  206. ),
  207. UserAgentParser(
  208. '(HbbTV)/(\\d+)\\.(\\d+)\\.(\\d+) \\(',
  209. None,
  210. None,
  211. None,
  212. ),
  213. UserAgentParser(
  214. '(Chimera|SeaMonkey|Camino)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)?',
  215. None,
  216. None,
  217. None,
  218. ),
  219. UserAgentParser(
  220. '\\[FB.*;(FBAV)/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+))?)?',
  221. 'Facebook',
  222. None,
  223. None,
  224. ),
  225. UserAgentParser(
  226. '\\[(Pinterest)/[^\\]]+\\]',
  227. None,
  228. None,
  229. None,
  230. ),
  231. UserAgentParser(
  232. '(Pinterest)(?: for Android(?: Tablet)?)?/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+))?)?',
  233. None,
  234. None,
  235. None,
  236. ),
  237. UserAgentParser(
  238. '(PaleMoon)/(\\d+)\\.(\\d+)\\.?(\\d+)?',
  239. 'Pale Moon',
  240. None,
  241. None,
  242. ),
  243. UserAgentParser(
  244. '(Fennec)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)',
  245. 'Firefox Mobile',
  246. None,
  247. None,
  248. ),
  249. UserAgentParser(
  250. '(Fennec)/(\\d+)\\.(\\d+)(pre)',
  251. 'Firefox Mobile',
  252. None,
  253. None,
  254. ),
  255. UserAgentParser(
  256. '(Fennec)/(\\d+)\\.(\\d+)',
  257. 'Firefox Mobile',
  258. None,
  259. None,
  260. ),
  261. UserAgentParser(
  262. '(?:Mobile|Tablet);.*(Firefox)/(\\d+)\\.(\\d+)',
  263. 'Firefox Mobile',
  264. None,
  265. None,
  266. ),
  267. UserAgentParser(
  268. '(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?)',
  269. 'Firefox ($1)',
  270. None,
  271. None,
  272. ),
  273. UserAgentParser(
  274. '(Firefox)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)',
  275. 'Firefox Alpha',
  276. None,
  277. None,
  278. ),
  279. UserAgentParser(
  280. '(Firefox)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)',
  281. 'Firefox Beta',
  282. None,
  283. None,
  284. ),
  285. UserAgentParser(
  286. '(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(a\\d+[a-z]*)',
  287. 'Firefox Alpha',
  288. None,
  289. None,
  290. ),
  291. UserAgentParser(
  292. '(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(b\\d+[a-z]*)',
  293. 'Firefox Beta',
  294. None,
  295. None,
  296. ),
  297. UserAgentParser(
  298. '(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?',
  299. 'Firefox ($1)',
  300. None,
  301. None,
  302. ),
  303. UserAgentParser(
  304. '(Firefox).*Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)',
  305. 'MicroB',
  306. None,
  307. None,
  308. ),
  309. UserAgentParser(
  310. '(MozillaDeveloperPreview)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?',
  311. None,
  312. None,
  313. None,
  314. ),
  315. UserAgentParser(
  316. '(FxiOS)/(\\d+)\\.(\\d+)(\\.(\\d+))?(\\.(\\d+))?',
  317. 'Firefox iOS',
  318. None,
  319. None,
  320. ),
  321. UserAgentParser(
  322. '(Flock)/(\\d+)\\.(\\d+)(b\\d+?)',
  323. None,
  324. None,
  325. None,
  326. ),
  327. UserAgentParser(
  328. '(RockMelt)/(\\d+)\\.(\\d+)\\.(\\d+)',
  329. None,
  330. None,
  331. None,
  332. ),
  333. UserAgentParser(
  334. '(Navigator)/(\\d+)\\.(\\d+)\\.(\\d+)',
  335. 'Netscape',
  336. None,
  337. None,
  338. ),
  339. UserAgentParser(
  340. '(Navigator)/(\\d+)\\.(\\d+)([ab]\\d+)',
  341. 'Netscape',
  342. None,
  343. None,
  344. ),
  345. UserAgentParser(
  346. '(Netscape6)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+)?',
  347. 'Netscape',
  348. None,
  349. None,
  350. ),
  351. UserAgentParser(
  352. '(MyIBrow)/(\\d+)\\.(\\d+)',
  353. 'My Internet Browser',
  354. None,
  355. None,
  356. ),
  357. UserAgentParser(
  358. '(UC? ?Browser|UCWEB|U3)[ /]?(\\d+)\\.(\\d+)\\.(\\d+)',
  359. 'UC Browser',
  360. None,
  361. None,
  362. ),
  363. UserAgentParser(
  364. '(Opera Tablet).*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  365. None,
  366. None,
  367. None,
  368. ),
  369. UserAgentParser(
  370. '(Opera Mini)(?:/att)?/?(\\d+)?(?:\\.(\\d+))?(?:\\.(\\d+))?',
  371. None,
  372. None,
  373. None,
  374. ),
  375. UserAgentParser(
  376. '(Opera)/.+Opera Mobi.+Version/(\\d+)\\.(\\d+)',
  377. 'Opera Mobile',
  378. None,
  379. None,
  380. ),
  381. UserAgentParser(
  382. '(Opera)/(\\d+)\\.(\\d+).+Opera Mobi',
  383. 'Opera Mobile',
  384. None,
  385. None,
  386. ),
  387. UserAgentParser(
  388. 'Opera Mobi.+(Opera)(?:/|\\s+)(\\d+)\\.(\\d+)',
  389. 'Opera Mobile',
  390. None,
  391. None,
  392. ),
  393. UserAgentParser(
  394. 'Opera Mobi',
  395. 'Opera Mobile',
  396. None,
  397. None,
  398. ),
  399. UserAgentParser(
  400. '(Opera)/9.80.*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  401. None,
  402. None,
  403. None,
  404. ),
  405. UserAgentParser(
  406. '(?:Mobile Safari).*(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)',
  407. 'Opera Mobile',
  408. None,
  409. None,
  410. ),
  411. UserAgentParser(
  412. '(?:Chrome).*(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)',
  413. 'Opera',
  414. None,
  415. None,
  416. ),
  417. UserAgentParser(
  418. '(Coast)/(\\d+).(\\d+).(\\d+)',
  419. 'Opera Coast',
  420. None,
  421. None,
  422. ),
  423. UserAgentParser(
  424. '(OPiOS)/(\\d+).(\\d+).(\\d+)',
  425. 'Opera Mini',
  426. None,
  427. None,
  428. ),
  429. UserAgentParser(
  430. 'Chrome/.+( MMS)/(\\d+).(\\d+).(\\d+)',
  431. 'Opera Neon',
  432. None,
  433. None,
  434. ),
  435. UserAgentParser(
  436. '(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  437. 'webOS Browser',
  438. None,
  439. None,
  440. ),
  441. UserAgentParser(
  442. '(luakit)',
  443. 'LuaKit',
  444. None,
  445. None,
  446. ),
  447. UserAgentParser(
  448. '(Snowshoe)/(\\d+)\\.(\\d+).(\\d+)',
  449. None,
  450. None,
  451. None,
  452. ),
  453. UserAgentParser(
  454. 'Gecko/\\d+ (Lightning)/(\\d+)\\.(\\d+)\\.?((?:[ab]?\\d+[a-z]*)|(?:\\d*))',
  455. None,
  456. None,
  457. None,
  458. ),
  459. UserAgentParser(
  460. '(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?) \\(Swiftfox\\)',
  461. 'Swiftfox',
  462. None,
  463. None,
  464. ),
  465. UserAgentParser(
  466. '(Firefox)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)? \\(Swiftfox\\)',
  467. 'Swiftfox',
  468. None,
  469. None,
  470. ),
  471. UserAgentParser(
  472. '(rekonq)/(\\d+)\\.(\\d+)\\.?(\\d+)? Safari',
  473. 'Rekonq',
  474. None,
  475. None,
  476. ),
  477. UserAgentParser(
  478. 'rekonq',
  479. 'Rekonq',
  480. None,
  481. None,
  482. ),
  483. UserAgentParser(
  484. '(conkeror|Conkeror)/(\\d+)\\.(\\d+)\\.?(\\d+)?',
  485. 'Conkeror',
  486. None,
  487. None,
  488. ),
  489. UserAgentParser(
  490. '(konqueror)/(\\d+)\\.(\\d+)\\.(\\d+)',
  491. 'Konqueror',
  492. None,
  493. None,
  494. ),
  495. UserAgentParser(
  496. '(WeTab)-Browser',
  497. None,
  498. None,
  499. None,
  500. ),
  501. UserAgentParser(
  502. '(Comodo_Dragon)/(\\d+)\\.(\\d+)\\.(\\d+)',
  503. 'Comodo Dragon',
  504. None,
  505. None,
  506. ),
  507. UserAgentParser(
  508. '(Symphony) (\\d+).(\\d+)',
  509. None,
  510. None,
  511. None,
  512. ),
  513. UserAgentParser(
  514. 'PLAYSTATION 3.+WebKit',
  515. 'NetFront NX',
  516. None,
  517. None,
  518. ),
  519. UserAgentParser(
  520. 'PLAYSTATION 3',
  521. 'NetFront',
  522. None,
  523. None,
  524. ),
  525. UserAgentParser(
  526. '(PlayStation Portable)',
  527. 'NetFront',
  528. None,
  529. None,
  530. ),
  531. UserAgentParser(
  532. '(PlayStation Vita)',
  533. 'NetFront NX',
  534. None,
  535. None,
  536. ),
  537. UserAgentParser(
  538. 'AppleWebKit.+ (NX)/(\\d+)\\.(\\d+)\\.(\\d+)',
  539. 'NetFront NX',
  540. None,
  541. None,
  542. ),
  543. UserAgentParser(
  544. '(Nintendo 3DS)',
  545. 'NetFront NX',
  546. None,
  547. None,
  548. ),
  549. UserAgentParser(
  550. '(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+))?',
  551. 'Amazon Silk',
  552. None,
  553. None,
  554. ),
  555. UserAgentParser(
  556. '(Puffin)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  557. None,
  558. None,
  559. None,
  560. ),
  561. UserAgentParser(
  562. 'Windows Phone .*(Edge)/(\\d+)\\.(\\d+)',
  563. 'Edge Mobile',
  564. None,
  565. None,
  566. ),
  567. UserAgentParser(
  568. '(SamsungBrowser)/(\\d+)\\.(\\d+)',
  569. 'Samsung Internet',
  570. None,
  571. None,
  572. ),
  573. UserAgentParser(
  574. '(SznProhlizec)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  575. u'Seznam prohl\xed\u017ee\u010d',
  576. None,
  577. None,
  578. ),
  579. UserAgentParser(
  580. '(coc_coc_browser)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  581. 'Coc Coc',
  582. None,
  583. None,
  584. ),
  585. UserAgentParser(
  586. '(baidubrowser)[/\\s](\\d+)(?:\\.(\\d+)(?:\\.(\\d+))?)?',
  587. 'Baidu Browser',
  588. None,
  589. None,
  590. ),
  591. UserAgentParser(
  592. '(FlyFlow)/(\\d+)\\.(\\d+)',
  593. 'Baidu Explorer',
  594. None,
  595. None,
  596. ),
  597. UserAgentParser(
  598. '(MxBrowser)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  599. 'Maxthon',
  600. None,
  601. None,
  602. ),
  603. UserAgentParser(
  604. '(Crosswalk)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
  605. None,
  606. None,
  607. None,
  608. ),
  609. UserAgentParser(
  610. '; wv\\).+(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
  611. 'Chrome Mobile WebView',
  612. None,
  613. None,
  614. ),
  615. UserAgentParser(
  616. '(CrMo)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
  617. 'Chrome Mobile',
  618. None,
  619. None,
  620. ),
  621. UserAgentParser(
  622. '(CriOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
  623. 'Chrome Mobile iOS',
  624. None,
  625. None,
  626. ),
  627. UserAgentParser(
  628. '(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile(?:[ /]|$)',
  629. 'Chrome Mobile',
  630. None,
  631. None,
  632. ),
  633. UserAgentParser(
  634. ' Mobile .*(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
  635. 'Chrome Mobile',
  636. None,
  637. None,
  638. ),
  639. UserAgentParser(
  640. '(chromeframe)/(\\d+)\\.(\\d+)\\.(\\d+)',
  641. 'Chrome Frame',
  642. None,
  643. None,
  644. ),
  645. UserAgentParser(
  646. '(SLP Browser)/(\\d+)\\.(\\d+)',
  647. 'Tizen Browser',
  648. None,
  649. None,
  650. ),
  651. UserAgentParser(
  652. '(SE 2\\.X) MetaSr (\\d+)\\.(\\d+)',
  653. 'Sogou Explorer',
  654. None,
  655. None,
  656. ),
  657. UserAgentParser(
  658. '(MQQBrowser/Mini)(?:(\\d+)(?:\\.(\\d+)(?:\\.(\\d+))?)?)?',
  659. 'QQ Browser Mini',
  660. None,
  661. None,
  662. ),
  663. UserAgentParser(
  664. '(MQQBrowser)(?:/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+))?)?)?',
  665. 'QQ Browser Mobile',
  666. None,
  667. None,
  668. ),
  669. UserAgentParser(
  670. '(QQBrowser)(?:/(\\d+)(?:\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?)?)?',
  671. 'QQ Browser',
  672. None,
  673. None,
  674. ),
  675. UserAgentParser(
  676. '(Rackspace Monitoring)/(\\d+)\\.(\\d+)',
  677. 'RackspaceBot',
  678. None,
  679. None,
  680. ),
  681. UserAgentParser(
  682. '(PyAMF)/(\\d+)\\.(\\d+)\\.(\\d+)',
  683. None,
  684. None,
  685. None,
  686. ),
  687. UserAgentParser(
  688. '(YaBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)',
  689. 'Yandex Browser',
  690. None,
  691. None,
  692. ),
  693. UserAgentParser(
  694. '(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+).* MRCHROME',
  695. 'Mail.ru Chromium Browser',
  696. None,
  697. None,
  698. ),
  699. UserAgentParser(
  700. '(AOL) (\\d+)\\.(\\d+); AOLBuild (\\d+)',
  701. None,
  702. None,
  703. None,
  704. ),
  705. UserAgentParser(
  706. '(PodCruncher|Downcast)[ /]?(\\d+)\\.?(\\d+)?\\.?(\\d+)?\\.?(\\d+)?',
  707. None,
  708. None,
  709. None,
  710. ),
  711. UserAgentParser(
  712. ' (BoxNotes)/(\\d+)\\.(\\d+)\\.(\\d+)',
  713. None,
  714. None,
  715. None,
  716. ),
  717. UserAgentParser(
  718. '(Slack_SSB)/(\\d+)\\.(\\d+)\\.(\\d+)',
  719. 'Slack Desktop Client',
  720. None,
  721. None,
  722. ),
  723. UserAgentParser(
  724. '(HipChat)/?(\\d+)?',
  725. 'HipChat Desktop Client',
  726. None,
  727. None,
  728. ),
  729. UserAgentParser(
  730. '\\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|OktaMobile)/(\\d+)\\.(\\d+)\\.(\\d+)',
  731. None,
  732. None,
  733. None,
  734. ),
  735. UserAgentParser(
  736. 'Microsoft Office Outlook 12\\.\\d+\\.\\d+|MSOffice 12',
  737. 'Outlook',
  738. '2007',
  739. None,
  740. ),
  741. UserAgentParser(
  742. 'Microsoft Outlook 14\\.\\d+\\.\\d+|MSOffice 14',
  743. 'Outlook',
  744. '2010',
  745. None,
  746. ),
  747. UserAgentParser(
  748. 'Microsoft Outlook 15\\.\\d+\\.\\d+',
  749. 'Outlook',
  750. '2013',
  751. None,
  752. ),
  753. UserAgentParser(
  754. 'Microsoft Outlook (?:Mail )?16\\.\\d+\\.\\d+',
  755. 'Outlook',
  756. '2016',
  757. None,
  758. ),
  759. UserAgentParser(
  760. 'Outlook-Express\\/7\\.0.*',
  761. 'Windows Live Mail',
  762. None,
  763. None,
  764. ),
  765. UserAgentParser(
  766. '(Airmail) (\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  767. None,
  768. None,
  769. None,
  770. ),
  771. UserAgentParser(
  772. '(Thunderbird)/(\\d+)\\.(\\d+)(?:\\.(\\d+(?:pre)?))?',
  773. 'Thunderbird',
  774. None,
  775. None,
  776. ),
  777. UserAgentParser(
  778. '(Postbox)/(\\d+)\\.(\\d+)\\.(\\d+)',
  779. 'Postbox',
  780. None,
  781. None,
  782. ),
  783. UserAgentParser(
  784. '(Barca(?:Pro)?)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  785. 'Barca',
  786. None,
  787. None,
  788. ),
  789. UserAgentParser(
  790. '(Lotus-Notes)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  791. 'Lotus Notes',
  792. None,
  793. None,
  794. ),
  795. UserAgentParser(
  796. '(Vivaldi)/(\\d+)\\.(\\d+)\\.(\\d+)',
  797. None,
  798. None,
  799. None,
  800. ),
  801. UserAgentParser(
  802. '(Edge)/(\\d+)(?:\\.(\\d+))?',
  803. None,
  804. None,
  805. None,
  806. ),
  807. UserAgentParser(
  808. '(brave)/(\\d+)\\.(\\d+)\\.(\\d+) Chrome',
  809. 'Brave',
  810. None,
  811. None,
  812. ),
  813. UserAgentParser(
  814. '(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)[\\d.]* Iron[^/]',
  815. 'Iron',
  816. None,
  817. None,
  818. ),
  819. UserAgentParser(
  820. '\\b(Dolphin)(?: |HDCN/|/INT\\-)(\\d+)\\.(\\d+)\\.?(\\d+)?',
  821. None,
  822. None,
  823. None,
  824. ),
  825. UserAgentParser(
  826. '(HeadlessChrome)(?:/(\\d+)\\.(\\d+)\\.(\\d+))?',
  827. None,
  828. None,
  829. None,
  830. ),
  831. UserAgentParser(
  832. '(Evolution)/(\\d+)\\.(\\d+)\\.(\\d+\\.\\d+)',
  833. None,
  834. None,
  835. None,
  836. ),
  837. UserAgentParser(
  838. '(RCM CardDAV plugin)/(\\d+)\\.(\\d+)\\.(\\d+(?:-dev)?)',
  839. None,
  840. None,
  841. None,
  842. ),
  843. UserAgentParser(
  844. '(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+))?',
  845. None,
  846. None,
  847. None,
  848. ),
  849. UserAgentParser(
  850. '(Chromium|Chrome)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  851. None,
  852. None,
  853. None,
  854. ),
  855. UserAgentParser(
  856. '(IEMobile)[ /](\\d+)\\.(\\d+)',
  857. 'IE Mobile',
  858. None,
  859. None,
  860. ),
  861. UserAgentParser(
  862. '(BacaBerita App)\\/(\\d+)\\.(\\d+)\\.(\\d+)',
  863. None,
  864. None,
  865. None,
  866. ),
  867. UserAgentParser(
  868. '^(bPod|Pocket Casts|Player FM)$',
  869. None,
  870. None,
  871. None,
  872. ),
  873. UserAgentParser(
  874. '^(AlexaMediaPlayer|VLC)/(\\d+)\\.(\\d+)\\.([^.\\s]+)',
  875. None,
  876. None,
  877. None,
  878. ),
  879. UserAgentParser(
  880. '^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\\d+)\\.(\\d+)\\.?(\\d+)?\\.?(\\d+)?',
  881. None,
  882. None,
  883. None,
  884. ),
  885. UserAgentParser(
  886. '^(Peapod|Liferea)/([^.\\s]+)\\.([^.\\s]+)?\\.?([^.\\s]+)?',
  887. None,
  888. None,
  889. None,
  890. ),
  891. UserAgentParser(
  892. '^(bPod|Player FM) BMID/(\\S+)',
  893. None,
  894. None,
  895. None,
  896. ),
  897. UserAgentParser(
  898. '^(Podcast ?Addict)/v(\\d+) ',
  899. None,
  900. None,
  901. None,
  902. ),
  903. UserAgentParser(
  904. '^(Podcast ?Addict) ',
  905. 'PodcastAddict',
  906. None,
  907. None,
  908. ),
  909. UserAgentParser(
  910. '(Replay) AV',
  911. None,
  912. None,
  913. None,
  914. ),
  915. UserAgentParser(
  916. '(VOX) Music Player',
  917. None,
  918. None,
  919. None,
  920. ),
  921. UserAgentParser(
  922. '(CITA) RSS Aggregator/(\\d+)\\.(\\d+)',
  923. None,
  924. None,
  925. None,
  926. ),
  927. UserAgentParser(
  928. '(Pocket Casts)$',
  929. None,
  930. None,
  931. None,
  932. ),
  933. UserAgentParser(
  934. '(Player FM)$',
  935. None,
  936. None,
  937. None,
  938. ),
  939. UserAgentParser(
  940. '(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine) (\\d+)\\.(\\d+)\\.?([^.\\s]+)?\\.?([^.\\s]+)?',
  941. None,
  942. None,
  943. None,
  944. ),
  945. UserAgentParser(
  946. '(philpodder)/(\\d+)\\.(\\d+)\\.?([^.\\s]+)?\\.?([^.\\s]+)?',
  947. None,
  948. None,
  949. None,
  950. ),
  951. UserAgentParser(
  952. '(Player FM|Pocket Casts|DoggCatcher|Spotify|MediaMonkey|MediaGo|BashPodder)',
  953. None,
  954. None,
  955. None,
  956. ),
  957. UserAgentParser(
  958. '(QuickTime)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
  959. None,
  960. None,
  961. None,
  962. ),
  963. UserAgentParser(
  964. '(Kinoma)(\\d+)',
  965. None,
  966. None,
  967. None,
  968. ),
  969. UserAgentParser(
  970. '(Fancy) Cloud Music (\\d+)\\.(\\d+)',
  971. 'FancyMusic',
  972. None,
  973. None,
  974. ),
  975. UserAgentParser(
  976. 'EspnDownloadManager',
  977. 'ESPN',
  978. None,
  979. None,
  980. ),
  981. UserAgentParser(
  982. '(ESPN) Radio (\\d+)\\.(\\d+)\\.?(\\d+)? ?(?:rv:(\\d+))? ',
  983. None,
  984. None,
  985. None,
  986. ),
  987. UserAgentParser(
  988. '(podracer|jPodder) v ?(\\d+)\\.(\\d+)\\.?(\\d+)?',
  989. None,
  990. None,
  991. None,
  992. ),
  993. UserAgentParser(
  994. '(ZDM)/(\\d+)\\.(\\d+)[; ]?',
  995. None,
  996. None,
  997. None,
  998. ),
  999. UserAgentParser(
  1000. '(Zune|BeyondPod) (\\d+)\\.?(\\d+)?[\\);]',
  1001. None,
  1002. None,
  1003. None,
  1004. ),
  1005. UserAgentParser(
  1006. '(WMPlayer)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
  1007. None,
  1008. None,
  1009. None,
  1010. ),
  1011. UserAgentParser(
  1012. '^(Lavf)',
  1013. 'WMPlayer',
  1014. None,
  1015. None,
  1016. ),
  1017. UserAgentParser(
  1018. '^(RSSRadio)[ /]?(\\d+)?',
  1019. None,
  1020. None,
  1021. None,
  1022. ),
  1023. UserAgentParser(
  1024. '(RSS_Radio) (\\d+)\\.(\\d+)',
  1025. 'RSSRadio',
  1026. None,
  1027. None,
  1028. ),
  1029. UserAgentParser(
  1030. '(Podkicker) \\S+/(\\d+)\\.(\\d+)\\.(\\d+)',
  1031. 'Podkicker',
  1032. None,
  1033. None,
  1034. ),
  1035. UserAgentParser(
  1036. '^(HTC) Streaming Player \\S+ / \\S+ / \\S+ / (\\d+)\\.(\\d+)\\.?(\\d+)?',
  1037. None,
  1038. None,
  1039. None,
  1040. ),
  1041. UserAgentParser(
  1042. '^(Stitcher)/iOS',
  1043. None,
  1044. None,
  1045. None,
  1046. ),
  1047. UserAgentParser(
  1048. '^(Stitcher)/Android',
  1049. None,
  1050. None,
  1051. None,
  1052. ),
  1053. UserAgentParser(
  1054. '^(VLC) .*version (\\d+)\\.(\\d+)\\.(\\d+)',
  1055. None,
  1056. None,
  1057. None,
  1058. ),
  1059. UserAgentParser(
  1060. ' (VLC) for',
  1061. None,
  1062. None,
  1063. None,
  1064. ),
  1065. UserAgentParser(
  1066. '(vlc)/(\\d+)\\.(\\d+)\\.(\\d+)',
  1067. 'VLC',
  1068. None,
  1069. None,
  1070. ),
  1071. UserAgentParser(
  1072. '^(foobar)\\S+/([^.\\s]+)\\.([^.\\s]+)?\\.?([^.\\s]+)?',
  1073. None,
  1074. None,
  1075. None,
  1076. ),
  1077. UserAgentParser(
  1078. '^(Clementine)\\S+ ([^.\\s]+)\\.([^.\\s]+)?\\.?([^.\\s]+)?',
  1079. None,
  1080. None,
  1081. None,
  1082. ),
  1083. UserAgentParser(
  1084. '(amarok)/([^.\\s]+)\\.([^.\\s]+)?\\.?([^.\\s]+)?',
  1085. 'Amarok',
  1086. None,
  1087. None,
  1088. ),
  1089. UserAgentParser(
  1090. '(Custom)-Feed Reader',
  1091. None,
  1092. None,
  1093. None,
  1094. ),
  1095. UserAgentParser(
  1096. '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\\d+)\\.(\\d+)\\.(\\d+)',
  1097. None,
  1098. None,
  1099. None,
  1100. ),
  1101. UserAgentParser(
  1102. '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\\d+)\\.(\\d+)\\.?(\\d+)?',
  1103. None,
  1104. None,
  1105. None,
  1106. ),
  1107. UserAgentParser(
  1108. '(Kindle)/(\\d+)\\.(\\d+)',
  1109. None,
  1110. None,
  1111. None,
  1112. ),
  1113. UserAgentParser(
  1114. '(Android) Donut',
  1115. None,
  1116. '1',
  1117. '2',
  1118. ),
  1119. UserAgentParser(
  1120. '(Android) Eclair',
  1121. None,
  1122. '2',
  1123. '1',
  1124. ),
  1125. UserAgentParser(
  1126. '(Android) Froyo',
  1127. None,
  1128. '2',
  1129. '2',
  1130. ),
  1131. UserAgentParser(
  1132. '(Android) Gingerbread',
  1133. None,
  1134. '2',
  1135. '3',
  1136. ),
  1137. UserAgentParser(
  1138. '(Android) Honeycomb',
  1139. None,
  1140. '3',
  1141. None,
  1142. ),
  1143. UserAgentParser(
  1144. '(MSIE) (\\d+)\\.(\\d+).*XBLWP7',
  1145. 'IE Large Screen',
  1146. None,
  1147. None,
  1148. ),
  1149. UserAgentParser(
  1150. '(Nextcloud)',
  1151. None,
  1152. None,
  1153. None,
  1154. ),
  1155. UserAgentParser(
  1156. '(mirall)/(\\d+)\\.(\\d+)\\.(\\d+)',
  1157. None,
  1158. None,
  1159. None,
  1160. ),
  1161. UserAgentParser(
  1162. '(ownCloud-android)/(\\d+)\\.(\\d+)\\.(\\d+)',
  1163. 'Owncloud',
  1164. None,
  1165. None,
  1166. ),
  1167. UserAgentParser(
  1168. '(Obigo)InternetBrowser',
  1169. None,
  1170. None,
  1171. None,
  1172. ),
  1173. UserAgentParser(
  1174. '(Obigo)\\-Browser',
  1175. None,
  1176. None,
  1177. None,
  1178. ),
  1179. UserAgentParser(
  1180. '(Obigo|OBIGO)[^\\d]*(\\d+)(?:.(\\d+))?',
  1181. 'Obigo',
  1182. None,
  1183. None,
  1184. ),
  1185. UserAgentParser(
  1186. '(MAXTHON|Maxthon) (\\d+)\\.(\\d+)',
  1187. 'Maxthon',
  1188. None,
  1189. None,
  1190. ),
  1191. UserAgentParser(
  1192. '(Maxthon|MyIE2|Uzbl|Shiira)',
  1193. None,
  1194. '0',
  1195. None,
  1196. ),
  1197. UserAgentParser(
  1198. '(BrowseX) \\((\\d+)\\.(\\d+)\\.(\\d+)',
  1199. None,
  1200. None,
  1201. None,
  1202. ),
  1203. UserAgentParser(
  1204. '(NCSA_Mosaic)/(\\d+)\\.(\\d+)',
  1205. 'NCSA Mosaic',
  1206. None,
  1207. None,
  1208. ),
  1209. UserAgentParser(
  1210. '(POLARIS)/(\\d+)\\.(\\d+)',
  1211. 'Polaris',
  1212. None,
  1213. None,
  1214. ),
  1215. UserAgentParser(
  1216. '(Embider)/(\\d+)\\.(\\d+)',
  1217. 'Polaris',
  1218. None,
  1219. None,
  1220. ),
  1221. UserAgentParser(
  1222. '(BonEcho)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+)?',
  1223. 'Bon Echo',
  1224. None,
  1225. None,
  1226. ),
  1227. UserAgentParser(
  1228. '(iPod|iPhone|iPad).+Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*[ +]Safari',
  1229. 'Mobile Safari',
  1230. None,
  1231. None,
  1232. ),
  1233. UserAgentParser(
  1234. '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\\d+)_(\\d+)(?:_(\\d+))?.* AppleNews\\/\\d+\\.\\d+\\.\\d+?',
  1235. 'Mobile Safari UI/WKWebView',
  1236. None,
  1237. None,
  1238. ),
  1239. UserAgentParser(
  1240. '(iPod|iPhone|iPad).+Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  1241. 'Mobile Safari UI/WKWebView',
  1242. None,
  1243. None,
  1244. ),
  1245. UserAgentParser(
  1246. '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\\d+)_(\\d+)(?:_(\\d+))?.*Mobile.*[ +]Safari',
  1247. 'Mobile Safari',
  1248. None,
  1249. None,
  1250. ),
  1251. UserAgentParser(
  1252. '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\\d+)_(\\d+)(?:_(\\d+))?.*Mobile',
  1253. 'Mobile Safari UI/WKWebView',
  1254. None,
  1255. None,
  1256. ),
  1257. UserAgentParser(
  1258. '(iPod|iPhone|iPad).* Safari',
  1259. 'Mobile Safari',
  1260. None,
  1261. None,
  1262. ),
  1263. UserAgentParser(
  1264. '(iPod|iPhone|iPad)',
  1265. 'Mobile Safari UI/WKWebView',
  1266. None,
  1267. None,
  1268. ),
  1269. UserAgentParser(
  1270. '(Outlook-iOS)/\\d+\\.\\d+\\.prod\\.iphone \\((\\d+)\\.(\\d+)\\.(\\d+)\\)',
  1271. None,
  1272. None,
  1273. None,
  1274. ),
  1275. UserAgentParser(
  1276. '(AvantGo) (\\d+).(\\d+)',
  1277. None,
  1278. None,
  1279. None,
  1280. ),
  1281. UserAgentParser(
  1282. '(OneBrowser)/(\\d+).(\\d+)',
  1283. 'ONE Browser',
  1284. None,
  1285. None,
  1286. ),
  1287. UserAgentParser(
  1288. '(Avant)',
  1289. None,
  1290. '1',
  1291. None,
  1292. ),
  1293. UserAgentParser(
  1294. '(QtCarBrowser)',
  1295. None,
  1296. '1',
  1297. None,
  1298. ),
  1299. UserAgentParser(
  1300. '^(iBrowser/Mini)(\\d+).(\\d+)',
  1301. 'iBrowser Mini',
  1302. None,
  1303. None,
  1304. ),
  1305. UserAgentParser(
  1306. '^(iBrowser|iRAPP)/(\\d+).(\\d+)',
  1307. None,
  1308. None,
  1309. None,
  1310. ),
  1311. UserAgentParser(
  1312. '^(Nokia)',
  1313. 'Nokia Services (WAP) Browser',
  1314. None,
  1315. None,
  1316. ),
  1317. UserAgentParser(
  1318. '(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)\\.(\\d+)',
  1319. 'Nokia Browser',
  1320. None,
  1321. None,
  1322. ),
  1323. UserAgentParser(
  1324. '(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)',
  1325. 'Nokia Browser',
  1326. None,
  1327. None,
  1328. ),
  1329. UserAgentParser(
  1330. '(NokiaBrowser)/(\\d+)\\.(\\d+)',
  1331. 'Nokia Browser',
  1332. None,
  1333. None,
  1334. ),
  1335. UserAgentParser(
  1336. '(BrowserNG)/(\\d+)\\.(\\d+).(\\d+)',
  1337. 'Nokia Browser',
  1338. None,
  1339. None,
  1340. ),
  1341. UserAgentParser(
  1342. '(Series60)/5\\.0',
  1343. 'Nokia Browser',
  1344. '7',
  1345. '0',
  1346. ),
  1347. UserAgentParser(
  1348. '(Series60)/(\\d+)\\.(\\d+)',
  1349. 'Nokia OSS Browser',
  1350. None,
  1351. None,
  1352. ),
  1353. UserAgentParser(
  1354. '(S40OviBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)',
  1355. 'Ovi Browser',
  1356. None,
  1357. None,
  1358. ),
  1359. UserAgentParser(
  1360. '(Nokia)[EN]?(\\d+)',
  1361. None,
  1362. None,
  1363. None,
  1364. ),
  1365. UserAgentParser(
  1366. '(PlayBook).+RIM Tablet OS (\\d+)\\.(\\d+)\\.(\\d+)',
  1367. 'BlackBerry WebKit',
  1368. None,
  1369. None,
  1370. ),
  1371. UserAgentParser(
  1372. '(Black[bB]erry|BB10).+Version/(\\d+)\\.(\\d+)\\.(\\d+)',
  1373. 'BlackBerry WebKit',
  1374. None,
  1375. None,
  1376. ),
  1377. UserAgentParser(
  1378. '(Black[bB]erry)\\s?(\\d+)',
  1379. 'BlackBerry',
  1380. None,
  1381. None,
  1382. ),
  1383. UserAgentParser(
  1384. '(OmniWeb)/v(\\d+)\\.(\\d+)',
  1385. None,
  1386. None,
  1387. None,
  1388. ),
  1389. UserAgentParser(
  1390. '(Blazer)/(\\d+)\\.(\\d+)',
  1391. 'Palm Blazer',
  1392. None,
  1393. None,
  1394. ),
  1395. UserAgentParser(
  1396. '(Pre)/(\\d+)\\.(\\d+)',
  1397. 'Palm Pre',
  1398. None,
  1399. None,
  1400. ),
  1401. UserAgentParser(
  1402. '(ELinks)/(\\d+)\\.(\\d+)',
  1403. None,
  1404. None,
  1405. None,
  1406. ),
  1407. UserAgentParser(
  1408. '(ELinks) \\((\\d+)\\.(\\d+)',
  1409. None,
  1410. None,
  1411. None,
  1412. ),
  1413. UserAgentParser(
  1414. '(Links) \\((\\d+)\\.(\\d+)',
  1415. None,
  1416. None,
  1417. None,
  1418. ),
  1419. UserAgentParser(
  1420. '(QtWeb) Internet Browser/(\\d+)\\.(\\d+)',
  1421. None,
  1422. None,
  1423. None,
  1424. ),
  1425. UserAgentParser(
  1426. '(PhantomJS)/(\\d+)\\.(\\d+)\\.(\\d+)',
  1427. None,
  1428. None,
  1429. None,
  1430. ),
  1431. UserAgentParser(
  1432. '(AppleWebKit)/(\\d+)\\.?(\\d+)?\\+ .* Safari',
  1433. 'WebKit Nightly',
  1434. None,
  1435. None,
  1436. ),
  1437. UserAgentParser(
  1438. '(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+))?.*Safari/',
  1439. 'Safari',
  1440. None,
  1441. None,
  1442. ),
  1443. UserAgentParser(
  1444. '(Safari)/\\d+',
  1445. None,
  1446. None,
  1447. None,
  1448. ),
  1449. UserAgentParser(
  1450. '(OLPC)/Update(\\d+)\\.(\\d+)',
  1451. None,
  1452. None,
  1453. None,
  1454. ),
  1455. UserAgentParser(
  1456. '(OLPC)/Update()\\.(\\d+)',
  1457. None,
  1458. '0',
  1459. None,
  1460. ),
  1461. UserAgentParser(
  1462. '(SEMC\\-Browser)/(\\d+)\\.(\\d+)',
  1463. None,
  1464. None,
  1465. None,
  1466. ),
  1467. UserAgentParser(
  1468. '(Teleca)',
  1469. 'Teleca Browser',
  1470. None,
  1471. None,
  1472. ),
  1473. UserAgentParser(
  1474. '(Phantom)/V(\\d+)\\.(\\d+)',
  1475. 'Phantom Browser',
  1476. None,
  1477. None,
  1478. ),
  1479. UserAgentParser(
  1480. '(Trident)/(7|8)\\.(0)',
  1481. 'IE',
  1482. '11',
  1483. None,
  1484. ),
  1485. UserAgentParser(
  1486. '(Trident)/(6)\\.(0)',
  1487. 'IE',
  1488. '10',
  1489. None,
  1490. ),
  1491. UserAgentParser(
  1492. '(Trident)/(5)\\.(0)',
  1493. 'IE',
  1494. '9',
  1495. None,
  1496. ),
  1497. UserAgentParser(
  1498. '(Trident)/(4)\\.(0)',
  1499. 'IE',
  1500. '8',
  1501. None,
  1502. ),
  1503. UserAgentParser(
  1504. '(Espial)/(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?',
  1505. None,
  1506. None,
  1507. None,
  1508. ),
  1509. UserAgentParser(
  1510. '(AppleWebKit)/(\\d+)\\.(\\d+)\\.(\\d+)',
  1511. 'Apple Mail',
  1512. None,
  1513. None,
  1514. ),
  1515. UserAgentParser(
  1516. '(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+)',
  1517. None,
  1518. None,
  1519. None,
  1520. ),
  1521. UserAgentParser(
  1522. '(Firefox)/(\\d+)\\.(\\d+)(pre|[ab]\\d+[a-z]*)?',
  1523. None,
  1524. None,
  1525. None,
  1526. ),
  1527. UserAgentParser(
  1528. '([MS]?IE) (\\d+)\\.(\\d+)',
  1529. 'IE',
  1530. None,
  1531. None,
  1532. ),
  1533. UserAgentParser(
  1534. '(python-requests)/(\\d+)\\.(\\d+)',
  1535. 'Python Requests',
  1536. None,
  1537. None,
  1538. ),
  1539. UserAgentParser(
  1540. '\\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+))?)?)?',
  1541. None,
  1542. None,
  1543. None,
  1544. ),
  1545. UserAgentParser(
  1546. '(Java)[/ ]{0,1}\\d+\\.(\\d+)\\.(\\d+)[_-]*([a-zA-Z0-9]+)*',
  1547. None,
  1548. None,
  1549. None,
  1550. ),
  1551. UserAgentParser(
  1552. '^(Roku)/DVP-(\\d+)\\.(\\d+)',
  1553. None,
  1554. None,
  1555. None,
  1556. ),
  1557. UserAgentParser(
  1558. '(Kurio)\\/(\\d+)\\.(\\d+)\\.(\\d+)',
  1559. 'Kurio App',
  1560. None,
  1561. None,
  1562. ),
  1563. UserAgentParser(
  1564. '^(Box(?: Sync)?)/(\\d+)\\.(\\d+)\\.(\\d+)',
  1565. None,
  1566. None,
  1567. None,
  1568. ),
  1569. ]
  1570. DEVICE_PARSERS = [
  1571. DeviceParser(
  1572. '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\\d|(?:bot|spider)\\.html)|AdsBot-Google-Mobile.*iPhone)',
  1573. 'i',
  1574. 'Spider',
  1575. 'Spider',
  1576. 'Smartphone',
  1577. ),
  1578. DeviceParser(
  1579. '(?:DoCoMo|\\bMOT\\b|\\bLG\\b|Nokia|Samsung|SonyEricsson).*(?:(?:Bot|Yeti)-Mobile|bots?/\\d|(?:bot|crawler)\\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)',
  1580. 'i',
  1581. 'Spider',
  1582. 'Spider',
  1583. 'Feature Phone',
  1584. ),
  1585. DeviceParser(
  1586. '\\bSmartWatch *\\( *([^;]+) *; *([^;]+) *;',
  1587. None,
  1588. '$1 $2',
  1589. '$1',
  1590. '$2',
  1591. ),
  1592. DeviceParser(
  1593. 'Android Application[^\\-]+ - (Sony) ?(Ericsson)? (.+) \\w+ - ',
  1594. None,
  1595. '$1 $2',
  1596. '$1$2',
  1597. '$3',
  1598. ),
  1599. DeviceParser(
  1600. 'Android Application[^\\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\\-](.+) \\w+ - ',
  1601. 'i',
  1602. '$1 $2',
  1603. '$1',
  1604. '$2',
  1605. ),
  1606. DeviceParser(
  1607. 'Android Application[^\\-]+ - ([^ ]+) (.+) \\w+ - ',
  1608. None,
  1609. '$1 $2',
  1610. '$1',
  1611. '$2',
  1612. ),
  1613. DeviceParser(
  1614. '; *([BLRQ]C\\d{4}[A-Z]+) +Build/',
  1615. None,
  1616. '3Q $1',
  1617. '3Q',
  1618. '$1',
  1619. ),
  1620. DeviceParser(
  1621. '; *(?:3Q_)([^;/]+) +Build',
  1622. None,
  1623. '3Q $1',
  1624. '3Q',
  1625. '$1',
  1626. ),
  1627. DeviceParser(
  1628. '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',
  1629. None,
  1630. '$1',
  1631. 'Acer',
  1632. '$1',
  1633. ),
  1634. DeviceParser(
  1635. '; *Acer Iconia Tab ([^;/]+) Build',
  1636. None,
  1637. '$1',
  1638. 'Acer',
  1639. '$1',
  1640. ),
  1641. DeviceParser(
  1642. '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\\d+) Build',
  1643. None,
  1644. '$1',
  1645. 'Acer',
  1646. '$1',
  1647. ),
  1648. DeviceParser(
  1649. '; *(Acer |ACER )([^;/]+) Build',
  1650. None,
  1651. '$1$2',
  1652. 'Acer',
  1653. '$2',
  1654. ),
  1655. DeviceParser(
  1656. '; *(Advent )?(Vega(?:Bean|Comb)?).* Build',
  1657. None,
  1658. '$1$2',
  1659. 'Advent',
  1660. '$2',
  1661. ),
  1662. DeviceParser(
  1663. '; *(Ainol )?((?:NOVO|[Nn]ovo)[^;/]+) Build',
  1664. None,
  1665. '$1$2',
  1666. 'Ainol',
  1667. '$2',
  1668. ),
  1669. DeviceParser(
  1670. '; *AIRIS[ _\\-]?([^/;\\)]+) *(?:;|\\)|Build)',
  1671. 'i',
  1672. '$1',
  1673. 'Airis',
  1674. '$1',
  1675. ),
  1676. DeviceParser(
  1677. '; *(OnePAD[^;/]+) Build',
  1678. 'i',
  1679. '$1',
  1680. 'Airis',
  1681. '$1',
  1682. ),
  1683. DeviceParser(
  1684. '; *Airpad[ \\-]([^;/]+) Build',
  1685. None,
  1686. 'Airpad $1',
  1687. 'Airpad',
  1688. '$1',
  1689. ),
  1690. DeviceParser(
  1691. '; *(one ?touch) (EVO7|T10|T20) Build',
  1692. None,
  1693. 'Alcatel One Touch $2',
  1694. 'Alcatel',
  1695. 'One Touch $2',
  1696. ),
  1697. DeviceParser(
  1698. '; *(?:alcatel[ _])?(?:(?:one[ _]?touch[ _])|ot[ \\-])([^;/]+);? Build',
  1699. 'i',
  1700. 'Alcatel One Touch $1',
  1701. 'Alcatel',
  1702. 'One Touch $1',
  1703. ),
  1704. DeviceParser(
  1705. '; *(TCL)[ _]([^;/]+) Build',
  1706. None,
  1707. '$1 $2',
  1708. '$1',
  1709. '$2',
  1710. ),
  1711. DeviceParser(
  1712. '; *(Vodafone Smart II|Optimus_Madrid) Build',
  1713. None,
  1714. 'Alcatel $1',
  1715. 'Alcatel',
  1716. '$1',
  1717. ),
  1718. DeviceParser(
  1719. '; *BASE_Lutea_3 Build',
  1720. None,
  1721. 'Alcatel One Touch 998',
  1722. 'Alcatel',
  1723. 'One Touch 998',
  1724. ),
  1725. DeviceParser(
  1726. '; *BASE_Varia Build',
  1727. None,
  1728. 'Alcatel One Touch 918D',
  1729. 'Alcatel',
  1730. 'One Touch 918D',
  1731. ),
  1732. DeviceParser(
  1733. '; *((?:FINE|Fine)\\d[^;/]+) Build',
  1734. None,
  1735. '$1',
  1736. 'Allfine',
  1737. '$1',
  1738. ),
  1739. DeviceParser(
  1740. '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*) Build/',
  1741. None,
  1742. '$1$2',
  1743. 'Allview',
  1744. '$2',
  1745. ),
  1746. DeviceParser(
  1747. '; *(ALLVIEW[ _]?|Allview[ _]?)?(AX1_Shine|AX2_Frenzy) Build',
  1748. None,
  1749. '$1$2',
  1750. 'Allview',
  1751. '$2',
  1752. ),
  1753. DeviceParser(
  1754. '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*) Build',
  1755. None,
  1756. '$1$2',
  1757. 'Allview',
  1758. '$2',
  1759. ),
  1760. DeviceParser(
  1761. '; *(A13-MID) Build',
  1762. None,
  1763. '$1',
  1764. 'Allwinner',
  1765. '$1',
  1766. ),
  1767. DeviceParser(
  1768. '; *(Allwinner)[ _\\-]?([^;/]+) Build',
  1769. None,
  1770. '$1 $2',
  1771. 'Allwinner',
  1772. '$1',
  1773. ),
  1774. DeviceParser(
  1775. '; *(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',
  1776. None,
  1777. '$1',
  1778. 'Amaway',
  1779. '$1',
  1780. ),
  1781. DeviceParser(
  1782. '; *(?:AMOI|Amoi)[ _]([^;/]+) Build',
  1783. None,
  1784. 'Amoi $1',
  1785. 'Amoi',
  1786. '$1',
  1787. ),
  1788. DeviceParser(
  1789. '^(?:AMOI|Amoi)[ _]([^;/]+) Linux',
  1790. None,
  1791. 'Amoi $1',
  1792. 'Amoi',
  1793. '$1',
  1794. ),
  1795. DeviceParser(
  1796. '; *(MW(?:0[789]|10)[^;/]+) Build',
  1797. None,
  1798. '$1',
  1799. 'Aoc',
  1800. '$1',
  1801. ),
  1802. DeviceParser(
  1803. '; *(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',
  1804. None,
  1805. 'Aoson $1',
  1806. 'Aoson',
  1807. '$1',
  1808. ),
  1809. DeviceParser(
  1810. '; *Aoson ([^;/]+) Build',
  1811. 'i',
  1812. 'Aoson $1',
  1813. 'Aoson',
  1814. '$1',
  1815. ),
  1816. DeviceParser(
  1817. '; *[Aa]panda[ _\\-]([^;/]+) Build',
  1818. None,
  1819. 'Apanda $1',
  1820. 'Apanda',
  1821. '$1',
  1822. ),
  1823. DeviceParser(
  1824. '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|[;/\\(\\)\\-])',
  1825. None,
  1826. 'Archos $1',
  1827. 'Archos',
  1828. '$1',
  1829. ),
  1830. DeviceParser(
  1831. 'ARCHOS; GOGI; ([^;]+);',
  1832. None,
  1833. 'Archos $1',
  1834. 'Archos',
  1835. '$1',
  1836. ),
  1837. DeviceParser(
  1838. '(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\\(\\)\\-]|$)',
  1839. None,
  1840. 'Archos $1',
  1841. 'Archos',
  1842. '$1',
  1843. ),
  1844. DeviceParser(
  1845. '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4}) Build',
  1846. None,
  1847. 'Archos $1',
  1848. 'Archos',
  1849. '$1',
  1850. ),
  1851. DeviceParser(
  1852. '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9) Build',
  1853. None,
  1854. 'Archos $1',
  1855. 'Archos',
  1856. '$1',
  1857. ),
  1858. DeviceParser(
  1859. '; *(PAD-FMD[^;/]+) Build',
  1860. None,
  1861. '$1',
  1862. 'Arival',
  1863. '$1',
  1864. ),
  1865. DeviceParser(
  1866. '; *(BioniQ) ?([^;/]+) Build',
  1867. None,
  1868. '$1 $2',
  1869. 'Arival',
  1870. '$1 $2',
  1871. ),
  1872. DeviceParser(
  1873. '; *(AN\\d[^;/]+|ARCHM\\d+) Build',
  1874. None,
  1875. 'Arnova $1',
  1876. 'Arnova',
  1877. '$1',
  1878. ),
  1879. DeviceParser(
  1880. '; *(?:ARNOVA|Arnova) ?([^;/]+) Build',
  1881. None,
  1882. 'Arnova $1',
  1883. 'Arnova',
  1884. '$1',
  1885. ),
  1886. DeviceParser(
  1887. '; *(?:ASSISTANT )?(AP)-?([1789]\\d{2}[A-Z]{0,2}|80104) Build',
  1888. None,
  1889. 'Assistant $1-$2',
  1890. 'Assistant',
  1891. '$1-$2',
  1892. ),
  1893. DeviceParser(
  1894. '; *(ME17\\d[^;/]*|ME3\\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013)?|PadFone[^;/]*|Transformer[^;/]*|TF\\d{3}[^;/]*|eeepc) Build',
  1895. None,
  1896. 'Asus $1',
  1897. 'Asus',
  1898. '$1',
  1899. ),
  1900. DeviceParser(
  1901. '; *ASUS[ _]*([^;/]+) Build',
  1902. None,
  1903. 'Asus $1',
  1904. 'Asus',
  1905. '$1',
  1906. ),
  1907. DeviceParser(
  1908. '; *Garmin-Asus ([^;/]+) Build',
  1909. None,
  1910. 'Garmin-Asus $1',
  1911. 'Garmin-Asus',
  1912. '$1',
  1913. ),
  1914. DeviceParser(
  1915. '; *(Garminfone) Build',
  1916. None,
  1917. 'Garmin $1',
  1918. 'Garmin-Asus',
  1919. '$1',
  1920. ),
  1921. DeviceParser(
  1922. '; (@TAB-[^;/]+) Build',
  1923. None,
  1924. '$1',
  1925. 'Attab',
  1926. '$1',
  1927. ),
  1928. DeviceParser(
  1929. '; *(T-(?:07|[^0]\\d)[^;/]+) Build',
  1930. None,
  1931. '$1',
  1932. 'Audiosonic',
  1933. '$1',
  1934. ),
  1935. DeviceParser(
  1936. '; *(?:Axioo[ _\\-]([^;/]+)|(picopad)[ _\\-]([^;/]+)) Build',
  1937. 'i',
  1938. 'Axioo $1$2 $3',
  1939. 'Axioo',
  1940. '$1$2 $3',
  1941. ),
  1942. DeviceParser(
  1943. '; *(V(?:100|700|800)[^;/]*) Build',
  1944. None,
  1945. '$1',
  1946. 'Azend',
  1947. '$1',
  1948. ),
  1949. DeviceParser(
  1950. '; *(IBAK\\-[^;/]*) Build',
  1951. 'i',
  1952. '$1',
  1953. 'Bak',
  1954. '$1',
  1955. ),
  1956. DeviceParser(
  1957. '; *(HY5001|HY6501|X12|X21|I5) Build',
  1958. None,
  1959. 'Bedove $1',
  1960. 'Bedove',
  1961. '$1',
  1962. ),
  1963. DeviceParser(
  1964. '; *(JC-[^;/]*) Build',
  1965. None,
  1966. 'Benss $1',
  1967. 'Benss',
  1968. '$1',
  1969. ),
  1970. DeviceParser(
  1971. '; *(BB) ([^;/]+) Build',
  1972. None,
  1973. '$1 $2',
  1974. 'Blackberry',
  1975. '$2',
  1976. ),
  1977. DeviceParser(
  1978. '; *(BlackBird)[ _](I8.*) Build',
  1979. None,
  1980. '$1 $2',
  1981. '$1',
  1982. '$2',
  1983. ),
  1984. DeviceParser(
  1985. '; *(BlackBird)[ _](.*) Build',
  1986. None,
  1987. '$1 $2',
  1988. '$1',
  1989. '$2',
  1990. ),
  1991. DeviceParser(
  1992. '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+) Build',
  1993. None,
  1994. 'Blaupunkt $1',
  1995. 'Blaupunkt',
  1996. '$1',
  1997. ),
  1998. DeviceParser(
  1999. '; *((?:BLU|Blu)[ _\\-])([^;/]+) Build',
  2000. None,
  2001. '$1$2',
  2002. 'Blu',
  2003. '$2',
  2004. ),
  2005. DeviceParser(
  2006. '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\\.3|TANK 4\\.5) Build',
  2007. None,
  2008. '$1',
  2009. 'Blu',
  2010. '$1',
  2011. ),
  2012. DeviceParser(
  2013. '; *(TOUCH\\d[^;/]+) Build',
  2014. None,
  2015. '$1',
  2016. 'Blusens',
  2017. '$1',
  2018. ),
  2019. DeviceParser(
  2020. '; *(AX5\\d+) Build',
  2021. None,
  2022. '$1',
  2023. 'Bmobile',
  2024. '$1',
  2025. ),
  2026. DeviceParser(
  2027. '; *([Bb]q) ([^;/]+);? Build',
  2028. None,
  2029. '$1 $2',
  2030. 'bq',
  2031. '$2',
  2032. ),
  2033. DeviceParser(
  2034. '; *(Maxwell [^;/]+) Build',
  2035. None,
  2036. '$1',
  2037. 'bq',
  2038. '$1',
  2039. ),
  2040. DeviceParser(
  2041. '; *((?:B-Tab|B-TAB) ?\\d[^;/]+) Build',
  2042. None,
  2043. '$1',
  2044. 'Braun',
  2045. '$1',
  2046. ),
  2047. DeviceParser(
  2048. '; *(Broncho) ([^;/]+) Build',
  2049. None,
  2050. '$1 $2',
  2051. '$1',
  2052. '$2',
  2053. ),
  2054. DeviceParser(
  2055. '; *CAPTIVA ([^;/]+) Build',
  2056. None,
  2057. 'Captiva $1',
  2058. 'Captiva',
  2059. '$1',
  2060. ),
  2061. DeviceParser(
  2062. '; *(C771|CAL21|IS11CA) Build',
  2063. None,
  2064. '$1',
  2065. 'Casio',
  2066. '$1',
  2067. ),
  2068. DeviceParser(
  2069. '; *(?:Cat|CAT) ([^;/]+) Build',
  2070. None,
  2071. 'Cat $1',
  2072. 'Cat',
  2073. '$1',
  2074. ),
  2075. DeviceParser(
  2076. '; *(?:Cat)(Nova.*) Build',
  2077. None,
  2078. 'Cat $1',
  2079. 'Cat',
  2080. '$1',
  2081. ),
  2082. DeviceParser(
  2083. '; *(INM8002KP|ADM8000KP_[AB]) Build',
  2084. None,
  2085. '$1',
  2086. 'Cat',
  2087. 'Tablet PHOENIX 8.1J0',
  2088. ),
  2089. DeviceParser(
  2090. '; *(?:[Cc]elkon[ _\\*]|CELKON[ _\\*])([^;/\\)]+) ?(?:Build|;|\\))',
  2091. None,
  2092. '$1',
  2093. 'Celkon',
  2094. '$1',
  2095. ),
  2096. DeviceParser(
  2097. 'Build/(?:[Cc]elkon)+_?([^;/_\\)]+)',
  2098. None,
  2099. '$1',
  2100. 'Celkon',
  2101. '$1',
  2102. ),
  2103. DeviceParser(
  2104. '; *(CT)-?(\\d+) Build',
  2105. None,
  2106. '$1$2',
  2107. 'Celkon',
  2108. '$1$2',
  2109. ),
  2110. DeviceParser(
  2111. '; *(A19|A19Q|A105|A107[^;/\\)]*) ?(?:Build|;|\\))',
  2112. None,
  2113. '$1',
  2114. 'Celkon',
  2115. '$1',
  2116. ),
  2117. DeviceParser(
  2118. '; *(TPC[0-9]{4,5}) Build',
  2119. None,
  2120. '$1',
  2121. 'ChangJia',
  2122. '$1',
  2123. ),
  2124. DeviceParser(
  2125. '; *(Cloudfone)[ _](Excite)([^ ][^;/]+) Build',
  2126. None,
  2127. '$1 $2 $3',
  2128. 'Cloudfone',
  2129. '$1 $2 $3',
  2130. ),
  2131. DeviceParser(
  2132. '; *(Excite|ICE)[ _](\\d+[^;/]+) Build',
  2133. None,
  2134. 'Cloudfone $1 $2',
  2135. 'Cloudfone',
  2136. 'Cloudfone $1 $2',
  2137. ),
  2138. DeviceParser(
  2139. '; *(Cloudfone|CloudPad)[ _]([^;/]+) Build',
  2140. None,
  2141. '$1 $2',
  2142. 'Cloudfone',
  2143. '$1 $2',
  2144. ),
  2145. DeviceParser(
  2146. '; *((?:Aquila|Clanga|Rapax)[^;/]+) Build',
  2147. 'i',
  2148. '$1',
  2149. 'Cmx',
  2150. '$1',
  2151. ),
  2152. DeviceParser(
  2153. '; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\\(3G\\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\\)])',
  2154. None,
  2155. 'CobyKyros $1$2',
  2156. 'CobyKyros',
  2157. '$1$2',
  2158. ),
  2159. DeviceParser(
  2160. '; *([^;/]*)Coolpad[ _]([^;/]+) Build',
  2161. None,
  2162. '$1$2',
  2163. 'Coolpad',
  2164. '$1$2',
  2165. ),
  2166. DeviceParser(
  2167. '; *(CUBE[ _])?([KU][0-9]+ ?GT.*|A5300) Build',
  2168. 'i',
  2169. '$1$2',
  2170. 'Cube',
  2171. '$2',
  2172. ),
  2173. DeviceParser(
  2174. '; *CUBOT ([^;/]+) Build',
  2175. 'i',
  2176. '$1',
  2177. 'Cubot',
  2178. '$1',
  2179. ),
  2180. DeviceParser(
  2181. '; *(BOBBY) Build',
  2182. 'i',
  2183. '$1',
  2184. 'Cubot',
  2185. '$1',
  2186. ),
  2187. DeviceParser(
  2188. '; *(Dslide [^;/]+) Build',
  2189. None,
  2190. '$1',
  2191. 'Danew',
  2192. '$1',
  2193. ),
  2194. DeviceParser(
  2195. '; *(XCD)[ _]?(28|35) Build',
  2196. None,
  2197. 'Dell $1$2',
  2198. 'Dell',
  2199. '$1$2',
  2200. ),
  2201. DeviceParser(
  2202. '; *(001DL) Build',
  2203. None,
  2204. 'Dell $1',
  2205. 'Dell',
  2206. 'Streak',
  2207. ),
  2208. DeviceParser(
  2209. '; *(?:Dell|DELL) (Streak) Build',
  2210. None,
  2211. 'Dell $1',
  2212. 'Dell',
  2213. 'Streak',
  2214. ),
  2215. DeviceParser(
  2216. '; *(101DL|GS01|Streak Pro[^;/]*) Build',
  2217. None,
  2218. 'Dell $1',
  2219. 'Dell',
  2220. 'Streak Pro',
  2221. ),
  2222. DeviceParser(
  2223. '; *([Ss]treak ?7) Build',
  2224. None,
  2225. 'Dell $1',
  2226. 'Dell',
  2227. 'Streak 7',
  2228. ),
  2229. DeviceParser(
  2230. '; *(Mini-3iX) Build',
  2231. None,
  2232. 'Dell $1',
  2233. 'Dell',
  2234. '$1',
  2235. ),
  2236. DeviceParser(
  2237. '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*|Streak[ _]Pro) Build',
  2238. None,
  2239. 'Dell $1',
  2240. 'Dell',
  2241. '$1',
  2242. ),
  2243. DeviceParser(
  2244. '; *Dell[ _]([^;/]+) Build',
  2245. None,
  2246. 'Dell $1',
  2247. 'Dell',
  2248. '$1',
  2249. ),
  2250. DeviceParser(
  2251. '; *Dell ([^;/]+) Build',
  2252. None,
  2253. 'Dell $1',
  2254. 'Dell',
  2255. '$1',
  2256. ),
  2257. DeviceParser(
  2258. '; *(TA[CD]-\\d+[^;/]*) Build',
  2259. None,
  2260. '$1',
  2261. 'Denver',
  2262. '$1',
  2263. ),
  2264. DeviceParser(
  2265. '; *(iP[789]\\d{2}(?:-3G)?|IP10\\d{2}(?:-8GB)?) Build',
  2266. None,
  2267. '$1',
  2268. 'Dex',
  2269. '$1',
  2270. ),
  2271. DeviceParser(
  2272. '; *(AirTab)[ _\\-]([^;/]+) Build',
  2273. None,
  2274. '$1 $2',
  2275. 'DNS',
  2276. '$1 $2',
  2277. ),
  2278. DeviceParser(
  2279. '; *(F\\-\\d[^;/]+) Build',
  2280. None,
  2281. '$1',
  2282. 'Fujitsu',
  2283. '$1',
  2284. ),
  2285. DeviceParser(
  2286. '; *(HT-03A) Build',
  2287. None,
  2288. '$1',
  2289. 'HTC',
  2290. 'Magic',
  2291. ),
  2292. DeviceParser(
  2293. '; *(HT\\-\\d[^;/]+) Build',
  2294. None,
  2295. '$1',
  2296. 'HTC',
  2297. '$1',
  2298. ),
  2299. DeviceParser(
  2300. '; *(L\\-\\d[^;/]+) Build',
  2301. None,
  2302. '$1',
  2303. 'LG',
  2304. '$1',
  2305. ),
  2306. DeviceParser(
  2307. '; *(N\\-\\d[^;/]+) Build',
  2308. None,
  2309. '$1',
  2310. 'Nec',
  2311. '$1',
  2312. ),
  2313. DeviceParser(
  2314. '; *(P\\-\\d[^;/]+) Build',
  2315. None,
  2316. '$1',
  2317. 'Panasonic',
  2318. '$1',
  2319. ),
  2320. DeviceParser(
  2321. '; *(SC\\-\\d[^;/]+) Build',
  2322. None,
  2323. '$1',
  2324. 'Samsung',
  2325. '$1',
  2326. ),
  2327. DeviceParser(
  2328. '; *(SH\\-\\d[^;/]+) Build',
  2329. None,
  2330. '$1',
  2331. 'Sharp',
  2332. '$1',
  2333. ),
  2334. DeviceParser(
  2335. '; *(SO\\-\\d[^;/]+) Build',
  2336. None,
  2337. '$1',
  2338. 'SonyEricsson',
  2339. '$1',
  2340. ),
  2341. DeviceParser(
  2342. '; *(T\\-0[12][^;/]+) Build',
  2343. None,
  2344. '$1',
  2345. 'Toshiba',
  2346. '$1',
  2347. ),
  2348. DeviceParser(
  2349. '; *(DOOV)[ _]([^;/]+) Build',
  2350. None,
  2351. '$1 $2',
  2352. 'DOOV',
  2353. '$2',
  2354. ),
  2355. DeviceParser(
  2356. '; *(Enot|ENOT)[ -]?([^;/]+) Build',
  2357. None,
  2358. '$1 $2',
  2359. 'Enot',
  2360. '$2',
  2361. ),
  2362. DeviceParser(
  2363. '; *[^;/]+ Build/(?:CROSS|Cross)+[ _\\-]([^\\)]+)',
  2364. None,
  2365. 'CROSS $1',
  2366. 'Evercoss',
  2367. 'Cross $1',
  2368. ),
  2369. DeviceParser(
  2370. '; *(CROSS|Cross)[ _\\-]([^;/]+) Build',
  2371. None,
  2372. '$1 $2',
  2373. 'Evercoss',
  2374. 'Cross $2',
  2375. ),
  2376. DeviceParser(
  2377. '; *Explay[_ ](.+?)(?:[\\)]| Build)',
  2378. None,
  2379. '$1',
  2380. 'Explay',
  2381. '$1',
  2382. ),
  2383. DeviceParser(
  2384. '; *(IQ.*) Build',
  2385. None,
  2386. '$1',
  2387. 'Fly',
  2388. '$1',
  2389. ),
  2390. DeviceParser(
  2391. '; *(Fly|FLY)[ _](IQ[^;]+|F[34]\\d+[^;]*);? Build',
  2392. None,
  2393. '$1 $2',
  2394. 'Fly',
  2395. '$2',
  2396. ),
  2397. DeviceParser(
  2398. '; *(M532|Q572|FJL21) Build/',
  2399. None,
  2400. '$1',
  2401. 'Fujitsu',
  2402. '$1',
  2403. ),
  2404. DeviceParser(
  2405. '; *(G1) Build',
  2406. None,
  2407. '$1',
  2408. 'Galapad',
  2409. '$1',
  2410. ),
  2411. DeviceParser(
  2412. '; *(Geeksphone) ([^;/]+) Build',
  2413. None,
  2414. '$1 $2',
  2415. '$1',
  2416. '$2',
  2417. ),
  2418. DeviceParser(
  2419. '; *(G[^F]?FIVE) ([^;/]+) Build',
  2420. None,
  2421. '$1 $2',
  2422. 'Gfive',
  2423. '$2',
  2424. ),
  2425. DeviceParser(
  2426. '; *(Gionee)[ _\\-]([^;/]+)(?:/[^;/]+)? Build',
  2427. 'i',
  2428. '$1 $2',
  2429. 'Gionee',
  2430. '$2',
  2431. ),
  2432. DeviceParser(
  2433. '; *(GN\\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1) Build',
  2434. None,
  2435. 'Gionee $1',
  2436. 'Gionee',
  2437. '$1',
  2438. ),
  2439. DeviceParser(
  2440. '; *(E3) Build/JOP40D',
  2441. None,
  2442. 'Gionee $1',
  2443. 'Gionee',
  2444. '$1',
  2445. ),
  2446. DeviceParser(
  2447. '\\sGIONEE[-\\s_](\\w*)',
  2448. 'i',
  2449. 'Gionee $1',
  2450. 'Gionee',
  2451. '$1',
  2452. ),
  2453. DeviceParser(
  2454. '; *((?:FONE|QUANTUM|INSIGNIA) \\d+[^;/]*|PLAYTAB) Build',
  2455. None,
  2456. 'GoClever $1',
  2457. 'GoClever',
  2458. '$1',
  2459. ),
  2460. DeviceParser(
  2461. '; *GOCLEVER ([^;/]+) Build',
  2462. None,
  2463. 'GoClever $1',
  2464. 'GoClever',
  2465. '$1',
  2466. ),
  2467. DeviceParser(
  2468. '; *(Glass \\d+) Build',
  2469. None,
  2470. '$1',
  2471. 'Google',
  2472. '$1',
  2473. ),
  2474. DeviceParser(
  2475. '; *(Pixel \\w+) Build',
  2476. None,
  2477. '$1',
  2478. 'Google',
  2479. '$1',
  2480. ),
  2481. DeviceParser(
  2482. '; *(GSmart)[ -]([^/]+) Build',
  2483. None,
  2484. '$1 $2',
  2485. 'Gigabyte',
  2486. '$1 $2',
  2487. ),
  2488. DeviceParser(
  2489. '; *(imx5[13]_[^/]+) Build',
  2490. None,
  2491. 'Freescale $1',
  2492. 'Freescale',
  2493. '$1',
  2494. ),
  2495. DeviceParser(
  2496. '; *Haier[ _\\-]([^/]+) Build',
  2497. None,
  2498. 'Haier $1',
  2499. 'Haier',
  2500. '$1',
  2501. ),
  2502. DeviceParser(
  2503. '; *(PAD1016) Build',
  2504. None,
  2505. 'Haipad $1',
  2506. 'Haipad',
  2507. '$1',
  2508. ),
  2509. DeviceParser(
  2510. '; *(M701|M7|M8|M9) Build',
  2511. None,
  2512. 'Haipad $1',
  2513. 'Haipad',
  2514. '$1',
  2515. ),
  2516. DeviceParser(
  2517. '; *(SN\\d+T[^;\\)/]*)(?: Build|[;\\)])',
  2518. None,
  2519. 'Hannspree $1',
  2520. 'Hannspree',
  2521. '$1',
  2522. ),
  2523. DeviceParser(
  2524. 'Build/HCL ME Tablet ([^;\\)]+)[\\);]',
  2525. None,
  2526. 'HCLme $1',
  2527. 'HCLme',
  2528. '$1',
  2529. ),
  2530. DeviceParser(
  2531. '; *([^;\\/]+) Build/HCL',
  2532. None,
  2533. 'HCLme $1',
  2534. 'HCLme',
  2535. '$1',
  2536. ),
  2537. DeviceParser(
  2538. '; *(MID-?\\d{4}C[EM]) Build',
  2539. None,
  2540. 'Hena $1',
  2541. 'Hena',
  2542. '$1',
  2543. ),
  2544. DeviceParser(
  2545. '; *(EG\\d{2,}|HS-[^;/]+|MIRA[^;/]+) Build',
  2546. None,
  2547. 'Hisense $1',
  2548. 'Hisense',
  2549. '$1',
  2550. ),
  2551. DeviceParser(
  2552. '; *(andromax[^;/]+) Build',
  2553. 'i',
  2554. 'Hisense $1',
  2555. 'Hisense',
  2556. '$1',
  2557. ),
  2558. DeviceParser(
  2559. '; *(?:AMAZE[ _](S\\d+)|(S\\d+)[ _]AMAZE) Build',
  2560. None,
  2561. 'AMAZE $1$2',
  2562. 'hitech',
  2563. 'AMAZE $1$2',
  2564. ),
  2565. DeviceParser(
  2566. '; *(PlayBook) Build',
  2567. None,
  2568. 'HP $1',
  2569. 'HP',
  2570. '$1',
  2571. ),
  2572. DeviceParser(
  2573. '; *HP ([^/]+) Build',
  2574. None,
  2575. 'HP $1',
  2576. 'HP',
  2577. '$1',
  2578. ),
  2579. DeviceParser(
  2580. '; *([^/]+_tenderloin) Build',
  2581. None,
  2582. 'HP TouchPad',
  2583. 'HP',
  2584. 'TouchPad',
  2585. ),
  2586. DeviceParser(
  2587. '; *(HUAWEI |Huawei-)?([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\\);]+)\\)',
  2588. None,
  2589. '$1$2',
  2590. 'Huawei',
  2591. '$2',
  2592. ),
  2593. DeviceParser(
  2594. '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\\d+[^\\);]+)[^\\);]*\\)',
  2595. None,
  2596. '$1',
  2597. 'Huawei',
  2598. '$2',
  2599. ),
  2600. DeviceParser(
  2601. '; *(S7|M860) Build',
  2602. None,
  2603. '$1',
  2604. 'Huawei',
  2605. '$1',
  2606. ),
  2607. DeviceParser(
  2608. '; *((?:HUAWEI|Huawei)[ \\-]?)(MediaPad) Build',
  2609. None,
  2610. '$1$2',
  2611. 'Huawei',
  2612. '$2',
  2613. ),
  2614. DeviceParser(
  2615. '; *((?:HUAWEI[ _]?|Huawei[ _])?Ascend[ _])([^;/]+) Build',
  2616. None,
  2617. '$1$2',
  2618. 'Huawei',
  2619. '$2',
  2620. ),
  2621. DeviceParser(
  2622. '; *((?:HUAWEI|Huawei)[ _\\-]?)((?:G700-|MT-)[^;/]+) Build',
  2623. None,
  2624. '$1$2',
  2625. 'Huawei',
  2626. '$2',
  2627. ),
  2628. DeviceParser(
  2629. '; *((?:HUAWEI|Huawei)[ _\\-]?)([^;/]+) Build',
  2630. None,
  2631. '$1$2',
  2632. 'Huawei',
  2633. '$2',
  2634. ),
  2635. DeviceParser(
  2636. '; *(MediaPad[^;]+|SpringBoard) Build/Huawei',
  2637. None,
  2638. '$1',
  2639. 'Huawei',
  2640. '$1',
  2641. ),
  2642. DeviceParser(
  2643. '; *([^;]+) Build/(?:Huawei|HUAWEI)',
  2644. None,
  2645. '$1',
  2646. 'Huawei',
  2647. '$1',
  2648. ),
  2649. DeviceParser(
  2650. '; *([Uu])([89]\\d{3}) Build',
  2651. None,
  2652. '$1$2',
  2653. 'Huawei',
  2654. 'U$2',
  2655. ),
  2656. DeviceParser(
  2657. '; *(?:Ideos |IDEOS )(S7) Build',
  2658. None,
  2659. 'Huawei Ideos$1',
  2660. 'Huawei',
  2661. 'Ideos$1',
  2662. ),
  2663. DeviceParser(
  2664. '; *(?:Ideos |IDEOS )([^;/]+\\s*|\\s*)Build',
  2665. None,
  2666. 'Huawei Ideos$1',
  2667. 'Huawei',
  2668. 'Ideos$1',
  2669. ),
  2670. DeviceParser(
  2671. '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]',
  2672. None,
  2673. 'Huawei $1',
  2674. 'Huawei',
  2675. '$1',
  2676. ),
  2677. DeviceParser(
  2678. '; *HTC[ _]([^;]+); Windows Phone',
  2679. None,
  2680. 'HTC $1',
  2681. 'HTC',
  2682. '$1',
  2683. ),
  2684. DeviceParser(
  2685. '; *(?:HTC[ _/])+([^ _/]+)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))',
  2686. None,
  2687. 'HTC $1',
  2688. 'HTC',
  2689. '$1',
  2690. ),
  2691. DeviceParser(
  2692. '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+))?(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))',
  2693. None,
  2694. 'HTC $1 $2',
  2695. 'HTC',
  2696. '$1 $2',
  2697. ),
  2698. DeviceParser(
  2699. '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+))?)?(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))',
  2700. None,
  2701. 'HTC $1 $2 $3',
  2702. 'HTC',
  2703. '$1 $2 $3',
  2704. ),
  2705. DeviceParser(
  2706. '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+))?)?)?(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))',
  2707. None,
  2708. 'HTC $1 $2 $3 $4',
  2709. 'HTC',
  2710. '$1 $2 $3 $4',
  2711. ),
  2712. DeviceParser(
  2713. '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/;]+)(?: *Build|[;\\)]| - )',
  2714. None,
  2715. 'HTC $1',
  2716. 'HTC',
  2717. '$1',
  2718. ),
  2719. DeviceParser(
  2720. '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^ _/;\\)]+))?(?: *Build|[;\\)]| - )',
  2721. None,
  2722. 'HTC $1 $2',
  2723. 'HTC',
  2724. '$1 $2',
  2725. ),
  2726. DeviceParser(
  2727. '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\\)]+))?)?(?: *Build|[;\\)]| - )',
  2728. None,
  2729. 'HTC $1 $2 $3',
  2730. 'HTC',
  2731. '$1 $2 $3',
  2732. ),
  2733. DeviceParser(
  2734. '; *(?:(?:HTC|htc)(?:_blocked)*[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+))?)?)?(?: *Build|[;\\)]| - )',
  2735. None,
  2736. 'HTC $1 $2 $3 $4',
  2737. 'HTC',
  2738. '$1 $2 $3 $4',
  2739. ),
  2740. DeviceParser(
  2741. 'HTC Streaming Player [^\\/]*/[^\\/]*/ htc_([^/]+) /',
  2742. None,
  2743. 'HTC $1',
  2744. 'HTC',
  2745. '$1',
  2746. ),
  2747. DeviceParser(
  2748. '(?:[;,] *|^)(?:htccn_chs-)?HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\\(\\)]|$)',
  2749. 'i',
  2750. 'HTC $1',
  2751. 'HTC',
  2752. '$1',
  2753. ),
  2754. DeviceParser(
  2755. '; *(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|[/;\\(\\)])',
  2756. 'i',
  2757. 'HTC $1',
  2758. 'HTC',
  2759. '$1',
  2760. ),
  2761. DeviceParser(
  2762. '; *(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)',
  2763. 'i',
  2764. 'HTC $1 $2',
  2765. 'HTC',
  2766. '$1 $2',
  2767. ),
  2768. DeviceParser(
  2769. '; *HYUNDAI (T\\d[^/]*) Build',
  2770. None,
  2771. 'Hyundai $1',
  2772. 'Hyundai',
  2773. '$1',
  2774. ),
  2775. DeviceParser(
  2776. '; *HYUNDAI ([^;/]+) Build',
  2777. None,
  2778. 'Hyundai $1',
  2779. 'Hyundai',
  2780. '$1',
  2781. ),
  2782. DeviceParser(
  2783. '; *(X700|Hold X|MB-6900) Build',
  2784. None,
  2785. 'Hyundai $1',
  2786. 'Hyundai',
  2787. '$1',
  2788. ),
  2789. DeviceParser(
  2790. '; *(?:iBall[ _\\-])?(Andi)[ _]?(\\d[^;/]*) Build',
  2791. 'i',
  2792. '$1 $2',
  2793. 'iBall',
  2794. '$1 $2',
  2795. ),
  2796. DeviceParser(
  2797. '; *(IBall)(?:[ _]([^;/]+)|) Build',
  2798. 'i',
  2799. '$1 $2',
  2800. 'iBall',
  2801. '$2',
  2802. ),
  2803. DeviceParser(
  2804. '; *(NT-\\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+)? Build',
  2805. None,
  2806. '$1',
  2807. 'IconBIT',
  2808. '$1',
  2809. ),
  2810. DeviceParser(
  2811. '; *(IMO)[ _]([^;/]+) Build',
  2812. 'i',
  2813. '$1 $2',
  2814. 'IMO',
  2815. '$2',
  2816. ),
  2817. DeviceParser(
  2818. '; *i-?mobile[ _]([^/]+) Build/',
  2819. 'i',
  2820. 'i-mobile $1',
  2821. 'imobile',
  2822. '$1',
  2823. ),
  2824. DeviceParser(
  2825. '; *(i-(?:style|note)[^/]*) Build/',
  2826. 'i',
  2827. 'i-mobile $1',
  2828. 'imobile',
  2829. '$1',
  2830. ),
  2831. DeviceParser(
  2832. '; *(ImPAD) ?(\\d+(?:.)*) Build',
  2833. None,
  2834. '$1 $2',
  2835. 'Impression',
  2836. '$1 $2',
  2837. ),
  2838. DeviceParser(
  2839. '; *(Infinix)[ _]([^;/]+) Build',
  2840. None,
  2841. '$1 $2',
  2842. 'Infinix',
  2843. '$2',
  2844. ),
  2845. DeviceParser(
  2846. '; *(Informer)[ \\-]([^;/]+) Build',
  2847. None,
  2848. '$1 $2',
  2849. 'Informer',
  2850. '$2',
  2851. ),
  2852. DeviceParser(
  2853. '; *(TAB) ?([78][12]4) Build',
  2854. None,
  2855. 'Intenso $1',
  2856. 'Intenso',
  2857. '$1 $2',
  2858. ),
  2859. DeviceParser(
  2860. '; *(?:Intex[ _])?(AQUA|Aqua)([ _\\.\\-])([^;/]+) *(?:Build|;)',
  2861. None,
  2862. '$1$2$3',
  2863. 'Intex',
  2864. '$1 $3',
  2865. ),
  2866. DeviceParser(
  2867. '; *(?:INTEX|Intex)(?:[_ ]([^\\ _;/]+))(?:[_ ]([^\\ _;/]+))? *(?:Build|;)',
  2868. None,
  2869. '$1 $2',
  2870. 'Intex',
  2871. '$1 $2',
  2872. ),
  2873. DeviceParser(
  2874. '; *([iI]Buddy)[ _]?(Connect)(?:_|\\?_| )?([^;/]*) *(?:Build|;)',
  2875. None,
  2876. '$1 $2 $3',
  2877. 'Intex',
  2878. 'iBuddy $2 $3',
  2879. ),
  2880. DeviceParser(
  2881. '; *(I-Buddy)[ _]([^;/]+) *(?:Build|;)',
  2882. None,
  2883. '$1 $2',
  2884. 'Intex',
  2885. 'iBuddy $2',
  2886. ),
  2887. DeviceParser(
  2888. '; *(iOCEAN) ([^/]+) Build',
  2889. 'i',
  2890. '$1 $2',
  2891. 'iOCEAN',
  2892. '$2',
  2893. ),
  2894. DeviceParser(
  2895. '; *(TP\\d+(?:\\.\\d+)?\\-\\d[^;/]+) Build',
  2896. None,
  2897. 'ionik $1',
  2898. 'ionik',
  2899. '$1',
  2900. ),
  2901. DeviceParser(
  2902. '; *(M702pro) Build',
  2903. None,
  2904. '$1',
  2905. 'Iru',
  2906. '$1',
  2907. ),
  2908. DeviceParser(
  2909. '; *(DE88Plus|MD70) Build',
  2910. None,
  2911. '$1',
  2912. 'Ivio',
  2913. '$1',
  2914. ),
  2915. DeviceParser(
  2916. '; *IVIO[_\\-]([^;/]+) Build',
  2917. None,
  2918. '$1',
  2919. 'Ivio',
  2920. '$1',
  2921. ),
  2922. DeviceParser(
  2923. '; *(TPC-\\d+|JAY-TECH) Build',
  2924. None,
  2925. '$1',
  2926. 'Jaytech',
  2927. '$1',
  2928. ),
  2929. DeviceParser(
  2930. '; *(JY-[^;/]+|G[234]S?) Build',
  2931. None,
  2932. '$1',
  2933. 'Jiayu',
  2934. '$1',
  2935. ),
  2936. DeviceParser(
  2937. '; *(JXD)[ _\\-]([^;/]+) Build',
  2938. None,
  2939. '$1 $2',
  2940. 'JXD',
  2941. '$2',
  2942. ),
  2943. DeviceParser(
  2944. '; *Karbonn[ _]?([^;/]+) *(?:Build|;)',
  2945. 'i',
  2946. '$1',
  2947. 'Karbonn',
  2948. '$1',
  2949. ),
  2950. DeviceParser(
  2951. '; *([^;]+) Build/Karbonn',
  2952. None,
  2953. '$1',
  2954. 'Karbonn',
  2955. '$1',
  2956. ),
  2957. DeviceParser(
  2958. '; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\\d) +Build',
  2959. None,
  2960. '$1',
  2961. 'Karbonn',
  2962. '$1',
  2963. ),
  2964. DeviceParser(
  2965. '; *(IS01|IS03|IS05|IS\\d{2}SH) Build',
  2966. None,
  2967. '$1',
  2968. 'Sharp',
  2969. '$1',
  2970. ),
  2971. DeviceParser(
  2972. '; *(IS04) Build',
  2973. None,
  2974. '$1',
  2975. 'Regza',
  2976. '$1',
  2977. ),
  2978. DeviceParser(
  2979. '; *(IS06|IS\\d{2}PT) Build',
  2980. None,
  2981. '$1',
  2982. 'Pantech',
  2983. '$1',
  2984. ),
  2985. DeviceParser(
  2986. '; *(IS11S) Build',
  2987. None,
  2988. '$1',
  2989. 'SonyEricsson',
  2990. 'Xperia Acro',
  2991. ),
  2992. DeviceParser(
  2993. '; *(IS11CA) Build',
  2994. None,
  2995. '$1',
  2996. 'Casio',
  2997. 'GzOne $1',
  2998. ),
  2999. DeviceParser(
  3000. '; *(IS11LG) Build',
  3001. None,
  3002. '$1',
  3003. 'LG',
  3004. 'Optimus X',
  3005. ),
  3006. DeviceParser(
  3007. '; *(IS11N) Build',
  3008. None,
  3009. '$1',
  3010. 'Medias',
  3011. '$1',
  3012. ),
  3013. DeviceParser(
  3014. '; *(IS11PT) Build',
  3015. None,
  3016. '$1',
  3017. 'Pantech',
  3018. 'MIRACH',
  3019. ),
  3020. DeviceParser(
  3021. '; *(IS12F) Build',
  3022. None,
  3023. '$1',
  3024. 'Fujitsu',
  3025. 'Arrows ES',
  3026. ),
  3027. DeviceParser(
  3028. '; *(IS12M) Build',
  3029. None,
  3030. '$1',
  3031. 'Motorola',
  3032. 'XT909',
  3033. ),
  3034. DeviceParser(
  3035. '; *(IS12S) Build',
  3036. None,
  3037. '$1',
  3038. 'SonyEricsson',
  3039. 'Xperia Acro HD',
  3040. ),
  3041. DeviceParser(
  3042. '; *(ISW11F) Build',
  3043. None,
  3044. '$1',
  3045. 'Fujitsu',
  3046. 'Arrowz Z',
  3047. ),
  3048. DeviceParser(
  3049. '; *(ISW11HT) Build',
  3050. None,
  3051. '$1',
  3052. 'HTC',
  3053. 'EVO',
  3054. ),
  3055. DeviceParser(
  3056. '; *(ISW11K) Build',
  3057. None,
  3058. '$1',
  3059. 'Kyocera',
  3060. 'DIGNO',
  3061. ),
  3062. DeviceParser(
  3063. '; *(ISW11M) Build',
  3064. None,
  3065. '$1',
  3066. 'Motorola',
  3067. 'Photon',
  3068. ),
  3069. DeviceParser(
  3070. '; *(ISW11SC) Build',
  3071. None,
  3072. '$1',
  3073. 'Samsung',
  3074. 'GALAXY S II WiMAX',
  3075. ),
  3076. DeviceParser(
  3077. '; *(ISW12HT) Build',
  3078. None,
  3079. '$1',
  3080. 'HTC',
  3081. 'EVO 3D',
  3082. ),
  3083. DeviceParser(
  3084. '; *(ISW13HT) Build',
  3085. None,
  3086. '$1',
  3087. 'HTC',
  3088. 'J',
  3089. ),
  3090. DeviceParser(
  3091. '; *(ISW?[0-9]{2}[A-Z]{0,2}) Build',
  3092. None,
  3093. '$1',
  3094. 'KDDI',
  3095. '$1',
  3096. ),
  3097. DeviceParser(
  3098. '; *(INFOBAR [^;/]+) Build',
  3099. None,
  3100. '$1',
  3101. 'KDDI',
  3102. '$1',
  3103. ),
  3104. DeviceParser(
  3105. '; *(JOYPAD|Joypad)[ _]([^;/]+) Build/',
  3106. None,
  3107. '$1 $2',
  3108. 'Kingcom',
  3109. '$1 $2',
  3110. ),
  3111. DeviceParser(
  3112. '; *(Vox|VOX|Arc|K080) Build/',
  3113. 'i',
  3114. '$1',
  3115. 'Kobo',
  3116. '$1',
  3117. ),
  3118. DeviceParser(
  3119. '\\b(Kobo Touch)\\b',
  3120. None,
  3121. '$1',
  3122. 'Kobo',
  3123. '$1',
  3124. ),
  3125. DeviceParser(
  3126. '; *(K-Touch)[ _]([^;/]+) Build',
  3127. 'i',
  3128. '$1 $2',
  3129. 'Ktouch',
  3130. '$2',
  3131. ),
  3132. DeviceParser(
  3133. '; *((?:EV|KM)-S\\d+[A-Z]?) Build',
  3134. 'i',
  3135. '$1',
  3136. 'KTtech',
  3137. '$1',
  3138. ),
  3139. DeviceParser(
  3140. '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\\d{2}) Build/',
  3141. None,
  3142. '$1',
  3143. 'Kyocera',
  3144. '$1',
  3145. ),
  3146. DeviceParser(
  3147. '; *(?:LAVA[ _])?IRIS[ _\\-]?([^/;\\)]+) *(?:;|\\)|Build)',
  3148. 'i',
  3149. 'Iris $1',
  3150. 'Lava',
  3151. 'Iris $1',
  3152. ),
  3153. DeviceParser(
  3154. '; *LAVA[ _]([^;/]+) Build',
  3155. None,
  3156. '$1',
  3157. 'Lava',
  3158. '$1',
  3159. ),
  3160. DeviceParser(
  3161. '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_? Build',
  3162. None,
  3163. 'Lemon $1$2',
  3164. 'Lemon',
  3165. '$1$2',
  3166. ),
  3167. DeviceParser(
  3168. '; *(TAB-1012) Build/',
  3169. None,
  3170. 'Lenco $1',
  3171. 'Lenco',
  3172. '$1',
  3173. ),
  3174. DeviceParser(
  3175. '; Lenco ([^;/]+) Build/',
  3176. None,
  3177. 'Lenco $1',
  3178. 'Lenco',
  3179. '$1',
  3180. ),
  3181. DeviceParser(
  3182. '; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build',
  3183. None,
  3184. '$1',
  3185. 'Lenovo',
  3186. '$1',
  3187. ),
  3188. DeviceParser(
  3189. '; *(Idea[Tp]ab)[ _]([^;/]+);? Build',
  3190. None,
  3191. 'Lenovo $1 $2',
  3192. 'Lenovo',
  3193. '$1 $2',
  3194. ),
  3195. DeviceParser(
  3196. '; *(Idea(?:Tab|pad)) ?([^;/]+) Build',
  3197. None,
  3198. 'Lenovo $1 $2',
  3199. 'Lenovo',
  3200. '$1 $2',
  3201. ),
  3202. DeviceParser(
  3203. '; *(ThinkPad) ?(Tablet) Build/',
  3204. None,
  3205. 'Lenovo $1 $2',
  3206. 'Lenovo',
  3207. '$1 $2',
  3208. ),
  3209. DeviceParser(
  3210. '; *(?:LNV-)?(?:=?[Ll]enovo[ _\\-]?|LENOVO[ _])+(.+?)(?:Build|[;/\\)])',
  3211. None,
  3212. 'Lenovo $1',
  3213. 'Lenovo',
  3214. '$1',
  3215. ),
  3216. DeviceParser(
  3217. '[;,] (?:Vodafone )?(SmartTab) ?(II) ?(\\d+) Build/',
  3218. None,
  3219. 'Lenovo $1 $2 $3',
  3220. 'Lenovo',
  3221. '$1 $2 $3',
  3222. ),
  3223. DeviceParser(
  3224. '; *(?:Ideapad )?K1 Build/',
  3225. None,
  3226. 'Lenovo Ideapad K1',
  3227. 'Lenovo',
  3228. 'Ideapad K1',
  3229. ),
  3230. DeviceParser(
  3231. '; *(3GC101|3GW10[01]|A390) Build/',
  3232. None,
  3233. '$1',
  3234. 'Lenovo',
  3235. '$1',
  3236. ),
  3237. DeviceParser(
  3238. '\\b(?:Lenovo|LENOVO)+[ _\\-]?([^,;:/ ]+)',
  3239. None,
  3240. 'Lenovo $1',
  3241. 'Lenovo',
  3242. '$1',
  3243. ),
  3244. DeviceParser(
  3245. '; *(MFC\\d+)[A-Z]{2}([^;,/]*),? Build',
  3246. None,
  3247. '$1$2',
  3248. 'Lexibook',
  3249. '$1$2',
  3250. ),
  3251. DeviceParser(
  3252. '; *(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|;)',
  3253. None,
  3254. '$1',
  3255. 'LG',
  3256. '$1',
  3257. ),
  3258. DeviceParser(
  3259. '[;:] *(L-\\d+[A-Z]|LGL\\d+[A-Z]?)(?:/V\\d+)? *(?:Build|[;\\)])',
  3260. None,
  3261. '$1',
  3262. 'LG',
  3263. '$1',
  3264. ),
  3265. DeviceParser(
  3266. '; *(LG-)([A-Z]{1,2}\\d{2,}[^,;/\\)\\(]*?)(?:Build| V\\d+|[,;/\\)\\(]|$)',
  3267. None,
  3268. '$1$2',
  3269. 'LG',
  3270. '$2',
  3271. ),
  3272. DeviceParser(
  3273. '; *(LG[ \\-]|LG)([^;/]+)[;/]? Build',
  3274. None,
  3275. '$1$2',
  3276. 'LG',
  3277. '$2',
  3278. ),
  3279. DeviceParser(
  3280. '^(LG)-([^;/]+)/ Mozilla/.*; Android',
  3281. None,
  3282. '$1 $2',
  3283. 'LG',
  3284. '$2',
  3285. ),
  3286. DeviceParser(
  3287. '(Web0S); Linux/(SmartTV)',
  3288. None,
  3289. 'LG $1 $2',
  3290. 'LG',
  3291. '$1 $2',
  3292. ),
  3293. DeviceParser(
  3294. '; *((?:SMB|smb)[^;/]+) Build/',
  3295. None,
  3296. '$1',
  3297. 'Malata',
  3298. '$1',
  3299. ),
  3300. DeviceParser(
  3301. '; *(?:Malata|MALATA) ([^;/]+) Build/',
  3302. None,
  3303. '$1',
  3304. 'Malata',
  3305. '$1',
  3306. ),
  3307. DeviceParser(
  3308. '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9]) Build/',
  3309. None,
  3310. '$1',
  3311. 'Manta',
  3312. '$1',
  3313. ),
  3314. DeviceParser(
  3315. '; *(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/',
  3316. None,
  3317. '$1',
  3318. 'Match',
  3319. '$1',
  3320. ),
  3321. DeviceParser(
  3322. '; *(GenxDroid7|MSD7.*|AX\\d.*|Tab 701|Tab 722) Build/',
  3323. None,
  3324. 'Maxx $1',
  3325. 'Maxx',
  3326. '$1',
  3327. ),
  3328. DeviceParser(
  3329. '; *(M-PP[^;/]+|PhonePad ?\\d{2,}[^;/]+) Build',
  3330. None,
  3331. 'Mediacom $1',
  3332. 'Mediacom',
  3333. '$1',
  3334. ),
  3335. DeviceParser(
  3336. '; *(M-MP[^;/]+|SmartPad ?\\d{2,}[^;/]+) Build',
  3337. None,
  3338. 'Mediacom $1',
  3339. 'Mediacom',
  3340. '$1',
  3341. ),
  3342. DeviceParser(
  3343. '; *(?:MD_)?LIFETAB[ _]([^;/]+) Build',
  3344. 'i',
  3345. 'Medion Lifetab $1',
  3346. 'Medion',
  3347. 'Lifetab $1',
  3348. ),
  3349. DeviceParser(
  3350. '; *MEDION ([^;/]+) Build',
  3351. None,
  3352. 'Medion $1',
  3353. 'Medion',
  3354. '$1',
  3355. ),
  3356. DeviceParser(
  3357. '; *(M030|M031|M035|M040|M065|m9) Build',
  3358. None,
  3359. 'Meizu $1',
  3360. 'Meizu',
  3361. '$1',
  3362. ),
  3363. DeviceParser(
  3364. '; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\\)])',
  3365. None,
  3366. 'Meizu $1',
  3367. 'Meizu',
  3368. '$1',
  3369. ),
  3370. DeviceParser(
  3371. '; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build',
  3372. 'i',
  3373. 'Micromax $1$2',
  3374. 'Micromax',
  3375. '$1$2',
  3376. ),
  3377. DeviceParser(
  3378. '; *Micromax[ _](A\\d{2,3}[^;/]*) Build',
  3379. 'i',
  3380. 'Micromax $1',
  3381. 'Micromax',
  3382. '$1',
  3383. ),
  3384. DeviceParser(
  3385. '; *(A\\d{2}|A[12]\\d{2}|A90S|A110Q) Build',
  3386. 'i',
  3387. 'Micromax $1',
  3388. 'Micromax',
  3389. '$1',
  3390. ),
  3391. DeviceParser(
  3392. '; *Micromax[ _](P\\d{3}[^;/]*) Build',
  3393. 'i',
  3394. 'Micromax $1',
  3395. 'Micromax',
  3396. '$1',
  3397. ),
  3398. DeviceParser(
  3399. '; *(P\\d{3}|P\\d{3}\\(Funbook\\)) Build',
  3400. 'i',
  3401. 'Micromax $1',
  3402. 'Micromax',
  3403. '$1',
  3404. ),
  3405. DeviceParser(
  3406. '; *(MITO)[ _\\-]?([^;/]+) Build',
  3407. 'i',
  3408. '$1 $2',
  3409. 'Mito',
  3410. '$2',
  3411. ),
  3412. DeviceParser(
  3413. '; *(Cynus)[ _](F5|T\\d|.+?) *(?:Build|[;/\\)])',
  3414. 'i',
  3415. '$1 $2',
  3416. 'Mobistel',
  3417. '$1 $2',
  3418. ),
  3419. DeviceParser(
  3420. '; *(MODECOM )?(FreeTab) ?([^;/]+) Build',
  3421. 'i',
  3422. '$1$2 $3',
  3423. 'Modecom',
  3424. '$2 $3',
  3425. ),
  3426. DeviceParser(
  3427. '; *(MODECOM )([^;/]+) Build',
  3428. 'i',
  3429. '$1 $2',
  3430. 'Modecom',
  3431. '$2',
  3432. ),
  3433. DeviceParser(
  3434. '; *(MZ\\d{3}\\+?|MZ\\d{3} 4G|Xoom|XOOM[^;/]*) Build',
  3435. None,
  3436. 'Motorola $1',
  3437. 'Motorola',
  3438. '$1',
  3439. ),
  3440. DeviceParser(
  3441. '; *(Milestone )(XT[^;/]*) Build',
  3442. None,
  3443. 'Motorola $1$2',
  3444. 'Motorola',
  3445. '$2',
  3446. ),
  3447. DeviceParser(
  3448. '; *(Motoroi ?x|Droid X|DROIDX) Build',
  3449. 'i',
  3450. 'Motorola $1',
  3451. 'Motorola',
  3452. 'DROID X',
  3453. ),
  3454. DeviceParser(
  3455. '; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build',
  3456. None,
  3457. 'Motorola $1',
  3458. 'Motorola',
  3459. '$1',
  3460. ),
  3461. DeviceParser(
  3462. '; *(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',
  3463. None,
  3464. '$1',
  3465. 'Motorola',
  3466. '$1',
  3467. ),
  3468. DeviceParser(
  3469. '; *(Motorola MOT-|Motorola[ _\\-]|MOT\\-?)([^;/]+) Build',
  3470. None,
  3471. '$1$2',
  3472. 'Motorola',
  3473. '$2',
  3474. ),
  3475. DeviceParser(
  3476. '; *(Moto[_ ]?|MOT\\-)([^;/]+) Build',
  3477. None,
  3478. '$1$2',
  3479. 'Motorola',
  3480. '$2',
  3481. ),
  3482. DeviceParser(
  3483. '; *((?: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',
  3484. None,
  3485. '$1',
  3486. 'Mpman',
  3487. '$1',
  3488. ),
  3489. DeviceParser(
  3490. '; *(?:MSI[ _])?(Primo\\d+|Enjoy[ _\\-][^;/]+) Build',
  3491. 'i',
  3492. '$1',
  3493. 'Msi',
  3494. '$1',
  3495. ),
  3496. DeviceParser(
  3497. '; *Multilaser[ _]([^;/]+) Build',
  3498. None,
  3499. '$1',
  3500. 'Multilaser',
  3501. '$1',
  3502. ),
  3503. DeviceParser(
  3504. '; *(My)[_]?(Pad)[ _]([^;/]+) Build',
  3505. None,
  3506. '$1$2 $3',
  3507. 'MyPhone',
  3508. '$1$2 $3',
  3509. ),
  3510. DeviceParser(
  3511. '; *(My)\\|?(Phone)[ _]([^;/]+) Build',
  3512. None,
  3513. '$1$2 $3',
  3514. 'MyPhone',
  3515. '$3',
  3516. ),
  3517. DeviceParser(
  3518. '; *(A\\d+)[ _](Duo)? Build',
  3519. 'i',
  3520. '$1 $2',
  3521. 'MyPhone',
  3522. '$1 $2',
  3523. ),
  3524. DeviceParser(
  3525. '; *(myTab[^;/]*) Build',
  3526. None,
  3527. '$1',
  3528. 'Mytab',
  3529. '$1',
  3530. ),
  3531. DeviceParser(
  3532. '; *(NABI2?-)([^;/]+) Build/',
  3533. None,
  3534. '$1$2',
  3535. 'Nabi',
  3536. '$2',
  3537. ),
  3538. DeviceParser(
  3539. '; *(N-\\d+[CDE]) Build/',
  3540. None,
  3541. '$1',
  3542. 'Nec',
  3543. '$1',
  3544. ),
  3545. DeviceParser(
  3546. '; ?(NEC-)(.*) Build/',
  3547. None,
  3548. '$1$2',
  3549. 'Nec',
  3550. '$2',
  3551. ),
  3552. DeviceParser(
  3553. '; *(LT-NA7) Build/',
  3554. None,
  3555. '$1',
  3556. 'Nec',
  3557. 'Lifetouch Note',
  3558. ),
  3559. DeviceParser(
  3560. '; *(NXM\\d+[A-z0-9_]*|Next\\d[A-z0-9_ \\-]*|NEXT\\d[A-z0-9_ \\-]*|Nextbook [A-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\\);])',
  3561. None,
  3562. '$1',
  3563. 'Nextbook',
  3564. '$1',
  3565. ),
  3566. DeviceParser(
  3567. '; *(Nokia)([ _\\-]*)([^;/]*) Build',
  3568. 'i',
  3569. '$1$2$3',
  3570. 'Nokia',
  3571. '$3',
  3572. ),
  3573. DeviceParser(
  3574. '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+) Build',
  3575. None,
  3576. '$1$2',
  3577. 'Nook',
  3578. '$2',
  3579. ),
  3580. DeviceParser(
  3581. '; *(NOOK )?(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2) Build',
  3582. None,
  3583. '$1$2',
  3584. 'Nook',
  3585. '$2',
  3586. ),
  3587. DeviceParser(
  3588. '; Build/(Nook)',
  3589. None,
  3590. '$1',
  3591. 'Nook',
  3592. 'Tablet',
  3593. ),
  3594. DeviceParser(
  3595. '; *(OP110|OliPad[^;/]+) Build',
  3596. None,
  3597. 'Olivetti $1',
  3598. 'Olivetti',
  3599. '$1',
  3600. ),
  3601. DeviceParser(
  3602. '; *OMEGA[ _\\-](MID[^;/]+) Build',
  3603. None,
  3604. 'Omega $1',
  3605. 'Omega',
  3606. '$1',
  3607. ),
  3608. DeviceParser(
  3609. '^(MID7500|MID\\d+) Mozilla/5\\.0 \\(iPad;',
  3610. None,
  3611. 'Omega $1',
  3612. 'Omega',
  3613. '$1',
  3614. ),
  3615. DeviceParser(
  3616. '; *((?:CIUS|cius)[^;/]*) Build',
  3617. None,
  3618. 'Openpeak $1',
  3619. 'Openpeak',
  3620. '$1',
  3621. ),
  3622. DeviceParser(
  3623. '; *(Find ?(?:5|7a)|R8[012]\\d{1,2}|T703\\d{0,1}|U70\\d{1,2}T?|X90\\d{1,2}) Build',
  3624. None,
  3625. 'Oppo $1',
  3626. 'Oppo',
  3627. '$1',
  3628. ),
  3629. DeviceParser(
  3630. '; *OPPO ?([^;/]+) Build/',
  3631. None,
  3632. 'Oppo $1',
  3633. 'Oppo',
  3634. '$1',
  3635. ),
  3636. DeviceParser(
  3637. '; *(?:Odys\\-|ODYS\\-|ODYS )([^;/]+) Build',
  3638. None,
  3639. 'Odys $1',
  3640. 'Odys',
  3641. '$1',
  3642. ),
  3643. DeviceParser(
  3644. '; *(SELECT) ?(7) Build',
  3645. None,
  3646. 'Odys $1 $2',
  3647. 'Odys',
  3648. '$1 $2',
  3649. ),
  3650. DeviceParser(
  3651. '; *(PEDI)_(PLUS)_(W) Build',
  3652. None,
  3653. 'Odys $1 $2 $3',
  3654. 'Odys',
  3655. '$1 $2 $3',
  3656. ),
  3657. DeviceParser(
  3658. '; *(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',
  3659. None,
  3660. 'Odys $1',
  3661. 'Odys',
  3662. '$1',
  3663. ),
  3664. DeviceParser(
  3665. '; (ONE [a-zA-Z]\\d+) Build/',
  3666. None,
  3667. 'OnePlus $1',
  3668. 'OnePlus',
  3669. '$1',
  3670. ),
  3671. DeviceParser(
  3672. '; (ONEPLUS [a-zA-Z]\\d+) Build/',
  3673. None,
  3674. 'OnePlus $1',
  3675. 'OnePlus',
  3676. '$1',
  3677. ),
  3678. DeviceParser(
  3679. '; *(TP-\\d+) Build/',
  3680. None,
  3681. 'Orion $1',
  3682. 'Orion',
  3683. '$1',
  3684. ),
  3685. DeviceParser(
  3686. '; *(G100W?) Build/',
  3687. None,
  3688. 'PackardBell $1',
  3689. 'PackardBell',
  3690. '$1',
  3691. ),
  3692. DeviceParser(
  3693. '; *(Panasonic)[_ ]([^;/]+) Build',
  3694. None,
  3695. '$1 $2',
  3696. '$1',
  3697. '$2',
  3698. ),
  3699. DeviceParser(
  3700. '; *(FZ-A1B|JT-B1) Build',
  3701. None,
  3702. 'Panasonic $1',
  3703. 'Panasonic',
  3704. '$1',
  3705. ),
  3706. DeviceParser(
  3707. '; *(dL1|DL1) Build',
  3708. None,
  3709. 'Panasonic $1',
  3710. 'Panasonic',
  3711. '$1',
  3712. ),
  3713. DeviceParser(
  3714. '; *(SKY[ _])?(IM\\-[AT]\\d{3}[^;/]+).* Build/',
  3715. None,
  3716. 'Pantech $1$2',
  3717. 'Pantech',
  3718. '$1$2',
  3719. ),
  3720. DeviceParser(
  3721. '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G)?) Build/',
  3722. None,
  3723. '$1',
  3724. 'Pantech',
  3725. '$1',
  3726. ),
  3727. DeviceParser(
  3728. '; *Pantech([^;/]+).* Build/',
  3729. None,
  3730. 'Pantech $1',
  3731. 'Pantech',
  3732. '$1',
  3733. ),
  3734. DeviceParser(
  3735. '; *(papyre)[ _\\-]([^;/]+) Build/',
  3736. 'i',
  3737. '$1 $2',
  3738. 'Papyre',
  3739. '$2',
  3740. ),
  3741. DeviceParser(
  3742. '; *(?:Touchlet )?(X10\\.[^;/]+) Build/',
  3743. None,
  3744. 'Pearl $1',
  3745. 'Pearl',
  3746. '$1',
  3747. ),
  3748. DeviceParser(
  3749. '; PHICOMM (i800) Build/',
  3750. None,
  3751. 'Phicomm $1',
  3752. 'Phicomm',
  3753. '$1',
  3754. ),
  3755. DeviceParser(
  3756. '; PHICOMM ([^;/]+) Build/',
  3757. None,
  3758. 'Phicomm $1',
  3759. 'Phicomm',
  3760. '$1',
  3761. ),
  3762. DeviceParser(
  3763. '; *(FWS\\d{3}[^;/]+) Build/',
  3764. None,
  3765. 'Phicomm $1',
  3766. 'Phicomm',
  3767. '$1',
  3768. ),
  3769. DeviceParser(
  3770. '; *(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',
  3771. None,
  3772. '$1',
  3773. 'Philips',
  3774. '$1',
  3775. ),
  3776. DeviceParser(
  3777. '; *(?:Philips|PHILIPS)[ _]([^;/]+) Build',
  3778. None,
  3779. 'Philips $1',
  3780. 'Philips',
  3781. '$1',
  3782. ),
  3783. DeviceParser(
  3784. 'Android 4\\..*; *(M[12356789]|U[12368]|S[123])\\ ?(pro)? Build',
  3785. None,
  3786. 'Pipo $1$2',
  3787. 'Pipo',
  3788. '$1$2',
  3789. ),
  3790. DeviceParser(
  3791. '; *(MOMO[^;/]+) Build',
  3792. None,
  3793. '$1',
  3794. 'Ployer',
  3795. '$1',
  3796. ),
  3797. DeviceParser(
  3798. '; *(?:Polaroid[ _])?((?:MIDC\\d{3,}|PMID\\d{2,}|PTAB\\d{3,})[^;/]*)(\\/[^;/]*)? Build/',
  3799. None,
  3800. '$1',
  3801. 'Polaroid',
  3802. '$1',
  3803. ),
  3804. DeviceParser(
  3805. '; *(?:Polaroid )(Tablet) Build/',
  3806. None,
  3807. '$1',
  3808. 'Polaroid',
  3809. '$1',
  3810. ),
  3811. DeviceParser(
  3812. '; *(POMP)[ _\\-](.+?) *(?:Build|[;/\\)])',
  3813. None,
  3814. '$1 $2',
  3815. 'Pomp',
  3816. '$2',
  3817. ),
  3818. DeviceParser(
  3819. '; *(TB07STA|TB10STA|TB07FTA|TB10FTA) Build/',
  3820. None,
  3821. '$1',
  3822. 'Positivo',
  3823. '$1',
  3824. ),
  3825. DeviceParser(
  3826. '; *(?:Positivo )?((?:YPY|Ypy)[^;/]+) Build/',
  3827. None,
  3828. '$1',
  3829. 'Positivo',
  3830. '$1',
  3831. ),
  3832. DeviceParser(
  3833. '; *(MOB-[^;/]+) Build/',
  3834. None,
  3835. '$1',
  3836. 'POV',
  3837. '$1',
  3838. ),
  3839. DeviceParser(
  3840. '; *POV[ _\\-]([^;/]+) Build/',
  3841. None,
  3842. 'POV $1',
  3843. 'POV',
  3844. '$1',
  3845. ),
  3846. DeviceParser(
  3847. '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\\-]|TAB-P)[^;/]*) Build/',
  3848. None,
  3849. 'POV $1',
  3850. 'POV',
  3851. '$1',
  3852. ),
  3853. DeviceParser(
  3854. '; *(?:Prestigio )?((?:PAP|PMP)\\d[^;/]+) Build/',
  3855. None,
  3856. 'Prestigio $1',
  3857. 'Prestigio',
  3858. '$1',
  3859. ),
  3860. DeviceParser(
  3861. '; *(PLT[0-9]{4}.*) Build/',
  3862. None,
  3863. '$1',
  3864. 'Proscan',
  3865. '$1',
  3866. ),
  3867. DeviceParser(
  3868. '; *(A2|A5|A8|A900)_?(Classic)? Build',
  3869. None,
  3870. '$1 $2',
  3871. 'Qmobile',
  3872. '$1 $2',
  3873. ),
  3874. DeviceParser(
  3875. '; *(Q[Mm]obile)_([^_]+)_([^_]+) Build',
  3876. None,
  3877. 'Qmobile $2 $3',
  3878. 'Qmobile',
  3879. '$2 $3',
  3880. ),
  3881. DeviceParser(
  3882. '; *(Q\\-?[Mm]obile)[_ ](A[^;/]+) Build',
  3883. None,
  3884. 'Qmobile $2',
  3885. 'Qmobile',
  3886. '$2',
  3887. ),
  3888. DeviceParser(
  3889. '; *(Q\\-Smart)[ _]([^;/]+) Build/',
  3890. None,
  3891. '$1 $2',
  3892. 'Qmobilevn',
  3893. '$2',
  3894. ),
  3895. DeviceParser(
  3896. '; *(Q\\-?[Mm]obile)[ _\\-](S[^;/]+) Build/',
  3897. None,
  3898. '$1 $2',
  3899. 'Qmobilevn',
  3900. '$2',
  3901. ),
  3902. DeviceParser(
  3903. '; *(TA1013) Build',
  3904. None,
  3905. '$1',
  3906. 'Quanta',
  3907. '$1',
  3908. ),
  3909. DeviceParser(
  3910. '; (RCT\\w+) Build/',
  3911. None,
  3912. '$1',
  3913. 'RCA',
  3914. '$1',
  3915. ),
  3916. DeviceParser(
  3917. '; RCA (\\w+) Build/',
  3918. None,
  3919. 'RCA $1',
  3920. 'RCA',
  3921. '$1',
  3922. ),
  3923. DeviceParser(
  3924. '; *(RK\\d+),? Build/',
  3925. None,
  3926. '$1',
  3927. 'Rockchip',
  3928. '$1',
  3929. ),
  3930. DeviceParser(
  3931. ' Build/(RK\\d+)',
  3932. None,
  3933. '$1',
  3934. 'Rockchip',
  3935. '$1',
  3936. ),
  3937. DeviceParser(
  3938. '; *(SAMSUNG |Samsung )?((?:Galaxy (?:Note II|S\\d)|GT-I9082|GT-I9205|GT-N7\\d{3}|SM-N9005)[^;/]*)\\/?[^;/]* Build/',
  3939. None,
  3940. 'Samsung $1$2',
  3941. 'Samsung',
  3942. '$2',
  3943. ),
  3944. DeviceParser(
  3945. '; *(Google )?(Nexus [Ss](?: 4G)?) Build/',
  3946. None,
  3947. 'Samsung $1$2',
  3948. 'Samsung',
  3949. '$2',
  3950. ),
  3951. DeviceParser(
  3952. '; *(SAMSUNG |Samsung )([^\\/]*)\\/[^ ]* Build/',
  3953. None,
  3954. 'Samsung $2',
  3955. 'Samsung',
  3956. '$2',
  3957. ),
  3958. DeviceParser(
  3959. '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G)?) Build/',
  3960. None,
  3961. 'Samsung $1',
  3962. 'Samsung',
  3963. '$1',
  3964. ),
  3965. DeviceParser(
  3966. '; *(SAMSUNG[ _\\-] *)+([^;/]+) Build',
  3967. None,
  3968. 'Samsung $2',
  3969. 'Samsung',
  3970. '$2',
  3971. ),
  3972. DeviceParser(
  3973. '; *(SAMSUNG-)?(GT\\-[BINPS]\\d{4}[^\\/]*)(\\/[^ ]*) Build',
  3974. None,
  3975. 'Samsung $1$2$3',
  3976. 'Samsung',
  3977. '$2',
  3978. ),
  3979. DeviceParser(
  3980. '(?:; *|^)((?:GT\\-[BIiNPS]\\d{4}|I9\\d{2}0[A-Za-z\\+]?\\b)[^;/\\)]*?)(?:Build|Linux|MIUI|[;/\\)])',
  3981. None,
  3982. 'Samsung $1',
  3983. 'Samsung',
  3984. '$1',
  3985. ),
  3986. DeviceParser(
  3987. '; (SAMSUNG-)([A-Za-z0-9\\-]+).* Build/',
  3988. None,
  3989. 'Samsung $1$2',
  3990. 'Samsung',
  3991. '$2',
  3992. ),
  3993. DeviceParser(
  3994. '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9 ]+)(/?[^ ]*)? Build',
  3995. None,
  3996. 'Samsung $1',
  3997. 'Samsung',
  3998. '$1',
  3999. ),
  4000. DeviceParser(
  4001. ' ((?:SCH)\\-[A-Za-z0-9 ]+)(/?[^ ]*)? Build',
  4002. None,
  4003. 'Samsung $1',
  4004. 'Samsung',
  4005. '$1',
  4006. ),
  4007. DeviceParser(
  4008. '; *(Behold ?(?:2|II)|YP\\-G[^;/]+|EK-GC100|SCL21|I9300) Build',
  4009. None,
  4010. 'Samsung $1',
  4011. 'Samsung',
  4012. '$1',
  4013. ),
  4014. DeviceParser(
  4015. '; *(SH\\-?\\d\\d[^;/]+|SBM\\d[^;/]+) Build',
  4016. None,
  4017. '$1',
  4018. 'Sharp',
  4019. '$1',
  4020. ),
  4021. DeviceParser(
  4022. '; *(SHARP[ -])([^;/]+) Build',
  4023. None,
  4024. '$1$2',
  4025. 'Sharp',
  4026. '$2',
  4027. ),
  4028. DeviceParser(
  4029. '; *(SPX[_\\-]\\d[^;/]*) Build/',
  4030. None,
  4031. '$1',
  4032. 'Simvalley',
  4033. '$1',
  4034. ),
  4035. DeviceParser(
  4036. '; *(SX7\\-PEARL\\.GmbH) Build/',
  4037. None,
  4038. '$1',
  4039. 'Simvalley',
  4040. '$1',
  4041. ),
  4042. DeviceParser(
  4043. '; *(SP[T]?\\-\\d{2}[^;/]*) Build/',
  4044. None,
  4045. '$1',
  4046. 'Simvalley',
  4047. '$1',
  4048. ),
  4049. DeviceParser(
  4050. '; *(SK\\-.*) Build/',
  4051. None,
  4052. '$1',
  4053. 'SKtelesys',
  4054. '$1',
  4055. ),
  4056. DeviceParser(
  4057. '; *(?:SKYTEX|SX)-([^;/]+) Build',
  4058. None,
  4059. '$1',
  4060. 'Skytex',
  4061. '$1',
  4062. ),
  4063. DeviceParser(
  4064. '; *(IMAGINE [^;/]+) Build',
  4065. None,
  4066. '$1',
  4067. 'Skytex',
  4068. '$1',
  4069. ),
  4070. DeviceParser(
  4071. '; *(SmartQ) ?([^;/]+) Build/',
  4072. None,
  4073. '$1 $2',
  4074. '$1',
  4075. '$2',
  4076. ),
  4077. DeviceParser(
  4078. '; *(WF7C|WF10C|SBT[^;/]+) Build',
  4079. None,
  4080. '$1',
  4081. 'Smartbitt',
  4082. '$1',
  4083. ),
  4084. DeviceParser(
  4085. '; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build',
  4086. None,
  4087. '$1',
  4088. 'Sharp',
  4089. '$1',
  4090. ),
  4091. DeviceParser(
  4092. '; *(003P|101P|101P11C|102P) Build',
  4093. None,
  4094. '$1',
  4095. 'Panasonic',
  4096. '$1',
  4097. ),
  4098. DeviceParser(
  4099. '; *(00\\dZ) Build/',
  4100. None,
  4101. '$1',
  4102. 'ZTE',
  4103. '$1',
  4104. ),
  4105. DeviceParser(
  4106. '; HTC(X06HT) Build',
  4107. None,
  4108. '$1',
  4109. 'HTC',
  4110. '$1',
  4111. ),
  4112. DeviceParser(
  4113. '; *(001HT|X06HT) Build',
  4114. None,
  4115. '$1',
  4116. 'HTC',
  4117. '$1',
  4118. ),
  4119. DeviceParser(
  4120. '; *(201M) Build',
  4121. None,
  4122. '$1',
  4123. 'Motorola',
  4124. 'XT902',
  4125. ),
  4126. DeviceParser(
  4127. '; *(ST\\d{4}.*)Build/ST',
  4128. None,
  4129. 'Trekstor $1',
  4130. 'Trekstor',
  4131. '$1',
  4132. ),
  4133. DeviceParser(
  4134. '; *(ST\\d{4}.*) Build/',
  4135. None,
  4136. 'Trekstor $1',
  4137. 'Trekstor',
  4138. '$1',
  4139. ),
  4140. DeviceParser(
  4141. '; *(Sony ?Ericsson ?)([^;/]+) Build',
  4142. None,
  4143. '$1$2',
  4144. 'SonyEricsson',
  4145. '$2',
  4146. ),
  4147. DeviceParser(
  4148. '; *((?:SK|ST|E|X|LT|MK|MT|WT)\\d{2}[a-z0-9]*(?:-o)?|R800i|U20i) Build',
  4149. None,
  4150. '$1',
  4151. 'SonyEricsson',
  4152. '$1',
  4153. ),
  4154. DeviceParser(
  4155. '; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\\d+)[^;/]*) Build',
  4156. 'i',
  4157. '$1',
  4158. 'SonyEricsson',
  4159. '$1',
  4160. ),
  4161. DeviceParser(
  4162. '; Sony (Tablet[^;/]+) Build',
  4163. None,
  4164. 'Sony $1',
  4165. 'Sony',
  4166. '$1',
  4167. ),
  4168. DeviceParser(
  4169. '; Sony ([^;/]+) Build',
  4170. None,
  4171. 'Sony $1',
  4172. 'Sony',
  4173. '$1',
  4174. ),
  4175. DeviceParser(
  4176. '; *(Sony)([A-Za-z0-9\\-]+) Build',
  4177. None,
  4178. '$1 $2',
  4179. '$1',
  4180. '$2',
  4181. ),
  4182. DeviceParser(
  4183. '; *(Xperia [^;/]+) Build',
  4184. None,
  4185. '$1',
  4186. 'Sony',
  4187. '$1',
  4188. ),
  4189. DeviceParser(
  4190. '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\\d{3}|D6[56]\\d{2}) Build',
  4191. None,
  4192. '$1',
  4193. 'Sony',
  4194. '$1',
  4195. ),
  4196. DeviceParser(
  4197. '; *(SGP\\d{3}|SGPT\\d{2}) Build',
  4198. None,
  4199. '$1',
  4200. 'Sony',
  4201. '$1',
  4202. ),
  4203. DeviceParser(
  4204. '; *(NW-Z1000Series) Build',
  4205. None,
  4206. '$1',
  4207. 'Sony',
  4208. '$1',
  4209. ),
  4210. DeviceParser(
  4211. 'PLAYSTATION 3',
  4212. None,
  4213. 'PlayStation 3',
  4214. 'Sony',
  4215. 'PlayStation 3',
  4216. ),
  4217. DeviceParser(
  4218. '(PlayStation (?:Portable|Vita|\\d+))',
  4219. None,
  4220. '$1',
  4221. 'Sony',
  4222. '$1',
  4223. ),
  4224. DeviceParser(
  4225. '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\\-]?)?([Mm][Ii])([ _\\-])?(\\d{3}[^;/]*) Build/',
  4226. None,
  4227. '$1$2$3$4',
  4228. 'Spice',
  4229. 'Mi$4',
  4230. ),
  4231. DeviceParser(
  4232. '; *(Sprint )(.+?) *(?:Build|[;/])',
  4233. None,
  4234. '$1$2',
  4235. 'Sprint',
  4236. '$2',
  4237. ),
  4238. DeviceParser(
  4239. '\\b(Sprint)[: ]([^;,/ ]+)',
  4240. None,
  4241. '$1$2',
  4242. 'Sprint',
  4243. '$2',
  4244. ),
  4245. DeviceParser(
  4246. '; *(TAGI[ ]?)(MID) ?([^;/]+) Build/',
  4247. None,
  4248. '$1$2$3',
  4249. 'Tagi',
  4250. '$2$3',
  4251. ),
  4252. DeviceParser(
  4253. '; *(Oyster500|Opal 800) Build',
  4254. None,
  4255. 'Tecmobile $1',
  4256. 'Tecmobile',
  4257. '$1',
  4258. ),
  4259. DeviceParser(
  4260. '; *(TECNO[ _])([^;/]+) Build/',
  4261. None,
  4262. '$1$2',
  4263. 'Tecno',
  4264. '$2',
  4265. ),
  4266. DeviceParser(
  4267. '; *Android for (Telechips|Techvision) ([^ ]+) ',
  4268. 'i',
  4269. '$1 $2',
  4270. '$1',
  4271. '$2',
  4272. ),
  4273. DeviceParser(
  4274. '; *(T-Hub2) Build/',
  4275. None,
  4276. '$1',
  4277. 'Telstra',
  4278. '$1',
  4279. ),
  4280. DeviceParser(
  4281. '; *(PAD) ?(100[12]) Build/',
  4282. None,
  4283. 'Terra $1$2',
  4284. 'Terra',
  4285. '$1$2',
  4286. ),
  4287. DeviceParser(
  4288. '; *(T[BM]-\\d{3}[^;/]+) Build/',
  4289. None,
  4290. '$1',
  4291. 'Texet',
  4292. '$1',
  4293. ),
  4294. DeviceParser(
  4295. '; *(tolino [^;/]+) Build',
  4296. None,
  4297. '$1',
  4298. 'Thalia',
  4299. '$1',
  4300. ),
  4301. DeviceParser(
  4302. '; *Build/.* (TOLINO_BROWSER)',
  4303. None,
  4304. '$1',
  4305. 'Thalia',
  4306. 'Tolino Shine',
  4307. ),
  4308. DeviceParser(
  4309. '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+) Build/',
  4310. None,
  4311. '$1 $2',
  4312. 'Thl',
  4313. '$2',
  4314. ),
  4315. DeviceParser(
  4316. '; *(T100|T200|T5|W100|W200|W8s) Build/',
  4317. None,
  4318. '$1',
  4319. 'Thl',
  4320. '$1',
  4321. ),
  4322. DeviceParser(
  4323. '; *(T-Mobile[ _]G2[ _]Touch) Build',
  4324. None,
  4325. '$1',
  4326. 'HTC',
  4327. 'Hero',
  4328. ),
  4329. DeviceParser(
  4330. '; *(T-Mobile[ _]G2) Build',
  4331. None,
  4332. '$1',
  4333. 'HTC',
  4334. 'Desire Z',
  4335. ),
  4336. DeviceParser(
  4337. '; *(T-Mobile myTouch Q) Build',
  4338. None,
  4339. '$1',
  4340. 'Huawei',
  4341. 'U8730',
  4342. ),
  4343. DeviceParser(
  4344. '; *(T-Mobile myTouch) Build',
  4345. None,
  4346. '$1',
  4347. 'Huawei',
  4348. 'U8680',
  4349. ),
  4350. DeviceParser(
  4351. '; *(T-Mobile_Espresso) Build',
  4352. None,
  4353. '$1',
  4354. 'HTC',
  4355. 'Espresso',
  4356. ),
  4357. DeviceParser(
  4358. '; *(T-Mobile G1) Build',
  4359. None,
  4360. '$1',
  4361. 'HTC',
  4362. 'Dream',
  4363. ),
  4364. DeviceParser(
  4365. '\\b(T-Mobile ?)?(myTouch)[ _]?([34]G)[ _]?([^\\/]*) (?:Mozilla|Build)',
  4366. None,
  4367. '$1$2 $3 $4',
  4368. 'HTC',
  4369. '$2 $3 $4',
  4370. ),
  4371. DeviceParser(
  4372. '\\b(T-Mobile)_([^_]+)_(.*) Build',
  4373. None,
  4374. '$1 $2 $3',
  4375. 'Tmobile',
  4376. '$2 $3',
  4377. ),
  4378. DeviceParser(
  4379. '\\b(T-Mobile)[_ ]?(.*?)Build',
  4380. None,
  4381. '$1 $2',
  4382. 'Tmobile',
  4383. '$2',
  4384. ),
  4385. DeviceParser(
  4386. ' (ATP[0-9]{4}) Build',
  4387. None,
  4388. '$1',
  4389. 'Tomtec',
  4390. '$1',
  4391. ),
  4392. DeviceParser(
  4393. ' *(TOOKY)[ _\\-]([^;/]+) ?(?:Build|;)',
  4394. 'i',
  4395. '$1 $2',
  4396. 'Tooky',
  4397. '$2',
  4398. ),
  4399. DeviceParser(
  4400. '\\b(TOSHIBA_AC_AND_AZ|TOSHIBA_FOLIO_AND_A|FOLIO_AND_A)',
  4401. None,
  4402. '$1',
  4403. 'Toshiba',
  4404. 'Folio 100',
  4405. ),
  4406. DeviceParser(
  4407. '; *([Ff]olio ?100) Build/',
  4408. None,
  4409. '$1',
  4410. 'Toshiba',
  4411. 'Folio 100',
  4412. ),
  4413. DeviceParser(
  4414. '; *(AT[0-9]{2,3}(?:\\-A|LE\\-A|PE\\-A|SE|a)?|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive) Build/',
  4415. None,
  4416. 'Toshiba $1',
  4417. 'Toshiba',
  4418. '$1',
  4419. ),
  4420. DeviceParser(
  4421. '; *(TM-MID\\d+[^;/]+|TOUCHMATE|MID-750) Build',
  4422. None,
  4423. '$1',
  4424. 'Touchmate',
  4425. '$1',
  4426. ),
  4427. DeviceParser(
  4428. '; *(TM-SM\\d+[^;/]+) Build',
  4429. None,
  4430. '$1',
  4431. 'Touchmate',
  4432. '$1',
  4433. ),
  4434. DeviceParser(
  4435. '; *(A10 [Bb]asic2?) Build/',
  4436. None,
  4437. '$1',
  4438. 'Treq',
  4439. '$1',
  4440. ),
  4441. DeviceParser(
  4442. '; *(TREQ[ _\\-])([^;/]+) Build',
  4443. 'i',
  4444. '$1$2',
  4445. 'Treq',
  4446. '$2',
  4447. ),
  4448. DeviceParser(
  4449. '; *(X-?5|X-?3) Build/',
  4450. None,
  4451. '$1',
  4452. 'Umeox',
  4453. '$1',
  4454. ),
  4455. DeviceParser(
  4456. '; *(A502\\+?|A936|A603|X1|X2) Build/',
  4457. None,
  4458. '$1',
  4459. 'Umeox',
  4460. '$1',
  4461. ),
  4462. DeviceParser(
  4463. '(TOUCH(?:TAB|PAD).+?) Build/',
  4464. 'i',
  4465. 'Versus $1',
  4466. 'Versus',
  4467. '$1',
  4468. ),
  4469. DeviceParser(
  4470. '(VERTU) ([^;/]+) Build/',
  4471. None,
  4472. '$1 $2',
  4473. 'Vertu',
  4474. '$2',
  4475. ),
  4476. DeviceParser(
  4477. '; *(Videocon)[ _\\-]([^;/]+) *(?:Build|;)',
  4478. None,
  4479. '$1 $2',
  4480. 'Videocon',
  4481. '$2',
  4482. ),
  4483. DeviceParser(
  4484. ' (VT\\d{2}[A-Za-z]*) Build',
  4485. None,
  4486. '$1',
  4487. 'Videocon',
  4488. '$1',
  4489. ),
  4490. DeviceParser(
  4491. '; *((?:ViewPad|ViewPhone|VSD)[^;/]+) Build/',
  4492. None,
  4493. '$1',
  4494. 'Viewsonic',
  4495. '$1',
  4496. ),
  4497. DeviceParser(
  4498. '; *(ViewSonic-)([^;/]+) Build/',
  4499. None,
  4500. '$1$2',
  4501. 'Viewsonic',
  4502. '$2',
  4503. ),
  4504. DeviceParser(
  4505. '; *(GTablet.*) Build/',
  4506. None,
  4507. '$1',
  4508. 'Viewsonic',
  4509. '$1',
  4510. ),
  4511. DeviceParser(
  4512. '; *([Vv]ivo)[ _]([^;/]+) Build',
  4513. None,
  4514. '$1 $2',
  4515. 'vivo',
  4516. '$2',
  4517. ),
  4518. DeviceParser(
  4519. '(Vodafone) (.*) Build/',
  4520. None,
  4521. '$1 $2',
  4522. '$1',
  4523. '$2',
  4524. ),
  4525. DeviceParser(
  4526. '; *(?:Walton[ _\\-])?(Primo[ _\\-][^;/]+) Build',
  4527. 'i',
  4528. 'Walton $1',
  4529. 'Walton',
  4530. '$1',
  4531. ),
  4532. DeviceParser(
  4533. '; *(?:WIKO[ \\-])?(CINK\\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+) Build/',
  4534. 'i',
  4535. 'Wiko $1',
  4536. 'Wiko',
  4537. '$1',
  4538. ),
  4539. DeviceParser(
  4540. '; *WellcoM-([^;/]+) Build',
  4541. None,
  4542. 'Wellcom $1',
  4543. 'Wellcom',
  4544. '$1',
  4545. ),
  4546. DeviceParser(
  4547. '(?:(WeTab)-Browser|; (wetab) Build)',
  4548. None,
  4549. '$1',
  4550. 'WeTab',
  4551. 'WeTab',
  4552. ),
  4553. DeviceParser(
  4554. '; *(AT-AS[^;/]+) Build',
  4555. None,
  4556. 'Wolfgang $1',
  4557. 'Wolfgang',
  4558. '$1',
  4559. ),
  4560. DeviceParser(
  4561. '; *(?:Woxter|Wxt) ([^;/]+) Build',
  4562. None,
  4563. 'Woxter $1',
  4564. 'Woxter',
  4565. '$1',
  4566. ),
  4567. DeviceParser(
  4568. '; *(?: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/',
  4569. None,
  4570. 'Yarvik $1',
  4571. 'Yarvik',
  4572. '$1',
  4573. ),
  4574. DeviceParser(
  4575. '; *([A-Z]{2,4})(M\\d{3,}[A-Z]{2})([^;\\)\\/]*)(?: Build|[;\\)])',
  4576. None,
  4577. 'Yifang $1$2$3',
  4578. 'Yifang',
  4579. '$2',
  4580. ),
  4581. DeviceParser(
  4582. '; *((MI|HM|MI-ONE|Redmi)[ -](NOTE |Note )?[^;/]*) (Build|MIUI)/',
  4583. None,
  4584. 'XiaoMi $1',
  4585. 'XiaoMi',
  4586. '$1',
  4587. ),
  4588. DeviceParser(
  4589. '; *XOLO[ _]([^;/]*tab.*) Build',
  4590. 'i',
  4591. 'Xolo $1',
  4592. 'Xolo',
  4593. '$1',
  4594. ),
  4595. DeviceParser(
  4596. '; *XOLO[ _]([^;/]+) Build',
  4597. 'i',
  4598. 'Xolo $1',
  4599. 'Xolo',
  4600. '$1',
  4601. ),
  4602. DeviceParser(
  4603. '; *(q\\d0{2,3}[a-z]?) Build',
  4604. 'i',
  4605. 'Xolo $1',
  4606. 'Xolo',
  4607. '$1',
  4608. ),
  4609. DeviceParser(
  4610. '; *(PAD ?[79]\\d+[^;/]*|TelePAD\\d+[^;/]) Build',
  4611. None,
  4612. 'Xoro $1',
  4613. 'Xoro',
  4614. '$1',
  4615. ),
  4616. DeviceParser(
  4617. '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+)|(ZP ?(?:\\d{2}[^;/]+|C2))|(C[2379])) Build',
  4618. None,
  4619. '$1$2$3',
  4620. 'Zopo',
  4621. '$1$2$3',
  4622. ),
  4623. DeviceParser(
  4624. '; *(ZiiLABS) (Zii[^;/]*) Build',
  4625. None,
  4626. '$1 $2',
  4627. 'ZiiLabs',
  4628. '$2',
  4629. ),
  4630. DeviceParser(
  4631. '; *(Zii)_([^;/]*) Build',
  4632. None,
  4633. '$1 $2',
  4634. 'ZiiLabs',
  4635. '$2',
  4636. ),
  4637. DeviceParser(
  4638. '; *(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',
  4639. None,
  4640. '$1',
  4641. 'ZTE',
  4642. '$1',
  4643. ),
  4644. DeviceParser(
  4645. '; *([A-Z]\\d+)_USA_[^;]* Build',
  4646. None,
  4647. '$1',
  4648. 'ZTE',
  4649. '$1',
  4650. ),
  4651. DeviceParser(
  4652. '; *(SmartTab\\d+)[^;]* Build',
  4653. None,
  4654. '$1',
  4655. 'ZTE',
  4656. '$1',
  4657. ),
  4658. DeviceParser(
  4659. '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*) Build',
  4660. None,
  4661. 'ZTE Blade$1',
  4662. 'ZTE',
  4663. 'Blade$1',
  4664. ),
  4665. DeviceParser(
  4666. '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*) Build',
  4667. None,
  4668. 'ZTE Skate$1',
  4669. 'ZTE',
  4670. 'Skate$1',
  4671. ),
  4672. DeviceParser(
  4673. '; *(Orange |Optimus )(Monte Carlo|San Francisco) Build',
  4674. None,
  4675. '$1$2',
  4676. 'ZTE',
  4677. '$1$2',
  4678. ),
  4679. DeviceParser(
  4680. '; *(?:ZXY-ZTE_|ZTE\\-U |ZTE[\\- _]|ZTE-C[_ ])([^;/]+) Build',
  4681. None,
  4682. 'ZTE $1',
  4683. 'ZTE',
  4684. '$1',
  4685. ),
  4686. DeviceParser(
  4687. '; (BASE) (lutea|Lutea 2|Tab[^;]*) Build',
  4688. None,
  4689. '$1 $2',
  4690. 'ZTE',
  4691. '$1 $2',
  4692. ),
  4693. DeviceParser(
  4694. '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link) Build',
  4695. 'i',
  4696. '$1',
  4697. 'ZTE',
  4698. '$1',
  4699. ),
  4700. DeviceParser(
  4701. '; *(vp9plus)\\)',
  4702. None,
  4703. '$1',
  4704. 'ZTE',
  4705. '$1',
  4706. ),
  4707. DeviceParser(
  4708. '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900) Build/',
  4709. None,
  4710. '$1',
  4711. 'Zync',
  4712. '$1',
  4713. ),
  4714. DeviceParser(
  4715. '; ?(KFOT|Kindle Fire) Build\\b',
  4716. None,
  4717. 'Kindle Fire',
  4718. 'Amazon',
  4719. 'Kindle Fire',
  4720. ),
  4721. DeviceParser(
  4722. '; ?(KFOTE|Amazon Kindle Fire2) Build\\b',
  4723. None,
  4724. 'Kindle Fire 2',
  4725. 'Amazon',
  4726. 'Kindle Fire 2',
  4727. ),
  4728. DeviceParser(
  4729. '; ?(KFTT) Build\\b',
  4730. None,
  4731. 'Kindle Fire HD',
  4732. 'Amazon',
  4733. 'Kindle Fire HD 7"',
  4734. ),
  4735. DeviceParser(
  4736. '; ?(KFJWI) Build\\b',
  4737. None,
  4738. 'Kindle Fire HD 8.9" WiFi',
  4739. 'Amazon',
  4740. 'Kindle Fire HD 8.9" WiFi',
  4741. ),
  4742. DeviceParser(
  4743. '; ?(KFJWA) Build\\b',
  4744. None,
  4745. 'Kindle Fire HD 8.9" 4G',
  4746. 'Amazon',
  4747. 'Kindle Fire HD 8.9" 4G',
  4748. ),
  4749. DeviceParser(
  4750. '; ?(KFSOWI) Build\\b',
  4751. None,
  4752. 'Kindle Fire HD 7" WiFi',
  4753. 'Amazon',
  4754. 'Kindle Fire HD 7" WiFi',
  4755. ),
  4756. DeviceParser(
  4757. '; ?(KFTHWI) Build\\b',
  4758. None,
  4759. 'Kindle Fire HDX 7" WiFi',
  4760. 'Amazon',
  4761. 'Kindle Fire HDX 7" WiFi',
  4762. ),
  4763. DeviceParser(
  4764. '; ?(KFTHWA) Build\\b',
  4765. None,
  4766. 'Kindle Fire HDX 7" 4G',
  4767. 'Amazon',
  4768. 'Kindle Fire HDX 7" 4G',
  4769. ),
  4770. DeviceParser(
  4771. '; ?(KFAPWI) Build\\b',
  4772. None,
  4773. 'Kindle Fire HDX 8.9" WiFi',
  4774. 'Amazon',
  4775. 'Kindle Fire HDX 8.9" WiFi',
  4776. ),
  4777. DeviceParser(
  4778. '; ?(KFAPWA) Build\\b',
  4779. None,
  4780. 'Kindle Fire HDX 8.9" 4G',
  4781. 'Amazon',
  4782. 'Kindle Fire HDX 8.9" 4G',
  4783. ),
  4784. DeviceParser(
  4785. '; ?Amazon ([^;/]+) Build\\b',
  4786. None,
  4787. '$1',
  4788. 'Amazon',
  4789. '$1',
  4790. ),
  4791. DeviceParser(
  4792. '; ?(Kindle) Build\\b',
  4793. None,
  4794. 'Kindle',
  4795. 'Amazon',
  4796. 'Kindle',
  4797. ),
  4798. DeviceParser(
  4799. '; ?(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+))? Build\\b',
  4800. None,
  4801. 'Kindle Fire',
  4802. 'Amazon',
  4803. 'Kindle Fire$2',
  4804. ),
  4805. DeviceParser(
  4806. ' (Kindle)/(\\d+\\.\\d+)',
  4807. None,
  4808. 'Kindle',
  4809. 'Amazon',
  4810. '$1 $2',
  4811. ),
  4812. DeviceParser(
  4813. ' (Silk|Kindle)/(\\d+)\\.',
  4814. None,
  4815. 'Kindle',
  4816. 'Amazon',
  4817. 'Kindle',
  4818. ),
  4819. DeviceParser(
  4820. '(sprd)\\-([^/]+)/',
  4821. None,
  4822. '$1 $2',
  4823. '$1',
  4824. '$2',
  4825. ),
  4826. DeviceParser(
  4827. '; *(H\\d{2}00\\+?) Build',
  4828. None,
  4829. '$1',
  4830. 'Hero',
  4831. '$1',
  4832. ),
  4833. DeviceParser(
  4834. '; *(iphone|iPhone5) Build/',
  4835. None,
  4836. 'Xianghe $1',
  4837. 'Xianghe',
  4838. '$1',
  4839. ),
  4840. DeviceParser(
  4841. '; *(e\\d{4}[a-z]?_?v\\d+|v89_[^;/]+)[^;/]+ Build/',
  4842. None,
  4843. 'Xianghe $1',
  4844. 'Xianghe',
  4845. '$1',
  4846. ),
  4847. DeviceParser(
  4848. '\\bUSCC[_\\-]?([^ ;/\\)]+)',
  4849. None,
  4850. '$1',
  4851. 'Cellular',
  4852. '$1',
  4853. ),
  4854. DeviceParser(
  4855. 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:ALCATEL)[^;]*; *([^;,\\)]+)',
  4856. None,
  4857. 'Alcatel $1',
  4858. 'Alcatel',
  4859. '$1',
  4860. ),
  4861. DeviceParser(
  4862. 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:ASUS|Asus)[^;]*; *([^;,\\)]+)',
  4863. None,
  4864. 'Asus $1',
  4865. 'Asus',
  4866. '$1',
  4867. ),
  4868. DeviceParser(
  4869. 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:DELL|Dell)[^;]*; *([^;,\\)]+)',
  4870. None,
  4871. 'Dell $1',
  4872. 'Dell',
  4873. '$1',
  4874. ),
  4875. DeviceParser(
  4876. 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC)?([^;,\\)]+)',
  4877. None,
  4878. 'HTC $1',
  4879. 'HTC',
  4880. '$1',
  4881. ),
  4882. DeviceParser(
  4883. 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:HUAWEI)[^;]*; *(?:HUAWEI )?([^;,\\)]+)',
  4884. None,
  4885. 'Huawei $1',
  4886. 'Huawei',
  4887. '$1',
  4888. ),
  4889. DeviceParser(
  4890. 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:LG|Lg)[^;]*; *(?:LG[ \\-])?([^;,\\)]+)',
  4891. None,
  4892. 'LG $1',
  4893. 'LG',
  4894. '$1',
  4895. ),
  4896. DeviceParser(
  4897. 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:rv:11; )?(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?)*(\\d{3,}[^;\\)]*)',
  4898. None,
  4899. 'Lumia $1',
  4900. 'Nokia',
  4901. 'Lumia $1',
  4902. ),
  4903. DeviceParser(
  4904. 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:NOKIA|Nokia)[^;]*; *(RM-\\d{3,})',
  4905. None,
  4906. 'Nokia $1',
  4907. 'Nokia',
  4908. '$1',
  4909. ),
  4910. DeviceParser(
  4911. '(?:Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?)?(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?)*([^;\\)]+)',
  4912. None,
  4913. 'Nokia $1',
  4914. 'Nokia',
  4915. '$1',
  4916. ),
  4917. DeviceParser(
  4918. 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?)?(?:Microsoft(?: Corporation)?)[^;]*; *([^;,\\)]+)',
  4919. None,
  4920. 'Microsoft $1',
  4921. 'Microsoft',
  4922. '$1',
  4923. ),
  4924. DeviceParser(
  4925. 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:SAMSUNG)[^;]*; *(?:SAMSUNG )?([^;,\\.\\)]+)',
  4926. None,
  4927. 'Samsung $1',
  4928. 'Samsung',
  4929. '$1',
  4930. ),
  4931. DeviceParser(
  4932. 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\\)]+)',
  4933. None,
  4934. 'Toshiba $1',
  4935. 'Toshiba',
  4936. '$1',
  4937. ),
  4938. DeviceParser(
  4939. 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?)?([^;]+); *([^;,\\)]+)',
  4940. None,
  4941. '$1 $2',
  4942. '$1',
  4943. '$2',
  4944. ),
  4945. DeviceParser(
  4946. '(?:^|; )SAMSUNG\\-([A-Za-z0-9\\-]+).* Bada/',
  4947. None,
  4948. 'Samsung $1',
  4949. 'Samsung',
  4950. '$1',
  4951. ),
  4952. DeviceParser(
  4953. '\\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+)(?:/[^;]+)?; rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/',
  4954. None,
  4955. 'Alcatel $1 $2 $3',
  4956. 'Alcatel',
  4957. 'One Touch $3',
  4958. ),
  4959. DeviceParser(
  4960. '\\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/',
  4961. None,
  4962. 'ZTE $1$2',
  4963. 'ZTE',
  4964. '$1$2',
  4965. ),
  4966. DeviceParser(
  4967. 'Nokia(N[0-9]+)([A-z_\\-][A-z0-9_\\-]*)',
  4968. None,
  4969. 'Nokia $1',
  4970. 'Nokia',
  4971. '$1$2',
  4972. ),
  4973. DeviceParser(
  4974. '(?:NOKIA|Nokia)(?:\\-| *)(?:([A-Za-z0-9]+)\\-[0-9a-f]{32}|([A-Za-z0-9\\-]+)(?:UCBrowser)|([A-Za-z0-9\\-]+))',
  4975. None,
  4976. 'Nokia $1$2$3',
  4977. 'Nokia',
  4978. '$1$2$3',
  4979. ),
  4980. DeviceParser(
  4981. 'Lumia ([A-Za-z0-9\\-]+)',
  4982. None,
  4983. 'Lumia $1',
  4984. 'Nokia',
  4985. 'Lumia $1',
  4986. ),
  4987. DeviceParser(
  4988. '\\(Symbian; U; S60 V5; [A-z]{2}\\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+)\\)',
  4989. None,
  4990. '$1 $2',
  4991. '$1',
  4992. '$2',
  4993. ),
  4994. DeviceParser(
  4995. '\\(Symbian(?:/3)?; U; ([^;]+);',
  4996. None,
  4997. 'Nokia $1',
  4998. 'Nokia',
  4999. '$1',
  5000. ),
  5001. DeviceParser(
  5002. 'BB10; ([A-Za-z0-9\\- ]+)\\)',
  5003. None,
  5004. 'BlackBerry $1',
  5005. 'BlackBerry',
  5006. '$1',
  5007. ),
  5008. DeviceParser(
  5009. 'Play[Bb]ook.+RIM Tablet OS',
  5010. None,
  5011. 'BlackBerry Playbook',
  5012. 'BlackBerry',
  5013. 'Playbook',
  5014. ),
  5015. DeviceParser(
  5016. 'Black[Bb]erry ([0-9]+);',
  5017. None,
  5018. 'BlackBerry $1',
  5019. 'BlackBerry',
  5020. '$1',
  5021. ),
  5022. DeviceParser(
  5023. 'Black[Bb]erry([0-9]+)',
  5024. None,
  5025. 'BlackBerry $1',
  5026. 'BlackBerry',
  5027. '$1',
  5028. ),
  5029. DeviceParser(
  5030. 'Black[Bb]erry;',
  5031. None,
  5032. 'BlackBerry',
  5033. 'BlackBerry',
  5034. None,
  5035. ),
  5036. DeviceParser(
  5037. '(Pre|Pixi)/\\d+\\.\\d+',
  5038. None,
  5039. 'Palm $1',
  5040. 'Palm',
  5041. '$1',
  5042. ),
  5043. DeviceParser(
  5044. 'Palm([0-9]+)',
  5045. None,
  5046. 'Palm $1',
  5047. 'Palm',
  5048. '$1',
  5049. ),
  5050. DeviceParser(
  5051. 'Treo([A-Za-z0-9]+)',
  5052. None,
  5053. 'Palm Treo $1',
  5054. 'Palm',
  5055. 'Treo $1',
  5056. ),
  5057. DeviceParser(
  5058. 'webOS.*(P160U(?:NA)?)/(\\d+).(\\d+)',
  5059. None,
  5060. 'HP Veer',
  5061. 'HP',
  5062. 'Veer',
  5063. ),
  5064. DeviceParser(
  5065. '(Touch[Pp]ad)/\\d+\\.\\d+',
  5066. None,
  5067. 'HP TouchPad',
  5068. 'HP',
  5069. 'TouchPad',
  5070. ),
  5071. DeviceParser(
  5072. 'HPiPAQ([A-Za-z0-9]+)/\\d+.\\d+',
  5073. None,
  5074. 'HP iPAQ $1',
  5075. 'HP',
  5076. 'iPAQ $1',
  5077. ),
  5078. DeviceParser(
  5079. 'PDA; (PalmOS)/sony/model ([a-z]+)/Revision',
  5080. None,
  5081. '$1',
  5082. 'Sony',
  5083. '$1 $2',
  5084. ),
  5085. DeviceParser(
  5086. '(Apple\\s?TV)',
  5087. None,
  5088. 'AppleTV',
  5089. 'Apple',
  5090. 'AppleTV',
  5091. ),
  5092. DeviceParser(
  5093. '(QtCarBrowser)',
  5094. None,
  5095. 'Tesla Model S',
  5096. 'Tesla',
  5097. 'Model S',
  5098. ),
  5099. DeviceParser(
  5100. '(iPhone|iPad|iPod)(\\d+,\\d+)',
  5101. None,
  5102. '$1',
  5103. 'Apple',
  5104. '$1$2',
  5105. ),
  5106. DeviceParser(
  5107. '(iPad)(?:;| Simulator;)',
  5108. None,
  5109. '$1',
  5110. 'Apple',
  5111. '$1',
  5112. ),
  5113. DeviceParser(
  5114. '(iPod)(?:;| touch;| Simulator;)',
  5115. None,
  5116. '$1',
  5117. 'Apple',
  5118. '$1',
  5119. ),
  5120. DeviceParser(
  5121. '(iPhone)(?:;| Simulator;)',
  5122. None,
  5123. '$1',
  5124. 'Apple',
  5125. '$1',
  5126. ),
  5127. DeviceParser(
  5128. 'iPhone',
  5129. None,
  5130. 'iPhone',
  5131. 'Apple',
  5132. 'iPhone',
  5133. ),
  5134. DeviceParser(
  5135. 'CFNetwork/.* Darwin/\\d.*\\(((?:Mac|iMac|PowerMac|PowerBook)[^\\d]*)(\\d+)(?:,|%2C)(\\d+)',
  5136. None,
  5137. '$1$2,$3',
  5138. 'Apple',
  5139. '$1$2,$3',
  5140. ),
  5141. DeviceParser(
  5142. 'CFNetwork/.* Darwin/\\d+\\.\\d+\\.\\d+ \\(x86_64\\)',
  5143. None,
  5144. 'Mac',
  5145. 'Apple',
  5146. 'Mac',
  5147. ),
  5148. DeviceParser(
  5149. 'CFNetwork/.* Darwin/\\d',
  5150. None,
  5151. 'iOS-Device',
  5152. 'Apple',
  5153. 'iOS-Device',
  5154. ),
  5155. DeviceParser(
  5156. 'Outlook-(iOS)/\\d+\\.\\d+\\.prod\\.iphone',
  5157. None,
  5158. 'iPhone',
  5159. 'Apple',
  5160. 'iPhone',
  5161. ),
  5162. DeviceParser(
  5163. 'acer_([A-Za-z0-9]+)_',
  5164. None,
  5165. 'Acer $1',
  5166. 'Acer',
  5167. '$1',
  5168. ),
  5169. DeviceParser(
  5170. '(?:ALCATEL|Alcatel)-([A-Za-z0-9\\-]+)',
  5171. None,
  5172. 'Alcatel $1',
  5173. 'Alcatel',
  5174. '$1',
  5175. ),
  5176. DeviceParser(
  5177. '(?:Amoi|AMOI)\\-([A-Za-z0-9]+)',
  5178. None,
  5179. 'Amoi $1',
  5180. 'Amoi',
  5181. '$1',
  5182. ),
  5183. DeviceParser(
  5184. '(?:; |\\/|^)((?:Transformer (?:Pad|Prime) |Transformer |PadFone[ _]?)[A-Za-z0-9]*)',
  5185. None,
  5186. 'Asus $1',
  5187. 'Asus',
  5188. '$1',
  5189. ),
  5190. DeviceParser(
  5191. '(?:asus.*?ASUS|Asus|ASUS|asus)[\\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _])?[A-Za-z0-9]+)',
  5192. None,
  5193. 'Asus $1',
  5194. 'Asus',
  5195. '$1',
  5196. ),
  5197. DeviceParser(
  5198. '\\bBIRD[ \\-\\.]([A-Za-z0-9]+)',
  5199. None,
  5200. 'Bird $1',
  5201. 'Bird',
  5202. '$1',
  5203. ),
  5204. DeviceParser(
  5205. '\\bDell ([A-Za-z0-9]+)',
  5206. None,
  5207. 'Dell $1',
  5208. 'Dell',
  5209. '$1',
  5210. ),
  5211. DeviceParser(
  5212. 'DoCoMo/2\\.0 ([A-Za-z0-9]+)',
  5213. None,
  5214. 'DoCoMo $1',
  5215. 'DoCoMo',
  5216. '$1',
  5217. ),
  5218. DeviceParser(
  5219. '([A-Za-z0-9]+)_W;FOMA',
  5220. None,
  5221. 'DoCoMo $1',
  5222. 'DoCoMo',
  5223. '$1',
  5224. ),
  5225. DeviceParser(
  5226. '([A-Za-z0-9]+);FOMA',
  5227. None,
  5228. 'DoCoMo $1',
  5229. 'DoCoMo',
  5230. '$1',
  5231. ),
  5232. DeviceParser(
  5233. '\\b(?:HTC/|HTC/[a-z0-9]+/)?HTC[ _\\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\\(\\)]|$)',
  5234. None,
  5235. 'HTC $1',
  5236. 'HTC',
  5237. '$1',
  5238. ),
  5239. DeviceParser(
  5240. 'Huawei([A-Za-z0-9]+)',
  5241. None,
  5242. 'Huawei $1',
  5243. 'Huawei',
  5244. '$1',
  5245. ),
  5246. DeviceParser(
  5247. 'HUAWEI-([A-Za-z0-9]+)',
  5248. None,
  5249. 'Huawei $1',
  5250. 'Huawei',
  5251. '$1',
  5252. ),
  5253. DeviceParser(
  5254. 'vodafone([A-Za-z0-9]+)',
  5255. None,
  5256. 'Huawei Vodafone $1',
  5257. 'Huawei',
  5258. 'Vodafone $1',
  5259. ),
  5260. DeviceParser(
  5261. 'i\\-mate ([A-Za-z0-9]+)',
  5262. None,
  5263. 'i-mate $1',
  5264. 'i-mate',
  5265. '$1',
  5266. ),
  5267. DeviceParser(
  5268. 'Kyocera\\-([A-Za-z0-9]+)',
  5269. None,
  5270. 'Kyocera $1',
  5271. 'Kyocera',
  5272. '$1',
  5273. ),
  5274. DeviceParser(
  5275. 'KWC\\-([A-Za-z0-9]+)',
  5276. None,
  5277. 'Kyocera $1',
  5278. 'Kyocera',
  5279. '$1',
  5280. ),
  5281. DeviceParser(
  5282. 'Lenovo[_\\-]([A-Za-z0-9]+)',
  5283. None,
  5284. 'Lenovo $1',
  5285. 'Lenovo',
  5286. '$1',
  5287. ),
  5288. DeviceParser(
  5289. '(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+ \\([^;]*; *(LG)E *; *([^;]*) *;[^;]*;[^;]*;\\)',
  5290. None,
  5291. '$1',
  5292. '$2',
  5293. '$3',
  5294. ),
  5295. DeviceParser(
  5296. '(HbbTV)/1\\.1\\.1.*CE-HTML/1\\.\\d;(Vendor/)*(THOM[^;]*?)[;\\s](?:.*SW-Version/.*)*(LF[^;]+);?',
  5297. None,
  5298. '$1',
  5299. 'Thomson',
  5300. '$4',
  5301. ),
  5302. DeviceParser(
  5303. '(HbbTV)(?:/1\\.1\\.1)?(?: ?\\(;;;;;\\))?; *CE-HTML(?:/1\\.\\d)?; *([^ ]+) ([^;]+);',
  5304. None,
  5305. '$1',
  5306. '$2',
  5307. '$3',
  5308. ),
  5309. DeviceParser(
  5310. '(HbbTV)/1\\.1\\.1 \\(;;;;;\\) Maple_2011',
  5311. None,
  5312. '$1',
  5313. 'Samsung',
  5314. None,
  5315. ),
  5316. DeviceParser(
  5317. '(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+ \\([^;]*; *(?:CUS:([^;]*)|([^;]+)) *; *([^;]*) *;.*;',
  5318. None,
  5319. '$1',
  5320. '$2$3',
  5321. '$4',
  5322. ),
  5323. DeviceParser(
  5324. '(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+',
  5325. None,
  5326. '$1',
  5327. None,
  5328. None,
  5329. ),
  5330. DeviceParser(
  5331. 'LGE; (?:Media\\/)?([^;]*);[^;]*;[^;]*;?\\); "?LG NetCast(\\.TV|\\.Media|)-\\d+',
  5332. None,
  5333. 'NetCast$2',
  5334. 'LG',
  5335. '$1',
  5336. ),
  5337. DeviceParser(
  5338. 'InettvBrowser/[0-9]+\\.[0-9A-Z]+ \\([^;]*;(Sony)([^;]*);[^;]*;[^\\)]*\\)',
  5339. None,
  5340. 'Inettv',
  5341. '$1',
  5342. '$2',
  5343. ),
  5344. DeviceParser(
  5345. 'InettvBrowser/[0-9]+\\.[0-9A-Z]+ \\([^;]*;([^;]*);[^;]*;[^\\)]*\\)',
  5346. None,
  5347. 'Inettv',
  5348. 'Generic_Inettv',
  5349. '$1',
  5350. ),
  5351. DeviceParser(
  5352. '(?:InettvBrowser|TSBNetTV|NETTV|HBBTV)',
  5353. None,
  5354. 'Inettv',
  5355. 'Generic_Inettv',
  5356. None,
  5357. ),
  5358. DeviceParser(
  5359. 'Series60/\\d\\.\\d (LG)[\\-]?([A-Za-z0-9 \\-]+)',
  5360. None,
  5361. '$1 $2',
  5362. '$1',
  5363. '$2',
  5364. ),
  5365. DeviceParser(
  5366. '\\b(?:LGE[ \\-]LG\\-(?:AX)?|LGE |LGE?-LG|LGE?[ \\-]|LG[ /\\-]|lg[\\-])([A-Za-z0-9]+)\\b',
  5367. None,
  5368. 'LG $1',
  5369. 'LG',
  5370. '$1',
  5371. ),
  5372. DeviceParser(
  5373. '(?:^LG[\\-]?|^LGE[\\-/]?)([A-Za-z]+[0-9]+[A-Za-z]*)',
  5374. None,
  5375. 'LG $1',
  5376. 'LG',
  5377. '$1',
  5378. ),
  5379. DeviceParser(
  5380. '^LG([0-9]+[A-Za-z]*)',
  5381. None,
  5382. 'LG $1',
  5383. 'LG',
  5384. '$1',
  5385. ),
  5386. DeviceParser(
  5387. '(KIN\\.[^ ]+) (\\d+)\\.(\\d+)',
  5388. None,
  5389. 'Microsoft $1',
  5390. 'Microsoft',
  5391. '$1',
  5392. ),
  5393. DeviceParser(
  5394. '(?:MSIE|XBMC).*\\b(Xbox)\\b',
  5395. None,
  5396. '$1',
  5397. 'Microsoft',
  5398. '$1',
  5399. ),
  5400. DeviceParser(
  5401. '; ARM; Trident/6\\.0; Touch[\\);]',
  5402. None,
  5403. 'Microsoft Surface RT',
  5404. 'Microsoft',
  5405. 'Surface RT',
  5406. ),
  5407. DeviceParser(
  5408. 'Motorola\\-([A-Za-z0-9]+)',
  5409. None,
  5410. 'Motorola $1',
  5411. 'Motorola',
  5412. '$1',
  5413. ),
  5414. DeviceParser(
  5415. 'MOTO\\-([A-Za-z0-9]+)',
  5416. None,
  5417. 'Motorola $1',
  5418. 'Motorola',
  5419. '$1',
  5420. ),
  5421. DeviceParser(
  5422. 'MOT\\-([A-z0-9][A-z0-9\\-]*)',
  5423. None,
  5424. 'Motorola $1',
  5425. 'Motorola',
  5426. '$1',
  5427. ),
  5428. DeviceParser(
  5429. 'Nintendo WiiU',
  5430. None,
  5431. 'Nintendo Wii U',
  5432. 'Nintendo',
  5433. 'Wii U',
  5434. ),
  5435. DeviceParser(
  5436. 'Nintendo (DS|3DS|DSi|Wii);',
  5437. None,
  5438. 'Nintendo $1',
  5439. 'Nintendo',
  5440. '$1',
  5441. ),
  5442. DeviceParser(
  5443. '(?:Pantech|PANTECH)[ _-]?([A-Za-z0-9\\-]+)',
  5444. None,
  5445. 'Pantech $1',
  5446. 'Pantech',
  5447. '$1',
  5448. ),
  5449. DeviceParser(
  5450. 'Philips([A-Za-z0-9]+)',
  5451. None,
  5452. 'Philips $1',
  5453. 'Philips',
  5454. '$1',
  5455. ),
  5456. DeviceParser(
  5457. 'Philips ([A-Za-z0-9]+)',
  5458. None,
  5459. 'Philips $1',
  5460. 'Philips',
  5461. '$1',
  5462. ),
  5463. DeviceParser(
  5464. '(SMART-TV); .* Tizen ',
  5465. None,
  5466. 'Samsung $1',
  5467. 'Samsung',
  5468. '$1',
  5469. ),
  5470. DeviceParser(
  5471. 'SymbianOS/9\\.\\d.* Samsung[/\\-]([A-Za-z0-9 \\-]+)',
  5472. None,
  5473. 'Samsung $1',
  5474. 'Samsung',
  5475. '$1',
  5476. ),
  5477. DeviceParser(
  5478. '(Samsung)(SGH)(i[0-9]+)',
  5479. None,
  5480. '$1 $2$3',
  5481. '$1',
  5482. '$2-$3',
  5483. ),
  5484. DeviceParser(
  5485. 'SAMSUNG-ANDROID-MMS/([^;/]+)',
  5486. None,
  5487. '$1',
  5488. 'Samsung',
  5489. '$1',
  5490. ),
  5491. DeviceParser(
  5492. 'SAMSUNG(?:; |[ -/])([A-Za-z0-9\\-]+)',
  5493. 'i',
  5494. 'Samsung $1',
  5495. 'Samsung',
  5496. '$1',
  5497. ),
  5498. DeviceParser(
  5499. '(Dreamcast)',
  5500. None,
  5501. 'Sega $1',
  5502. 'Sega',
  5503. '$1',
  5504. ),
  5505. DeviceParser(
  5506. '^SIE-([A-Za-z0-9]+)',
  5507. None,
  5508. 'Siemens $1',
  5509. 'Siemens',
  5510. '$1',
  5511. ),
  5512. DeviceParser(
  5513. 'Softbank/[12]\\.0/([A-Za-z0-9]+)',
  5514. None,
  5515. 'Softbank $1',
  5516. 'Softbank',
  5517. '$1',
  5518. ),
  5519. DeviceParser(
  5520. 'SonyEricsson ?([A-Za-z0-9\\-]+)',
  5521. None,
  5522. 'Ericsson $1',
  5523. 'SonyEricsson',
  5524. '$1',
  5525. ),
  5526. DeviceParser(
  5527. 'Android [^;]+; ([^ ]+) (Sony)/',
  5528. None,
  5529. '$2 $1',
  5530. '$2',
  5531. '$1',
  5532. ),
  5533. DeviceParser(
  5534. '(Sony)(?:BDP\\/|\\/)?([^ /;\\)]+)[ /;\\)]',
  5535. None,
  5536. '$1 $2',
  5537. '$1',
  5538. '$2',
  5539. ),
  5540. DeviceParser(
  5541. 'Puffin/[\\d\\.]+IT',
  5542. None,
  5543. 'iPad',
  5544. 'Apple',
  5545. 'iPad',
  5546. ),
  5547. DeviceParser(
  5548. 'Puffin/[\\d\\.]+IP',
  5549. None,
  5550. 'iPhone',
  5551. 'Apple',
  5552. 'iPhone',
  5553. ),
  5554. DeviceParser(
  5555. 'Puffin/[\\d\\.]+AT',
  5556. None,
  5557. 'Generic Tablet',
  5558. 'Generic',
  5559. 'Tablet',
  5560. ),
  5561. DeviceParser(
  5562. 'Puffin/[\\d\\.]+AP',
  5563. None,
  5564. 'Generic Smartphone',
  5565. 'Generic',
  5566. 'Smartphone',
  5567. ),
  5568. DeviceParser(
  5569. 'Android[\\- ][\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{0,2}; WOWMobile (.+) Build[/ ]',
  5570. None,
  5571. None,
  5572. 'Generic_Android',
  5573. '$1',
  5574. ),
  5575. DeviceParser(
  5576. 'Android[\\- ][\\d]+\\.[\\d]+\\-update1; [A-Za-z]{2}\\-[A-Za-z]{0,2} *; *(.+?) Build[/ ]',
  5577. None,
  5578. None,
  5579. 'Generic_Android',
  5580. '$1',
  5581. ),
  5582. DeviceParser(
  5583. 'Android[\\- ][\\d]+(?:\\.[\\d]+){1,2}; *[A-Za-z]{2}[_\\-][A-Za-z]{0,2}\\-? *; *(.+?) Build[/ ]',
  5584. None,
  5585. None,
  5586. 'Generic_Android',
  5587. '$1',
  5588. ),
  5589. DeviceParser(
  5590. 'Android[\\- ][\\d]+(?:\\.[\\d]+){1,2}; *[A-Za-z]{0,2}\\- *; *(.+?) Build[/ ]',
  5591. None,
  5592. None,
  5593. 'Generic_Android',
  5594. '$1',
  5595. ),
  5596. DeviceParser(
  5597. 'Android[\\- ][\\d]+(?:\\.[\\d]+){1,2}; *[a-z]{0,2}[_\\-]?[A-Za-z]{0,2};? Build[/ ]',
  5598. None,
  5599. 'Generic Smartphone',
  5600. 'Generic',
  5601. 'Smartphone',
  5602. ),
  5603. DeviceParser(
  5604. 'Android[\\- ][\\d]+(?:\\.[\\d]+){1,2}; *\\-?[A-Za-z]{2}; *(.+?) Build[/ ]',
  5605. None,
  5606. None,
  5607. 'Generic_Android',
  5608. '$1',
  5609. ),
  5610. DeviceParser(
  5611. 'Android[\\- ][\\d]+(?:\\.[\\d]+){1,2}(?:;.*)?; *(.+?) Build[/ ]',
  5612. None,
  5613. None,
  5614. 'Generic_Android',
  5615. '$1',
  5616. ),
  5617. DeviceParser(
  5618. '(GoogleTV)',
  5619. None,
  5620. None,
  5621. 'Generic_Inettv',
  5622. '$1',
  5623. ),
  5624. DeviceParser(
  5625. '(WebTV)/\\d+.\\d+',
  5626. None,
  5627. None,
  5628. 'Generic_Inettv',
  5629. '$1',
  5630. ),
  5631. DeviceParser(
  5632. '^(Roku)/DVP-\\d+\\.\\d+',
  5633. None,
  5634. None,
  5635. 'Generic_Inettv',
  5636. '$1',
  5637. ),
  5638. DeviceParser(
  5639. '(Android 3\\.\\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))',
  5640. 'i',
  5641. 'Generic Tablet',
  5642. 'Generic',
  5643. 'Tablet',
  5644. ),
  5645. DeviceParser(
  5646. '(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)',
  5647. None,
  5648. 'Generic Smartphone',
  5649. 'Generic',
  5650. 'Smartphone',
  5651. ),
  5652. DeviceParser(
  5653. '(hiptop|avantgo|plucker|xiino|blazer|elaine)',
  5654. 'i',
  5655. 'Generic Smartphone',
  5656. 'Generic',
  5657. 'Smartphone',
  5658. ),
  5659. DeviceParser(
  5660. '(bot|BUbiNG|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)',
  5661. 'i',
  5662. 'Spider',
  5663. 'Spider',
  5664. 'Desktop',
  5665. ),
  5666. DeviceParser(
  5667. '^(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)',
  5668. 'i',
  5669. 'Generic Feature Phone',
  5670. 'Generic',
  5671. 'Feature Phone',
  5672. ),
  5673. DeviceParser(
  5674. '^(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)',
  5675. 'i',
  5676. 'Generic Feature Phone',
  5677. 'Generic',
  5678. 'Feature Phone',
  5679. ),
  5680. DeviceParser(
  5681. '^(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)',
  5682. 'i',
  5683. 'Generic Feature Phone',
  5684. 'Generic',
  5685. 'Feature Phone',
  5686. ),
  5687. DeviceParser(
  5688. '^(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_)',
  5689. 'i',
  5690. 'Generic Feature Phone',
  5691. 'Generic',
  5692. 'Feature Phone',
  5693. ),
  5694. DeviceParser(
  5695. '^(Ice)$',
  5696. None,
  5697. 'Generic Feature Phone',
  5698. 'Generic',
  5699. 'Feature Phone',
  5700. ),
  5701. DeviceParser(
  5702. '(wap[\\-\\ ]browser|maui|netfront|obigo|teleca|up\\.browser|midp|Opera Mini)',
  5703. 'i',
  5704. 'Generic Feature Phone',
  5705. 'Generic',
  5706. 'Feature Phone',
  5707. ),
  5708. ]
  5709. OS_PARSERS = [
  5710. OSParser(
  5711. 'HbbTV/\\d+\\.\\d+\\.\\d+ \\( ;(LG)E ;NetCast 4.0',
  5712. None,
  5713. '2013',
  5714. None,
  5715. None,
  5716. None,
  5717. ),
  5718. OSParser(
  5719. 'HbbTV/\\d+\\.\\d+\\.\\d+ \\( ;(LG)E ;NetCast 3.0',
  5720. None,
  5721. '2012',
  5722. None,
  5723. None,
  5724. None,
  5725. ),
  5726. OSParser(
  5727. 'HbbTV/1.1.1 \\(;;;;;\\) Maple_2011',
  5728. 'Samsung',
  5729. '2011',
  5730. None,
  5731. None,
  5732. None,
  5733. ),
  5734. OSParser(
  5735. 'HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC',
  5736. None,
  5737. None,
  5738. 'UE40F7000',
  5739. None,
  5740. None,
  5741. ),
  5742. OSParser(
  5743. 'HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC',
  5744. None,
  5745. None,
  5746. 'UE32F4500',
  5747. None,
  5748. None,
  5749. ),
  5750. OSParser(
  5751. 'HbbTV/1.1.1 \\(; (Philips);.*NETTV/4',
  5752. None,
  5753. '2013',
  5754. None,
  5755. None,
  5756. None,
  5757. ),
  5758. OSParser(
  5759. 'HbbTV/1.1.1 \\(; (Philips);.*NETTV/3',
  5760. None,
  5761. '2012',
  5762. None,
  5763. None,
  5764. None,
  5765. ),
  5766. OSParser(
  5767. 'HbbTV/1.1.1 \\(; (Philips);.*NETTV/2',
  5768. None,
  5769. '2011',
  5770. None,
  5771. None,
  5772. None,
  5773. ),
  5774. OSParser(
  5775. 'HbbTV/\\d+\\.\\d+\\.\\d+.*(firetv)-firefox-plugin (\\d+).(\\d+).(\\d+)',
  5776. 'FireHbbTV',
  5777. None,
  5778. None,
  5779. None,
  5780. None,
  5781. ),
  5782. OSParser(
  5783. 'HbbTV/\\d+\\.\\d+\\.\\d+ \\(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\\)',
  5784. None,
  5785. None,
  5786. None,
  5787. None,
  5788. None,
  5789. ),
  5790. OSParser(
  5791. '(Windows Phone) (?:OS[ /])?(\\d+)\\.(\\d+)',
  5792. None,
  5793. None,
  5794. None,
  5795. None,
  5796. None,
  5797. ),
  5798. OSParser(
  5799. '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+))?.*Outlook-iOS-Android',
  5800. 'iOS',
  5801. None,
  5802. None,
  5803. None,
  5804. None,
  5805. ),
  5806. OSParser(
  5807. '(Android)[ \\-/](\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+))?',
  5808. None,
  5809. None,
  5810. None,
  5811. None,
  5812. None,
  5813. ),
  5814. OSParser(
  5815. '(Android) Donut',
  5816. None,
  5817. '1',
  5818. '2',
  5819. None,
  5820. None,
  5821. ),
  5822. OSParser(
  5823. '(Android) Eclair',
  5824. None,
  5825. '2',
  5826. '1',
  5827. None,
  5828. None,
  5829. ),
  5830. OSParser(
  5831. '(Android) Froyo',
  5832. None,
  5833. '2',
  5834. '2',
  5835. None,
  5836. None,
  5837. ),
  5838. OSParser(
  5839. '(Android) Gingerbread',
  5840. None,
  5841. '2',
  5842. '3',
  5843. None,
  5844. None,
  5845. ),
  5846. OSParser(
  5847. '(Android) Honeycomb',
  5848. None,
  5849. '3',
  5850. None,
  5851. None,
  5852. None,
  5853. ),
  5854. OSParser(
  5855. '^UCWEB.*; (Adr) (\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+))?;',
  5856. 'Android',
  5857. None,
  5858. None,
  5859. None,
  5860. None,
  5861. ),
  5862. OSParser(
  5863. '^UCWEB.*; (iPad|iPh|iPd) OS (\\d+)_(\\d+)(?:_(\\d+))?;',
  5864. 'iOS',
  5865. None,
  5866. None,
  5867. None,
  5868. None,
  5869. ),
  5870. OSParser(
  5871. '^UCWEB.*; (wds) (\\d+)\\.(\\d+)(?:\\.(\\d+))?;',
  5872. 'Windows Phone',
  5873. None,
  5874. None,
  5875. None,
  5876. None,
  5877. ),
  5878. OSParser(
  5879. '^(JUC).*; ?U; ?(?:Android)?(\\d+)\\.(\\d+)(?:[\\.\\-]([a-z0-9]+))?',
  5880. 'Android',
  5881. None,
  5882. None,
  5883. None,
  5884. None,
  5885. ),
  5886. OSParser(
  5887. '(Silk-Accelerated=[a-z]{4,5})',
  5888. 'Android',
  5889. None,
  5890. None,
  5891. None,
  5892. None,
  5893. ),
  5894. OSParser(
  5895. '(XBLWP7)',
  5896. 'Windows Phone',
  5897. None,
  5898. None,
  5899. None,
  5900. None,
  5901. ),
  5902. OSParser(
  5903. '(Windows ?Mobile)',
  5904. 'Windows Mobile',
  5905. None,
  5906. None,
  5907. None,
  5908. None,
  5909. ),
  5910. OSParser(
  5911. '(Windows (?:NT 5\\.2|NT 5\\.1))',
  5912. 'Windows',
  5913. 'XP',
  5914. None,
  5915. None,
  5916. None,
  5917. ),
  5918. OSParser(
  5919. '(Windows NT 6\\.1)',
  5920. 'Windows',
  5921. '7',
  5922. None,
  5923. None,
  5924. None,
  5925. ),
  5926. OSParser(
  5927. '(Windows NT 6\\.0)',
  5928. 'Windows',
  5929. 'Vista',
  5930. None,
  5931. None,
  5932. None,
  5933. ),
  5934. OSParser(
  5935. '(Win 9x 4\\.90)',
  5936. 'Windows',
  5937. 'ME',
  5938. None,
  5939. None,
  5940. None,
  5941. ),
  5942. OSParser(
  5943. '(Windows 98|Windows XP|Windows ME|Windows 95|Windows CE|Windows 7|Windows NT 4\\.0|Windows Vista|Windows 2000|Windows 3.1)',
  5944. None,
  5945. None,
  5946. None,
  5947. None,
  5948. None,
  5949. ),
  5950. OSParser(
  5951. '(Windows NT 6\\.2; ARM;)',
  5952. 'Windows',
  5953. 'RT',
  5954. None,
  5955. None,
  5956. None,
  5957. ),
  5958. OSParser(
  5959. '(Windows NT 6\\.2)',
  5960. 'Windows',
  5961. '8',
  5962. None,
  5963. None,
  5964. None,
  5965. ),
  5966. OSParser(
  5967. '(Windows NT 6\\.3; ARM;)',
  5968. 'Windows',
  5969. 'RT 8.1',
  5970. None,
  5971. None,
  5972. None,
  5973. ),
  5974. OSParser(
  5975. '(Windows NT 6\\.3)',
  5976. 'Windows',
  5977. '8.1',
  5978. None,
  5979. None,
  5980. None,
  5981. ),
  5982. OSParser(
  5983. '(Windows NT 6\\.4)',
  5984. 'Windows',
  5985. '10',
  5986. None,
  5987. None,
  5988. None,
  5989. ),
  5990. OSParser(
  5991. '(Windows NT 10\\.0)',
  5992. 'Windows',
  5993. '10',
  5994. None,
  5995. None,
  5996. None,
  5997. ),
  5998. OSParser(
  5999. '(Windows NT 5\\.0)',
  6000. 'Windows',
  6001. '2000',
  6002. None,
  6003. None,
  6004. None,
  6005. ),
  6006. OSParser(
  6007. '(WinNT4.0)',
  6008. 'Windows',
  6009. 'NT 4.0',
  6010. None,
  6011. None,
  6012. None,
  6013. ),
  6014. OSParser(
  6015. '(Windows ?CE)',
  6016. 'Windows',
  6017. 'CE',
  6018. None,
  6019. None,
  6020. None,
  6021. ),
  6022. OSParser(
  6023. 'Win ?(95|98|3.1|NT|ME|2000)',
  6024. 'Windows',
  6025. '$1',
  6026. None,
  6027. None,
  6028. None,
  6029. ),
  6030. OSParser(
  6031. 'Win16',
  6032. 'Windows',
  6033. '3.1',
  6034. None,
  6035. None,
  6036. None,
  6037. ),
  6038. OSParser(
  6039. 'Win32',
  6040. 'Windows',
  6041. '95',
  6042. None,
  6043. None,
  6044. None,
  6045. ),
  6046. OSParser(
  6047. '^Box.*Windows/([\\d.]+);',
  6048. 'Windows',
  6049. '$1',
  6050. None,
  6051. None,
  6052. None,
  6053. ),
  6054. OSParser(
  6055. '(Tizen)[/ ](\\d+)\\.(\\d+)',
  6056. None,
  6057. None,
  6058. None,
  6059. None,
  6060. None,
  6061. ),
  6062. OSParser(
  6063. '((?:Mac[ +]?|; )OS[ +]X)[\\s+/](?:(\\d+)[_.](\\d+)(?:[_.](\\d+))?|Mach-O)',
  6064. 'Mac OS X',
  6065. None,
  6066. None,
  6067. None,
  6068. None,
  6069. ),
  6070. OSParser(
  6071. ' (Dar)(win)/(9).(\\d+).*\\((?:i386|x86_64|Power Macintosh)\\)',
  6072. 'Mac OS X',
  6073. '10',
  6074. '5',
  6075. None,
  6076. None,
  6077. ),
  6078. OSParser(
  6079. ' (Dar)(win)/(10).(\\d+).*\\((?:i386|x86_64)\\)',
  6080. 'Mac OS X',
  6081. '10',
  6082. '6',
  6083. None,
  6084. None,
  6085. ),
  6086. OSParser(
  6087. ' (Dar)(win)/(11).(\\d+).*\\((?:i386|x86_64)\\)',
  6088. 'Mac OS X',
  6089. '10',
  6090. '7',
  6091. None,
  6092. None,
  6093. ),
  6094. OSParser(
  6095. ' (Dar)(win)/(12).(\\d+).*\\((?:i386|x86_64)\\)',
  6096. 'Mac OS X',
  6097. '10',
  6098. '8',
  6099. None,
  6100. None,
  6101. ),
  6102. OSParser(
  6103. ' (Dar)(win)/(13).(\\d+).*\\((?:i386|x86_64)\\)',
  6104. 'Mac OS X',
  6105. '10',
  6106. '9',
  6107. None,
  6108. None,
  6109. ),
  6110. OSParser(
  6111. 'Mac_PowerPC',
  6112. 'Mac OS',
  6113. None,
  6114. None,
  6115. None,
  6116. None,
  6117. ),
  6118. OSParser(
  6119. '(?:PPC|Intel) (Mac OS X)',
  6120. None,
  6121. None,
  6122. None,
  6123. None,
  6124. None,
  6125. ),
  6126. OSParser(
  6127. '^Box.*;(Darwin)/(10)\\.(1\\d)(?:\\.(\\d+))?',
  6128. 'Mac OS X',
  6129. None,
  6130. None,
  6131. None,
  6132. None,
  6133. ),
  6134. OSParser(
  6135. '(Apple\\s?TV)(?:/(\\d+)\\.(\\d+))?',
  6136. 'ATV OS X',
  6137. None,
  6138. None,
  6139. None,
  6140. None,
  6141. ),
  6142. OSParser(
  6143. '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+))?',
  6144. 'iOS',
  6145. None,
  6146. None,
  6147. None,
  6148. None,
  6149. ),
  6150. OSParser(
  6151. '(iPhone|iPad|iPod); Opera',
  6152. 'iOS',
  6153. None,
  6154. None,
  6155. None,
  6156. None,
  6157. ),
  6158. OSParser(
  6159. '(iPhone|iPad|iPod).*Mac OS X.*Version/(\\d+)\\.(\\d+)',
  6160. 'iOS',
  6161. None,
  6162. None,
  6163. None,
  6164. None,
  6165. ),
  6166. OSParser(
  6167. '(CFNetwork)/(5)48\\.0\\.3.* Darwin/11\\.0\\.0',
  6168. 'iOS',
  6169. None,
  6170. None,
  6171. None,
  6172. None,
  6173. ),
  6174. OSParser(
  6175. '(CFNetwork)/(5)48\\.(0)\\.4.* Darwin/(1)1\\.0\\.0',
  6176. 'iOS',
  6177. None,
  6178. None,
  6179. None,
  6180. None,
  6181. ),
  6182. OSParser(
  6183. '(CFNetwork)/(5)48\\.(1)\\.4',
  6184. 'iOS',
  6185. None,
  6186. None,
  6187. None,
  6188. None,
  6189. ),
  6190. OSParser(
  6191. '(CFNetwork)/(4)85\\.1(3)\\.9',
  6192. 'iOS',
  6193. None,
  6194. None,
  6195. None,
  6196. None,
  6197. ),
  6198. OSParser(
  6199. '(CFNetwork)/(6)09\\.(1)\\.4',
  6200. 'iOS',
  6201. None,
  6202. None,
  6203. None,
  6204. None,
  6205. ),
  6206. OSParser(
  6207. '(CFNetwork)/(6)(0)9',
  6208. 'iOS',
  6209. None,
  6210. None,
  6211. None,
  6212. None,
  6213. ),
  6214. OSParser(
  6215. '(CFNetwork)/6(7)2\\.(1)\\.13',
  6216. 'iOS',
  6217. None,
  6218. None,
  6219. None,
  6220. None,
  6221. ),
  6222. OSParser(
  6223. '(CFNetwork)/6(7)2\\.(1)\\.(1)4',
  6224. 'iOS',
  6225. None,
  6226. None,
  6227. None,
  6228. None,
  6229. ),
  6230. OSParser(
  6231. '(CF)(Network)/6(7)(2)\\.1\\.15',
  6232. 'iOS',
  6233. '7',
  6234. '1',
  6235. None,
  6236. None,
  6237. ),
  6238. OSParser(
  6239. '(CFNetwork)/6(7)2\\.(0)\\.(?:2|8)',
  6240. 'iOS',
  6241. None,
  6242. None,
  6243. None,
  6244. None,
  6245. ),
  6246. OSParser(
  6247. '(CFNetwork)/709\\.1',
  6248. 'iOS',
  6249. '8',
  6250. '0.b5',
  6251. None,
  6252. None,
  6253. ),
  6254. OSParser(
  6255. '(CF)(Network)/711\\.(\\d)',
  6256. 'iOS',
  6257. '8',
  6258. None,
  6259. None,
  6260. None,
  6261. ),
  6262. OSParser(
  6263. '(CF)(Network)/(720)\\.(\\d)',
  6264. 'Mac OS X',
  6265. '10',
  6266. '10',
  6267. None,
  6268. None,
  6269. ),
  6270. OSParser(
  6271. '(CF)(Network)/(760)\\.(\\d)',
  6272. 'Mac OS X',
  6273. '10',
  6274. '11',
  6275. None,
  6276. None,
  6277. ),
  6278. OSParser(
  6279. '(CF)(Network)/758\\.(\\d)',
  6280. 'iOS',
  6281. '9',
  6282. None,
  6283. None,
  6284. None,
  6285. ),
  6286. OSParser(
  6287. '(CF)(Network)/808\\.(\\d)',
  6288. 'iOS',
  6289. '10',
  6290. None,
  6291. None,
  6292. None,
  6293. ),
  6294. OSParser(
  6295. 'CFNetwork/.* Darwin/17\\.\\d+.*\\(x86_64\\)',
  6296. 'Mac OS X',
  6297. '10',
  6298. '13',
  6299. None,
  6300. None,
  6301. ),
  6302. OSParser(
  6303. 'CFNetwork/.* Darwin/16\\.\\d+.*\\(x86_64\\)',
  6304. 'Mac OS X',
  6305. '10',
  6306. '12',
  6307. None,
  6308. None,
  6309. ),
  6310. OSParser(
  6311. 'CFNetwork/8.* Darwin/15\\.\\d+.*\\(x86_64\\)',
  6312. 'Mac OS X',
  6313. '10',
  6314. '11',
  6315. None,
  6316. None,
  6317. ),
  6318. OSParser(
  6319. 'CFNetwork/.* Darwin/(9)\\.\\d+',
  6320. 'iOS',
  6321. '1',
  6322. None,
  6323. None,
  6324. None,
  6325. ),
  6326. OSParser(
  6327. 'CFNetwork/.* Darwin/(10)\\.\\d+',
  6328. 'iOS',
  6329. '4',
  6330. None,
  6331. None,
  6332. None,
  6333. ),
  6334. OSParser(
  6335. 'CFNetwork/.* Darwin/(11)\\.\\d+',
  6336. 'iOS',
  6337. '5',
  6338. None,
  6339. None,
  6340. None,
  6341. ),
  6342. OSParser(
  6343. 'CFNetwork/.* Darwin/(13)\\.\\d+',
  6344. 'iOS',
  6345. '6',
  6346. None,
  6347. None,
  6348. None,
  6349. ),
  6350. OSParser(
  6351. 'CFNetwork/6.* Darwin/(14)\\.\\d+',
  6352. 'iOS',
  6353. '7',
  6354. None,
  6355. None,
  6356. None,
  6357. ),
  6358. OSParser(
  6359. 'CFNetwork/7.* Darwin/(14)\\.\\d+',
  6360. 'iOS',
  6361. '8',
  6362. '0',
  6363. None,
  6364. None,
  6365. ),
  6366. OSParser(
  6367. 'CFNetwork/7.* Darwin/(15)\\.\\d+',
  6368. 'iOS',
  6369. '9',
  6370. '0',
  6371. None,
  6372. None,
  6373. ),
  6374. OSParser(
  6375. 'CFNetwork/8.* Darwin/16\\.5\\.\\d+',
  6376. 'iOS',
  6377. '10',
  6378. '3',
  6379. None,
  6380. None,
  6381. ),
  6382. OSParser(
  6383. 'CFNetwork/8.* Darwin/16\\.6\\.\\d+',
  6384. 'iOS',
  6385. '10',
  6386. '3',
  6387. '2',
  6388. None,
  6389. ),
  6390. OSParser(
  6391. 'CFNetwork/8.* Darwin/16\\.7\\.\\d+',
  6392. 'iOS',
  6393. '10',
  6394. '3',
  6395. '3',
  6396. None,
  6397. ),
  6398. OSParser(
  6399. 'CFNetwork/8.* Darwin/(16)\\.\\d+',
  6400. 'iOS',
  6401. '10',
  6402. None,
  6403. None,
  6404. None,
  6405. ),
  6406. OSParser(
  6407. 'CFNetwork/8.* Darwin/17\\.0\\.\\d+',
  6408. 'iOS',
  6409. '11',
  6410. '0',
  6411. None,
  6412. None,
  6413. ),
  6414. OSParser(
  6415. 'CFNetwork/8.* Darwin/17\\.2\\.\\d+',
  6416. 'iOS',
  6417. '11',
  6418. '1',
  6419. None,
  6420. None,
  6421. ),
  6422. OSParser(
  6423. 'CFNetwork/8.* Darwin/17\\.3\\.\\d+',
  6424. 'iOS',
  6425. '11',
  6426. '2',
  6427. None,
  6428. None,
  6429. ),
  6430. OSParser(
  6431. 'CFNetwork/8.* Darwin/(17)\\.\\d+',
  6432. 'iOS',
  6433. '11',
  6434. None,
  6435. None,
  6436. None,
  6437. ),
  6438. OSParser(
  6439. 'CFNetwork/.* Darwin/',
  6440. 'iOS',
  6441. None,
  6442. None,
  6443. None,
  6444. None,
  6445. ),
  6446. OSParser(
  6447. '\\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\\d,\\d/|\\d,\\d; )|iPad/)(\\d{1,2})[_\\.](\\d{1,2})(?:[_\\.](\\d+))?',
  6448. 'iOS',
  6449. None,
  6450. None,
  6451. None,
  6452. None,
  6453. ),
  6454. OSParser(
  6455. '\\((iOS);',
  6456. None,
  6457. None,
  6458. None,
  6459. None,
  6460. None,
  6461. ),
  6462. OSParser(
  6463. 'Outlook-(iOS)/\\d+\\.\\d+\\.prod\\.iphone',
  6464. None,
  6465. None,
  6466. None,
  6467. None,
  6468. None,
  6469. ),
  6470. OSParser(
  6471. '(tvOS)/(\\d+).(\\d+)',
  6472. 'tvOS',
  6473. None,
  6474. None,
  6475. None,
  6476. None,
  6477. ),
  6478. OSParser(
  6479. '(CrOS) [a-z0-9_]+ (\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  6480. 'Chrome OS',
  6481. None,
  6482. None,
  6483. None,
  6484. None,
  6485. ),
  6486. OSParser(
  6487. '([Dd]ebian)',
  6488. 'Debian',
  6489. None,
  6490. None,
  6491. None,
  6492. None,
  6493. ),
  6494. OSParser(
  6495. '(Linux Mint)(?:/(\\d+))?',
  6496. None,
  6497. None,
  6498. None,
  6499. None,
  6500. None,
  6501. ),
  6502. OSParser(
  6503. '(Mandriva)(?: Linux)?/(?:[\\d.-]+m[a-z]{2}(\\d+).(\\d))?',
  6504. None,
  6505. None,
  6506. None,
  6507. None,
  6508. None,
  6509. ),
  6510. OSParser(
  6511. '(Symbian[Oo][Ss])[/ ](\\d+)\\.(\\d+)',
  6512. 'Symbian OS',
  6513. None,
  6514. None,
  6515. None,
  6516. None,
  6517. ),
  6518. OSParser(
  6519. '(Symbian/3).+NokiaBrowser/7\\.3',
  6520. 'Symbian^3 Anna',
  6521. None,
  6522. None,
  6523. None,
  6524. None,
  6525. ),
  6526. OSParser(
  6527. '(Symbian/3).+NokiaBrowser/7\\.4',
  6528. 'Symbian^3 Belle',
  6529. None,
  6530. None,
  6531. None,
  6532. None,
  6533. ),
  6534. OSParser(
  6535. '(Symbian/3)',
  6536. 'Symbian^3',
  6537. None,
  6538. None,
  6539. None,
  6540. None,
  6541. ),
  6542. OSParser(
  6543. '\\b(Series 60|SymbOS|S60Version|S60V\\d|S60\\b)',
  6544. 'Symbian OS',
  6545. None,
  6546. None,
  6547. None,
  6548. None,
  6549. ),
  6550. OSParser(
  6551. '(MeeGo)',
  6552. None,
  6553. None,
  6554. None,
  6555. None,
  6556. None,
  6557. ),
  6558. OSParser(
  6559. 'Symbian [Oo][Ss]',
  6560. 'Symbian OS',
  6561. None,
  6562. None,
  6563. None,
  6564. None,
  6565. ),
  6566. OSParser(
  6567. 'Series40;',
  6568. 'Nokia Series 40',
  6569. None,
  6570. None,
  6571. None,
  6572. None,
  6573. ),
  6574. OSParser(
  6575. 'Series30Plus;',
  6576. 'Nokia Series 30 Plus',
  6577. None,
  6578. None,
  6579. None,
  6580. None,
  6581. ),
  6582. OSParser(
  6583. '(BB10);.+Version/(\\d+)\\.(\\d+)\\.(\\d+)',
  6584. 'BlackBerry OS',
  6585. None,
  6586. None,
  6587. None,
  6588. None,
  6589. ),
  6590. OSParser(
  6591. '(Black[Bb]erry)[0-9a-z]+/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  6592. 'BlackBerry OS',
  6593. None,
  6594. None,
  6595. None,
  6596. None,
  6597. ),
  6598. OSParser(
  6599. '(Black[Bb]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  6600. 'BlackBerry OS',
  6601. None,
  6602. None,
  6603. None,
  6604. None,
  6605. ),
  6606. OSParser(
  6607. '(RIM Tablet OS) (\\d+)\\.(\\d+)\\.(\\d+)',
  6608. 'BlackBerry Tablet OS',
  6609. None,
  6610. None,
  6611. None,
  6612. None,
  6613. ),
  6614. OSParser(
  6615. '(Play[Bb]ook)',
  6616. 'BlackBerry Tablet OS',
  6617. None,
  6618. None,
  6619. None,
  6620. None,
  6621. ),
  6622. OSParser(
  6623. '(Black[Bb]erry)',
  6624. 'BlackBerry OS',
  6625. None,
  6626. None,
  6627. None,
  6628. None,
  6629. ),
  6630. OSParser(
  6631. '\\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\\d+\\.\\d+',
  6632. 'Firefox OS',
  6633. '1',
  6634. '0',
  6635. '1',
  6636. None,
  6637. ),
  6638. OSParser(
  6639. '\\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\\d+\\.\\d+',
  6640. 'Firefox OS',
  6641. '1',
  6642. '1',
  6643. None,
  6644. None,
  6645. ),
  6646. OSParser(
  6647. '\\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\\d+\\.\\d+',
  6648. 'Firefox OS',
  6649. '1',
  6650. '2',
  6651. None,
  6652. None,
  6653. ),
  6654. OSParser(
  6655. '\\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\\d+\\.\\d+',
  6656. 'Firefox OS',
  6657. '1',
  6658. '3',
  6659. None,
  6660. None,
  6661. ),
  6662. OSParser(
  6663. '\\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\\d+\\.\\d+',
  6664. 'Firefox OS',
  6665. '1',
  6666. '4',
  6667. None,
  6668. None,
  6669. ),
  6670. OSParser(
  6671. '\\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\\d+\\.\\d+',
  6672. 'Firefox OS',
  6673. '2',
  6674. '0',
  6675. None,
  6676. None,
  6677. ),
  6678. OSParser(
  6679. '\\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\\d+\\.\\d+',
  6680. 'Firefox OS',
  6681. '2',
  6682. '1',
  6683. None,
  6684. None,
  6685. ),
  6686. OSParser(
  6687. '\\((?:Mobile|Tablet);.+Firefox/\\d+\\.\\d+',
  6688. 'Firefox OS',
  6689. None,
  6690. None,
  6691. None,
  6692. None,
  6693. ),
  6694. OSParser(
  6695. '(BREW)[ /](\\d+)\\.(\\d+)\\.(\\d+)',
  6696. None,
  6697. None,
  6698. None,
  6699. None,
  6700. None,
  6701. ),
  6702. OSParser(
  6703. '(BREW);',
  6704. None,
  6705. None,
  6706. None,
  6707. None,
  6708. None,
  6709. ),
  6710. OSParser(
  6711. '(Brew MP|BMP)[ /](\\d+)\\.(\\d+)\\.(\\d+)',
  6712. 'Brew MP',
  6713. None,
  6714. None,
  6715. None,
  6716. None,
  6717. ),
  6718. OSParser(
  6719. 'BMP;',
  6720. 'Brew MP',
  6721. None,
  6722. None,
  6723. None,
  6724. None,
  6725. ),
  6726. OSParser(
  6727. '(GoogleTV)(?: (\\d+)\\.(\\d+)(?:\\.(\\d+))?|/[\\da-z]+)',
  6728. None,
  6729. None,
  6730. None,
  6731. None,
  6732. None,
  6733. ),
  6734. OSParser(
  6735. '(WebTV)/(\\d+).(\\d+)',
  6736. None,
  6737. None,
  6738. None,
  6739. None,
  6740. None,
  6741. ),
  6742. OSParser(
  6743. '(CrKey)(?:[/](\\d+)\\.(\\d+)(?:\\.(\\d+))?)?',
  6744. 'Chromecast',
  6745. None,
  6746. None,
  6747. None,
  6748. None,
  6749. ),
  6750. OSParser(
  6751. '(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+))?',
  6752. 'webOS',
  6753. None,
  6754. None,
  6755. None,
  6756. None,
  6757. ),
  6758. OSParser(
  6759. '(VRE);',
  6760. None,
  6761. None,
  6762. None,
  6763. None,
  6764. None,
  6765. ),
  6766. OSParser(
  6767. '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\\b)BSD)[/ ](\\d+)\\.(\\d+)(?:\\.(\\d+)(?:\\.(\\d+))?)?',
  6768. None,
  6769. None,
  6770. None,
  6771. None,
  6772. None,
  6773. ),
  6774. OSParser(
  6775. '(Linux)[ /](\\d+)\\.(\\d+)(?:\\.(\\d+))?.*gentoo',
  6776. 'Gentoo',
  6777. None,
  6778. None,
  6779. None,
  6780. None,
  6781. ),
  6782. OSParser(
  6783. '\\((Bada);',
  6784. None,
  6785. None,
  6786. None,
  6787. None,
  6788. None,
  6789. ),
  6790. OSParser(
  6791. '(Windows|Android|WeTab|Maemo|Web0S)',
  6792. None,
  6793. None,
  6794. None,
  6795. None,
  6796. None,
  6797. ),
  6798. OSParser(
  6799. '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\\b)BSD)',
  6800. None,
  6801. None,
  6802. None,
  6803. None,
  6804. None,
  6805. ),
  6806. OSParser(
  6807. '(Linux)(?:[ /](\\d+)\\.(\\d+)(?:\\.(\\d+))?)?',
  6808. None,
  6809. None,
  6810. None,
  6811. None,
  6812. None,
  6813. ),
  6814. OSParser(
  6815. 'SunOS',
  6816. 'Solaris',
  6817. None,
  6818. None,
  6819. None,
  6820. None,
  6821. ),
  6822. OSParser(
  6823. '^(Roku)/DVP-(\\d+)\\.(\\d+)',
  6824. None,
  6825. None,
  6826. None,
  6827. None,
  6828. None,
  6829. ),
  6830. ]