single-file-extension-editor-helper.js 925 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688
  1. (function (global, factory) {
  2. typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  3. typeof define === 'function' && define.amd ? define(['exports'], factory) :
  4. (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.singlefile = {}));
  5. })(this, (function (exports) { 'use strict';
  6. /*
  7. * Copyright 2010-2022 Gildas Lormeau
  8. * contact : gildas.lormeau <at> gmail.com
  9. *
  10. * This file is part of SingleFile.
  11. *
  12. * The code in this file is free software: you can redistribute it and/or
  13. * modify it under the terms of the GNU Affero General Public License
  14. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  15. * of the License, or (at your option) any later version.
  16. *
  17. * The code in this file is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  20. * General Public License for more details.
  21. *
  22. * As additional permission under GNU AGPL version 3 section 7, you may
  23. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  24. * AGPL normally required by section 4, provided you include this license
  25. * notice and a URL through which recipients can access the Corresponding
  26. * Source.
  27. */
  28. const SELF_CLOSED_TAG_NAMES = ["AREA", "BASE", "BR", "COL", "COMMAND", "EMBED", "HR", "IMG", "INPUT", "KEYGEN", "LINK", "META", "PARAM", "SOURCE", "TRACK", "WBR"];
  29. const Node_ELEMENT_NODE$1 = 1;
  30. const Node_TEXT_NODE$1 = 3;
  31. const Node_COMMENT_NODE$1 = 8;
  32. // see https://www.w3.org/TR/html5/syntax.html#optional-tags
  33. const OMITTED_START_TAGS = [
  34. { tagName: "HEAD", accept: element => !element.childNodes.length || element.childNodes[0].nodeType == Node_ELEMENT_NODE$1 },
  35. { tagName: "BODY", accept: element => !element.childNodes.length }
  36. ];
  37. const OMITTED_END_TAGS = [
  38. { tagName: "HTML", accept: next => !next || next.nodeType != Node_COMMENT_NODE$1 },
  39. { tagName: "HEAD", accept: next => !next || (next.nodeType != Node_COMMENT_NODE$1 && (next.nodeType != Node_TEXT_NODE$1 || !startsWithSpaceChar(next.textContent))) },
  40. { tagName: "BODY", accept: next => !next || next.nodeType != Node_COMMENT_NODE$1 },
  41. { tagName: "LI", accept: (next, element) => (!next && element.parentElement && (getTagName$1(element.parentElement) == "UL" || getTagName$1(element.parentElement) == "OL")) || (next && ["LI"].includes(getTagName$1(next))) },
  42. { tagName: "DT", accept: next => !next || ["DT", "DD"].includes(getTagName$1(next)) },
  43. { tagName: "P", accept: next => next && ["ADDRESS", "ARTICLE", "ASIDE", "BLOCKQUOTE", "DETAILS", "DIV", "DL", "FIELDSET", "FIGCAPTION", "FIGURE", "FOOTER", "FORM", "H1", "H2", "H3", "H4", "H5", "H6", "HEADER", "HR", "MAIN", "NAV", "OL", "P", "PRE", "SECTION", "TABLE", "UL"].includes(getTagName$1(next)) },
  44. { tagName: "DD", accept: next => !next || ["DT", "DD"].includes(getTagName$1(next)) },
  45. { tagName: "RT", accept: next => !next || ["RT", "RP"].includes(getTagName$1(next)) },
  46. { tagName: "RP", accept: next => !next || ["RT", "RP"].includes(getTagName$1(next)) },
  47. { tagName: "OPTGROUP", accept: next => !next || ["OPTGROUP"].includes(getTagName$1(next)) },
  48. { tagName: "OPTION", accept: next => !next || ["OPTION", "OPTGROUP"].includes(getTagName$1(next)) },
  49. { tagName: "COLGROUP", accept: next => !next || (next.nodeType != Node_COMMENT_NODE$1 && (next.nodeType != Node_TEXT_NODE$1 || !startsWithSpaceChar(next.textContent))) },
  50. { tagName: "CAPTION", accept: next => !next || (next.nodeType != Node_COMMENT_NODE$1 && (next.nodeType != Node_TEXT_NODE$1 || !startsWithSpaceChar(next.textContent))) },
  51. { tagName: "THEAD", accept: next => !next || ["TBODY", "TFOOT"].includes(getTagName$1(next)) },
  52. { tagName: "TBODY", accept: next => !next || ["TBODY", "TFOOT"].includes(getTagName$1(next)) },
  53. { tagName: "TFOOT", accept: next => !next },
  54. { tagName: "TR", accept: next => !next || ["TR"].includes(getTagName$1(next)) },
  55. { tagName: "TD", accept: next => !next || ["TD", "TH"].includes(getTagName$1(next)) },
  56. { tagName: "TH", accept: next => !next || ["TD", "TH"].includes(getTagName$1(next)) }
  57. ];
  58. const TEXT_NODE_TAGS = ["STYLE", "SCRIPT", "XMP", "IFRAME", "NOEMBED", "NOFRAMES", "PLAINTEXT", "NOSCRIPT"];
  59. function process$7(doc, compressHTML) {
  60. const docType = doc.doctype;
  61. let docTypeString = "";
  62. if (docType) {
  63. docTypeString = "<!DOCTYPE " + docType.nodeName;
  64. if (docType.publicId) {
  65. docTypeString += " PUBLIC \"" + docType.publicId + "\"";
  66. if (docType.systemId)
  67. docTypeString += " \"" + docType.systemId + "\"";
  68. } else if (docType.systemId)
  69. docTypeString += " SYSTEM \"" + docType.systemId + "\"";
  70. if (docType.internalSubset)
  71. docTypeString += " [" + docType.internalSubset + "]";
  72. docTypeString += "> ";
  73. }
  74. return docTypeString + serialize(doc.documentElement, compressHTML);
  75. }
  76. function serialize(node, compressHTML, isSVG) {
  77. if (node.nodeType == Node_TEXT_NODE$1) {
  78. return serializeTextNode(node);
  79. } else if (node.nodeType == Node_COMMENT_NODE$1) {
  80. return serializeCommentNode(node);
  81. } else if (node.nodeType == Node_ELEMENT_NODE$1) {
  82. return serializeElement(node, compressHTML, isSVG);
  83. }
  84. }
  85. function serializeTextNode(textNode) {
  86. const parentNode = textNode.parentNode;
  87. let parentTagName;
  88. if (parentNode && parentNode.nodeType == Node_ELEMENT_NODE$1) {
  89. parentTagName = getTagName$1(parentNode);
  90. }
  91. if (!parentTagName || TEXT_NODE_TAGS.includes(parentTagName)) {
  92. if (parentTagName == "SCRIPT" || parentTagName == "STYLE") {
  93. return textNode.textContent.replace(/<\//gi, "<\\/").replace(/\/>/gi, "\\/>");
  94. }
  95. return textNode.textContent;
  96. } else {
  97. return textNode.textContent.replace(/&/g, "&amp;").replace(/\u00a0/g, "&nbsp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
  98. }
  99. }
  100. function serializeCommentNode(commentNode) {
  101. return "<!--" + commentNode.textContent + "-->";
  102. }
  103. function serializeElement(element, compressHTML, isSVG) {
  104. const tagName = getTagName$1(element);
  105. const omittedStartTag = compressHTML && OMITTED_START_TAGS.find(omittedStartTag => tagName == getTagName$1(omittedStartTag) && omittedStartTag.accept(element));
  106. let content = "";
  107. if (!omittedStartTag || element.attributes.length) {
  108. content = "<" + tagName.toLowerCase();
  109. Array.from(element.attributes).forEach(attribute => content += serializeAttribute(attribute, element, compressHTML));
  110. content += ">";
  111. }
  112. if (tagName == "TEMPLATE" && !element.childNodes.length) {
  113. content += element.innerHTML;
  114. } else {
  115. Array.from(element.childNodes).forEach(childNode => content += serialize(childNode, compressHTML, isSVG || tagName == "svg"));
  116. }
  117. const omittedEndTag = compressHTML && OMITTED_END_TAGS.find(omittedEndTag => tagName == getTagName$1(omittedEndTag) && omittedEndTag.accept(element.nextSibling, element));
  118. if (isSVG || (!omittedEndTag && !SELF_CLOSED_TAG_NAMES.includes(tagName))) {
  119. content += "</" + tagName.toLowerCase() + ">";
  120. }
  121. return content;
  122. }
  123. function serializeAttribute(attribute, element, compressHTML) {
  124. const name = attribute.name;
  125. let content = "";
  126. if (!name.match(/["'>/=]/)) {
  127. let value = attribute.value;
  128. if (compressHTML && name == "class") {
  129. value = Array.from(element.classList).map(className => className.trim()).join(" ");
  130. }
  131. let simpleQuotesValue;
  132. value = value.replace(/&/g, "&amp;").replace(/\u00a0/g, "&nbsp;");
  133. if (value.includes("\"")) {
  134. if (value.includes("'") || !compressHTML) {
  135. value = value.replace(/"/g, "&quot;");
  136. } else {
  137. simpleQuotesValue = true;
  138. }
  139. }
  140. const invalidUnquotedValue = !compressHTML || value.match(/[ \t\n\f\r'"`=<>]/);
  141. content += " ";
  142. if (!attribute.namespace) {
  143. content += name;
  144. } else if (attribute.namespaceURI == "http://www.w3.org/XML/1998/namespace") {
  145. content += "xml:" + name;
  146. } else if (attribute.namespaceURI == "http://www.w3.org/2000/xmlns/") {
  147. if (name !== "xmlns") {
  148. content += "xmlns:";
  149. }
  150. content += name;
  151. } else if (attribute.namespaceURI == "http://www.w3.org/1999/xlink") {
  152. content += "xlink:" + name;
  153. } else {
  154. content += name;
  155. }
  156. if (value != "") {
  157. content += "=";
  158. if (invalidUnquotedValue) {
  159. content += simpleQuotesValue ? "'" : "\"";
  160. }
  161. content += value;
  162. if (invalidUnquotedValue) {
  163. content += simpleQuotesValue ? "'" : "\"";
  164. }
  165. }
  166. }
  167. return content;
  168. }
  169. function startsWithSpaceChar(textContent) {
  170. return Boolean(textContent.match(/^[ \t\n\f\r]/));
  171. }
  172. function getTagName$1(element) {
  173. return element.tagName && element.tagName.toUpperCase();
  174. }
  175. /*
  176. * Copyright 2010-2022 Gildas Lormeau
  177. * contact : gildas.lormeau <at> gmail.com
  178. *
  179. * This file is part of SingleFile.
  180. *
  181. * The code in this file is free software: you can redistribute it and/or
  182. * modify it under the terms of the GNU Affero General Public License
  183. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  184. * of the License, or (at your option) any later version.
  185. *
  186. * The code in this file is distributed in the hope that it will be useful,
  187. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  188. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  189. * General Public License for more details.
  190. *
  191. * As additional permission under GNU AGPL version 3 section 7, you may
  192. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  193. * AGPL normally required by section 4, provided you include this license
  194. * notice and a URL through which recipients can access the Corresponding
  195. * Source.
  196. */
  197. function peg$subclass(child, parent) {
  198. function ctor() { this.constructor = child; }
  199. ctor.prototype = parent.prototype;
  200. child.prototype = new ctor();
  201. }
  202. function peg$SyntaxError(message, expected, found, location) {
  203. this.message = message;
  204. this.expected = expected;
  205. this.found = found;
  206. this.location = location;
  207. this.name = "SyntaxError";
  208. if (typeof Error.captureStackTrace === "function") {
  209. Error.captureStackTrace(this, peg$SyntaxError);
  210. }
  211. }
  212. peg$subclass(peg$SyntaxError, Error);
  213. peg$SyntaxError.buildMessage = function (expected, found) {
  214. var DESCRIBE_EXPECTATION_FNS = {
  215. literal: function (expectation) {
  216. return "\"" + literalEscape(expectation.text) + "\"";
  217. },
  218. "class": function (expectation) {
  219. var escapedParts = "",
  220. i;
  221. for (i = 0; i < expectation.parts.length; i++) {
  222. escapedParts += expectation.parts[i] instanceof Array
  223. ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1])
  224. : classEscape(expectation.parts[i]);
  225. }
  226. return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
  227. },
  228. any: function () {
  229. return "any character";
  230. },
  231. end: function () {
  232. return "end of input";
  233. },
  234. other: function (expectation) {
  235. return expectation.description;
  236. }
  237. };
  238. function hex(ch) {
  239. return ch.charCodeAt(0).toString(16).toUpperCase();
  240. }
  241. function literalEscape(s) {
  242. return s
  243. .replace(/\\/g, "\\\\")
  244. .replace(/"/g, "\\\"")
  245. .replace(/\0/g, "\\0")
  246. .replace(/\t/g, "\\t")
  247. .replace(/\n/g, "\\n")
  248. .replace(/\r/g, "\\r")
  249. .replace(/[\x00-\x0F]/g, function (ch) { return "\\x0" + hex(ch); })
  250. .replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { return "\\x" + hex(ch); });
  251. }
  252. function classEscape(s) {
  253. return s
  254. .replace(/\\/g, "\\\\")
  255. .replace(/\]/g, "\\]")
  256. .replace(/\^/g, "\\^")
  257. .replace(/-/g, "\\-")
  258. .replace(/\0/g, "\\0")
  259. .replace(/\t/g, "\\t")
  260. .replace(/\n/g, "\\n")
  261. .replace(/\r/g, "\\r")
  262. .replace(/[\x00-\x0F]/g, function (ch) { return "\\x0" + hex(ch); })
  263. .replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { return "\\x" + hex(ch); });
  264. }
  265. function describeExpectation(expectation) {
  266. return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
  267. }
  268. function describeExpected(expected) {
  269. var descriptions = new Array(expected.length),
  270. i, j;
  271. for (i = 0; i < expected.length; i++) {
  272. descriptions[i] = describeExpectation(expected[i]);
  273. }
  274. descriptions.sort();
  275. if (descriptions.length > 0) {
  276. for (i = 1, j = 1; i < descriptions.length; i++) {
  277. if (descriptions[i - 1] !== descriptions[i]) {
  278. descriptions[j] = descriptions[i];
  279. j++;
  280. }
  281. }
  282. descriptions.length = j;
  283. }
  284. switch (descriptions.length) {
  285. case 1:
  286. return descriptions[0];
  287. case 2:
  288. return descriptions[0] + " or " + descriptions[1];
  289. default:
  290. return descriptions.slice(0, -1).join(", ")
  291. + ", or "
  292. + descriptions[descriptions.length - 1];
  293. }
  294. }
  295. function describeFound(found) {
  296. return found ? "\"" + literalEscape(found) + "\"" : "end of input";
  297. }
  298. return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
  299. };
  300. async function peg$parse(input, options) {
  301. options = options !== void 0 ? options : {};
  302. var peg$FAILED = {},
  303. peg$startRuleFunctions = { start: peg$parsestart },
  304. peg$startRuleFunction = peg$parsestart,
  305. peg$c0 = function (expression) { return expression.join(""); },
  306. peg$c1 = "|",
  307. peg$c2 = peg$literalExpectation("|", false),
  308. peg$c3 = function (value) { return value; },
  309. peg$c4 = "%",
  310. peg$c5 = peg$literalExpectation("%", false),
  311. peg$c6 = "<",
  312. peg$c7 = peg$literalExpectation("<", false),
  313. peg$c8 = ">",
  314. peg$c9 = peg$literalExpectation(">", false),
  315. peg$c10 = function (name, args, length) { return options.callFunction(name, args, length); },
  316. peg$c11 = "{",
  317. peg$c12 = peg$literalExpectation("{", false),
  318. peg$c13 = "}",
  319. peg$c14 = peg$literalExpectation("}", false),
  320. peg$c15 = function (name, length) { return options.getVariableValue(name, length); },
  321. peg$c16 = "[",
  322. peg$c17 = peg$literalExpectation("[", false),
  323. peg$c18 = "]",
  324. peg$c19 = peg$literalExpectation("]", false),
  325. peg$c20 = function (length, unit) { return { length, unit }; },
  326. peg$c21 = "ch",
  327. peg$c22 = peg$literalExpectation("ch", false),
  328. peg$c23 = /^[a-z0-9-]/,
  329. peg$c24 = peg$classExpectation([["a", "z"], ["0", "9"], "-"], false, false),
  330. peg$c25 = function () { return text(); },
  331. peg$c26 = /^[0-9]/,
  332. peg$c27 = peg$classExpectation([["0", "9"]], false, false),
  333. peg$c28 = function () { return Number(text()); },
  334. peg$c29 = "\\\\%",
  335. peg$c30 = peg$literalExpectation("\\\\%", false),
  336. peg$c31 = "\\\\{",
  337. peg$c32 = peg$literalExpectation("\\\\{", false),
  338. peg$c33 = "\\\\|",
  339. peg$c34 = peg$literalExpectation("\\\\|", false),
  340. peg$c35 = "\\\\>",
  341. peg$c36 = peg$literalExpectation("\\\\>", false),
  342. peg$c37 = peg$anyExpectation(),
  343. peg$currPos = 0,
  344. peg$savedPos = 0,
  345. peg$posDetailsCache = [{ line: 1, column: 1 }],
  346. peg$maxFailPos = 0,
  347. peg$maxFailExpected = [],
  348. peg$silentFails = 0,
  349. peg$result;
  350. if ("startRule" in options) {
  351. if (!(options.startRule in peg$startRuleFunctions)) {
  352. throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
  353. }
  354. peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
  355. }
  356. function text() {
  357. return input.substring(peg$savedPos, peg$currPos);
  358. }
  359. function peg$literalExpectation(text, ignoreCase) {
  360. return { type: "literal", text: text, ignoreCase: ignoreCase };
  361. }
  362. function peg$classExpectation(parts, inverted, ignoreCase) {
  363. return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
  364. }
  365. function peg$anyExpectation() {
  366. return { type: "any" };
  367. }
  368. function peg$endExpectation() {
  369. return { type: "end" };
  370. }
  371. function peg$computePosDetails(pos) {
  372. var details = peg$posDetailsCache[pos], p;
  373. if (details) {
  374. return details;
  375. } else {
  376. p = pos - 1;
  377. while (!peg$posDetailsCache[p]) {
  378. p--;
  379. }
  380. details = peg$posDetailsCache[p];
  381. details = {
  382. line: details.line,
  383. column: details.column
  384. };
  385. while (p < pos) {
  386. if (input.charCodeAt(p) === 10) {
  387. details.line++;
  388. details.column = 1;
  389. } else {
  390. details.column++;
  391. }
  392. p++;
  393. }
  394. peg$posDetailsCache[pos] = details;
  395. return details;
  396. }
  397. }
  398. function peg$computeLocation(startPos, endPos) {
  399. var startPosDetails = peg$computePosDetails(startPos),
  400. endPosDetails = peg$computePosDetails(endPos);
  401. return {
  402. start: {
  403. offset: startPos,
  404. line: startPosDetails.line,
  405. column: startPosDetails.column
  406. },
  407. end: {
  408. offset: endPos,
  409. line: endPosDetails.line,
  410. column: endPosDetails.column
  411. }
  412. };
  413. }
  414. function peg$fail(expected) {
  415. if (peg$currPos < peg$maxFailPos) { return; }
  416. if (peg$currPos > peg$maxFailPos) {
  417. peg$maxFailPos = peg$currPos;
  418. peg$maxFailExpected = [];
  419. }
  420. peg$maxFailExpected.push(expected);
  421. }
  422. function peg$buildStructuredError(expected, found, location) {
  423. return new peg$SyntaxError(
  424. peg$SyntaxError.buildMessage(expected, found),
  425. expected,
  426. found,
  427. location
  428. );
  429. }
  430. async function peg$parsestart() {
  431. var s0;
  432. s0 = await peg$parseexpression();
  433. return s0;
  434. }
  435. async function peg$parseexpression() {
  436. var s0, s1, s2;
  437. s0 = peg$currPos;
  438. s1 = [];
  439. s2 = await peg$parsestatement();
  440. while (s2 !== peg$FAILED) {
  441. s1.push(s2);
  442. s2 = await peg$parsestatement();
  443. }
  444. if (s1 !== peg$FAILED) {
  445. peg$savedPos = s0;
  446. s1 = peg$c0(s1);
  447. }
  448. s0 = s1;
  449. return s0;
  450. }
  451. async function peg$parsestatement() {
  452. var s0;
  453. s0 = await peg$parsefunctionCall();
  454. if (s0 === peg$FAILED) {
  455. s0 = await peg$parsevariable();
  456. if (s0 === peg$FAILED) {
  457. s0 = peg$parsetext();
  458. }
  459. }
  460. return s0;
  461. }
  462. async function peg$parsearg() {
  463. var s0, s1, s2;
  464. s0 = peg$currPos;
  465. if (input.charCodeAt(peg$currPos) === 124) {
  466. s1 = peg$c1;
  467. peg$currPos++;
  468. } else {
  469. s1 = peg$FAILED;
  470. if (peg$silentFails === 0) { peg$fail(peg$c2); }
  471. }
  472. if (s1 !== peg$FAILED) {
  473. s2 = await peg$parseexpression();
  474. if (s2 !== peg$FAILED) {
  475. peg$savedPos = s0;
  476. s1 = peg$c3(s2);
  477. s0 = s1;
  478. } else {
  479. peg$currPos = s0;
  480. s0 = peg$FAILED;
  481. }
  482. } else {
  483. peg$currPos = s0;
  484. s0 = peg$FAILED;
  485. }
  486. return s0;
  487. }
  488. async function peg$parseoptionalArgs() {
  489. var s0, s1;
  490. s0 = [];
  491. s1 = await peg$parsearg();
  492. if (s1 !== peg$FAILED) {
  493. while (s1 !== peg$FAILED) {
  494. s0.push(s1);
  495. s1 = await peg$parsearg();
  496. }
  497. } else {
  498. s0 = peg$FAILED;
  499. }
  500. return s0;
  501. }
  502. async function peg$parseargs() {
  503. var s0, s1, s2;
  504. s0 = peg$currPos;
  505. s1 = await peg$parseexpression();
  506. if (s1 !== peg$FAILED) {
  507. s2 = await peg$parseoptionalArgs();
  508. if (s2 === peg$FAILED) {
  509. s2 = null;
  510. }
  511. if (s2 !== peg$FAILED) {
  512. s1 = [s1, s2];
  513. s0 = s1;
  514. } else {
  515. peg$currPos = s0;
  516. s0 = peg$FAILED;
  517. }
  518. } else {
  519. peg$currPos = s0;
  520. s0 = peg$FAILED;
  521. }
  522. return s0;
  523. }
  524. async function peg$parsefunctionCall() {
  525. var s0, s1, s2, s3, s4, s5, s6;
  526. s0 = peg$currPos;
  527. if (input.charCodeAt(peg$currPos) === 37) {
  528. s1 = peg$c4;
  529. peg$currPos++;
  530. } else {
  531. s1 = peg$FAILED;
  532. if (peg$silentFails === 0) { peg$fail(peg$c5); }
  533. }
  534. if (s1 !== peg$FAILED) {
  535. s2 = peg$parseidentifier();
  536. if (s2 !== peg$FAILED) {
  537. if (input.charCodeAt(peg$currPos) === 60) {
  538. s3 = peg$c6;
  539. peg$currPos++;
  540. } else {
  541. s3 = peg$FAILED;
  542. if (peg$silentFails === 0) { peg$fail(peg$c7); }
  543. }
  544. if (s3 !== peg$FAILED) {
  545. s4 = await peg$parseargs();
  546. if (s4 !== peg$FAILED) {
  547. if (input.charCodeAt(peg$currPos) === 62) {
  548. s5 = peg$c8;
  549. peg$currPos++;
  550. } else {
  551. s5 = peg$FAILED;
  552. if (peg$silentFails === 0) { peg$fail(peg$c9); }
  553. }
  554. if (s5 !== peg$FAILED) {
  555. s6 = peg$parseresultLength();
  556. if (s6 === peg$FAILED) {
  557. s6 = null;
  558. }
  559. if (s6 !== peg$FAILED) {
  560. peg$savedPos = s0;
  561. s1 = await peg$c10(s2, s4, s6);
  562. s0 = s1;
  563. } else {
  564. peg$currPos = s0;
  565. s0 = peg$FAILED;
  566. }
  567. } else {
  568. peg$currPos = s0;
  569. s0 = peg$FAILED;
  570. }
  571. } else {
  572. peg$currPos = s0;
  573. s0 = peg$FAILED;
  574. }
  575. } else {
  576. peg$currPos = s0;
  577. s0 = peg$FAILED;
  578. }
  579. } else {
  580. peg$currPos = s0;
  581. s0 = peg$FAILED;
  582. }
  583. } else {
  584. peg$currPos = s0;
  585. s0 = peg$FAILED;
  586. }
  587. return s0;
  588. }
  589. async function peg$parsevariable() {
  590. var s0, s1, s2, s3, s4;
  591. s0 = peg$currPos;
  592. if (input.charCodeAt(peg$currPos) === 123) {
  593. s1 = peg$c11;
  594. peg$currPos++;
  595. } else {
  596. s1 = peg$FAILED;
  597. if (peg$silentFails === 0) { peg$fail(peg$c12); }
  598. }
  599. if (s1 !== peg$FAILED) {
  600. s2 = peg$parseidentifier();
  601. if (s2 !== peg$FAILED) {
  602. if (input.charCodeAt(peg$currPos) === 125) {
  603. s3 = peg$c13;
  604. peg$currPos++;
  605. } else {
  606. s3 = peg$FAILED;
  607. if (peg$silentFails === 0) { peg$fail(peg$c14); }
  608. }
  609. if (s3 !== peg$FAILED) {
  610. s4 = peg$parseresultLength();
  611. if (s4 === peg$FAILED) {
  612. s4 = null;
  613. }
  614. if (s4 !== peg$FAILED) {
  615. peg$savedPos = s0;
  616. s1 = await peg$c15(s2, s4);
  617. s0 = s1;
  618. } else {
  619. peg$currPos = s0;
  620. s0 = peg$FAILED;
  621. }
  622. } else {
  623. peg$currPos = s0;
  624. s0 = peg$FAILED;
  625. }
  626. } else {
  627. peg$currPos = s0;
  628. s0 = peg$FAILED;
  629. }
  630. } else {
  631. peg$currPos = s0;
  632. s0 = peg$FAILED;
  633. }
  634. return s0;
  635. }
  636. function peg$parseresultLength() {
  637. var s0, s1, s2, s3, s4;
  638. s0 = peg$currPos;
  639. if (input.charCodeAt(peg$currPos) === 91) {
  640. s1 = peg$c16;
  641. peg$currPos++;
  642. } else {
  643. s1 = peg$FAILED;
  644. if (peg$silentFails === 0) { peg$fail(peg$c17); }
  645. }
  646. if (s1 !== peg$FAILED) {
  647. s2 = peg$parsenumber();
  648. if (s2 !== peg$FAILED) {
  649. s3 = peg$parselengthUnit();
  650. if (s3 !== peg$FAILED) {
  651. if (input.charCodeAt(peg$currPos) === 93) {
  652. s4 = peg$c18;
  653. peg$currPos++;
  654. } else {
  655. s4 = peg$FAILED;
  656. if (peg$silentFails === 0) { peg$fail(peg$c19); }
  657. }
  658. if (s4 !== peg$FAILED) {
  659. peg$savedPos = s0;
  660. s1 = peg$c20(s2, s3);
  661. s0 = s1;
  662. } else {
  663. peg$currPos = s0;
  664. s0 = peg$FAILED;
  665. }
  666. } else {
  667. peg$currPos = s0;
  668. s0 = peg$FAILED;
  669. }
  670. } else {
  671. peg$currPos = s0;
  672. s0 = peg$FAILED;
  673. }
  674. } else {
  675. peg$currPos = s0;
  676. s0 = peg$FAILED;
  677. }
  678. return s0;
  679. }
  680. function peg$parselengthUnit() {
  681. var s0;
  682. if (input.substr(peg$currPos, 2) === peg$c21) {
  683. s0 = peg$c21;
  684. peg$currPos += 2;
  685. } else {
  686. s0 = peg$FAILED;
  687. if (peg$silentFails === 0) { peg$fail(peg$c22); }
  688. }
  689. if (s0 === peg$FAILED) {
  690. s0 = null;
  691. }
  692. return s0;
  693. }
  694. function peg$parseidentifier() {
  695. var s0, s1, s2;
  696. s0 = peg$currPos;
  697. s1 = [];
  698. if (peg$c23.test(input.charAt(peg$currPos))) {
  699. s2 = input.charAt(peg$currPos);
  700. peg$currPos++;
  701. } else {
  702. s2 = peg$FAILED;
  703. if (peg$silentFails === 0) { peg$fail(peg$c24); }
  704. }
  705. if (s2 !== peg$FAILED) {
  706. while (s2 !== peg$FAILED) {
  707. s1.push(s2);
  708. if (peg$c23.test(input.charAt(peg$currPos))) {
  709. s2 = input.charAt(peg$currPos);
  710. peg$currPos++;
  711. } else {
  712. s2 = peg$FAILED;
  713. if (peg$silentFails === 0) { peg$fail(peg$c24); }
  714. }
  715. }
  716. } else {
  717. s1 = peg$FAILED;
  718. }
  719. if (s1 !== peg$FAILED) {
  720. peg$savedPos = s0;
  721. s1 = peg$c25();
  722. }
  723. s0 = s1;
  724. return s0;
  725. }
  726. function peg$parsenumber() {
  727. var s0, s1, s2;
  728. s0 = peg$currPos;
  729. s1 = [];
  730. if (peg$c26.test(input.charAt(peg$currPos))) {
  731. s2 = input.charAt(peg$currPos);
  732. peg$currPos++;
  733. } else {
  734. s2 = peg$FAILED;
  735. if (peg$silentFails === 0) { peg$fail(peg$c27); }
  736. }
  737. if (s2 !== peg$FAILED) {
  738. while (s2 !== peg$FAILED) {
  739. s1.push(s2);
  740. if (peg$c26.test(input.charAt(peg$currPos))) {
  741. s2 = input.charAt(peg$currPos);
  742. peg$currPos++;
  743. } else {
  744. s2 = peg$FAILED;
  745. if (peg$silentFails === 0) { peg$fail(peg$c27); }
  746. }
  747. }
  748. } else {
  749. s1 = peg$FAILED;
  750. }
  751. if (s1 !== peg$FAILED) {
  752. peg$savedPos = s0;
  753. s1 = peg$c28();
  754. }
  755. s0 = s1;
  756. return s0;
  757. }
  758. function peg$parsetext() {
  759. var s0, s1, s2;
  760. s0 = peg$currPos;
  761. s1 = [];
  762. s2 = peg$parsechar();
  763. if (s2 !== peg$FAILED) {
  764. while (s2 !== peg$FAILED) {
  765. s1.push(s2);
  766. s2 = peg$parsechar();
  767. }
  768. } else {
  769. s1 = peg$FAILED;
  770. }
  771. if (s1 !== peg$FAILED) {
  772. peg$savedPos = s0;
  773. s1 = peg$c25();
  774. }
  775. s0 = s1;
  776. return s0;
  777. }
  778. function peg$parsechar() {
  779. var s0, s1, s2, s3, s4, s5;
  780. s0 = peg$currPos;
  781. s1 = peg$currPos;
  782. peg$silentFails++;
  783. if (input.charCodeAt(peg$currPos) === 37) {
  784. s2 = peg$c4;
  785. peg$currPos++;
  786. } else {
  787. s2 = peg$FAILED;
  788. if (peg$silentFails === 0) { peg$fail(peg$c5); }
  789. }
  790. peg$silentFails--;
  791. if (s2 === peg$FAILED) {
  792. s1 = void 0;
  793. } else {
  794. peg$currPos = s1;
  795. s1 = peg$FAILED;
  796. }
  797. if (s1 !== peg$FAILED) {
  798. s2 = peg$currPos;
  799. peg$silentFails++;
  800. if (input.charCodeAt(peg$currPos) === 123) {
  801. s3 = peg$c11;
  802. peg$currPos++;
  803. } else {
  804. s3 = peg$FAILED;
  805. if (peg$silentFails === 0) { peg$fail(peg$c12); }
  806. }
  807. peg$silentFails--;
  808. if (s3 === peg$FAILED) {
  809. s2 = void 0;
  810. } else {
  811. peg$currPos = s2;
  812. s2 = peg$FAILED;
  813. }
  814. if (s2 !== peg$FAILED) {
  815. s3 = peg$currPos;
  816. peg$silentFails++;
  817. if (input.charCodeAt(peg$currPos) === 124) {
  818. s4 = peg$c1;
  819. peg$currPos++;
  820. } else {
  821. s4 = peg$FAILED;
  822. if (peg$silentFails === 0) { peg$fail(peg$c2); }
  823. }
  824. peg$silentFails--;
  825. if (s4 === peg$FAILED) {
  826. s3 = void 0;
  827. } else {
  828. peg$currPos = s3;
  829. s3 = peg$FAILED;
  830. }
  831. if (s3 !== peg$FAILED) {
  832. s4 = peg$currPos;
  833. peg$silentFails++;
  834. if (input.charCodeAt(peg$currPos) === 62) {
  835. s5 = peg$c8;
  836. peg$currPos++;
  837. } else {
  838. s5 = peg$FAILED;
  839. if (peg$silentFails === 0) { peg$fail(peg$c9); }
  840. }
  841. peg$silentFails--;
  842. if (s5 === peg$FAILED) {
  843. s4 = void 0;
  844. } else {
  845. peg$currPos = s4;
  846. s4 = peg$FAILED;
  847. }
  848. if (s4 !== peg$FAILED) {
  849. s5 = peg$parseescapedChar();
  850. if (s5 !== peg$FAILED) {
  851. s1 = [s1, s2, s3, s4, s5];
  852. s0 = s1;
  853. } else {
  854. peg$currPos = s0;
  855. s0 = peg$FAILED;
  856. }
  857. } else {
  858. peg$currPos = s0;
  859. s0 = peg$FAILED;
  860. }
  861. } else {
  862. peg$currPos = s0;
  863. s0 = peg$FAILED;
  864. }
  865. } else {
  866. peg$currPos = s0;
  867. s0 = peg$FAILED;
  868. }
  869. } else {
  870. peg$currPos = s0;
  871. s0 = peg$FAILED;
  872. }
  873. return s0;
  874. }
  875. function peg$parseescapedChar() {
  876. var s0;
  877. if (input.substr(peg$currPos, 3) === peg$c29) {
  878. s0 = peg$c29;
  879. peg$currPos += 3;
  880. } else {
  881. s0 = peg$FAILED;
  882. if (peg$silentFails === 0) { peg$fail(peg$c30); }
  883. }
  884. if (s0 === peg$FAILED) {
  885. if (input.substr(peg$currPos, 3) === peg$c31) {
  886. s0 = peg$c31;
  887. peg$currPos += 3;
  888. } else {
  889. s0 = peg$FAILED;
  890. if (peg$silentFails === 0) { peg$fail(peg$c32); }
  891. }
  892. if (s0 === peg$FAILED) {
  893. if (input.substr(peg$currPos, 3) === peg$c33) {
  894. s0 = peg$c33;
  895. peg$currPos += 3;
  896. } else {
  897. s0 = peg$FAILED;
  898. if (peg$silentFails === 0) { peg$fail(peg$c34); }
  899. }
  900. if (s0 === peg$FAILED) {
  901. if (input.substr(peg$currPos, 3) === peg$c35) {
  902. s0 = peg$c35;
  903. peg$currPos += 3;
  904. } else {
  905. s0 = peg$FAILED;
  906. if (peg$silentFails === 0) { peg$fail(peg$c36); }
  907. }
  908. if (s0 === peg$FAILED) {
  909. if (input.length > peg$currPos) {
  910. s0 = input.charAt(peg$currPos);
  911. peg$currPos++;
  912. } else {
  913. s0 = peg$FAILED;
  914. if (peg$silentFails === 0) { peg$fail(peg$c37); }
  915. }
  916. }
  917. }
  918. }
  919. }
  920. return s0;
  921. }
  922. peg$result = await peg$startRuleFunction();
  923. if (peg$result !== peg$FAILED && peg$currPos === input.length) {
  924. return peg$result;
  925. } else {
  926. if (peg$result !== peg$FAILED && peg$currPos < input.length) {
  927. peg$fail(peg$endExpectation());
  928. }
  929. throw peg$buildStructuredError(
  930. peg$maxFailExpected,
  931. peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
  932. peg$maxFailPos < input.length
  933. ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
  934. : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
  935. );
  936. }
  937. }
  938. /*
  939. * The MIT License (MIT)
  940. *
  941. * Author: Gildas Lormeau
  942. *
  943. * Permission is hereby granted, free of charge, to any person obtaining a copy
  944. * of this software and associated documentation files (the "Software"), to deal
  945. * in the Software without restriction, including without limitation the rights
  946. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  947. * copies of the Software, and to permit persons to whom the Software is
  948. * furnished to do so, subject to the following conditions:
  949. *
  950. * The above copyright notice and this permission notice shall be included in all
  951. * copies or substantial portions of the Software.
  952. *
  953. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  954. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  955. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  956. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  957. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  958. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  959. * SOFTWARE.
  960. */
  961. // derived from https://github.com/postcss/postcss-selector-parser/blob/master/src/util/unesc.js
  962. /*
  963. * The MIT License (MIT)
  964. * Copyright (c) Ben Briggs <beneb.info@gmail.com> (http://beneb.info)
  965. *
  966. * Permission is hereby granted, free of charge, to any person obtaining a copy
  967. * of this software and associated documentation files (the "Software"), to deal
  968. * in the Software without restriction, including without limitation the rights
  969. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  970. * copies of the Software, and to permit persons to whom the Software is
  971. * furnished to do so, subject to the following conditions:
  972. *
  973. * The above copyright notice and this permission notice shall be included in
  974. * all copies or substantial portions of the Software.
  975. *
  976. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  977. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  978. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  979. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  980. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  981. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  982. * THE SOFTWARE.
  983. */
  984. const whitespace = "[\\x20\\t\\r\\n\\f]";
  985. const unescapeRegExp = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig");
  986. function process$6(str) {
  987. return str.replace(unescapeRegExp, (_, escaped, escapedWhitespace) => {
  988. const high = "0x" + escaped - 0x10000;
  989. // NaN means non-codepoint
  990. // Workaround erroneous numeric interpretation of +"0x"
  991. // eslint-disable-next-line no-self-compare
  992. return high !== high || escapedWhitespace
  993. ? escaped
  994. : high < 0
  995. ? // BMP codepoint
  996. String.fromCharCode(high + 0x10000)
  997. : // Supplemental Plane codepoint (surrogate pair)
  998. String.fromCharCode((high >> 10) | 0xd800, (high & 0x3ff) | 0xdc00);
  999. });
  1000. }
  1001. /*
  1002. * Copyright 2010-2022 Gildas Lormeau
  1003. * contact : gildas.lormeau <at> gmail.com
  1004. *
  1005. * This file is part of SingleFile.
  1006. *
  1007. * The code in this file is free software: you can redistribute it and/or
  1008. * modify it under the terms of the GNU Affero General Public License
  1009. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  1010. * of the License, or (at your option) any later version.
  1011. *
  1012. * The code in this file is distributed in the hope that it will be useful,
  1013. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  1014. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  1015. * General Public License for more details.
  1016. *
  1017. * As additional permission under GNU AGPL version 3 section 7, you may
  1018. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  1019. * AGPL normally required by section 4, provided you include this license
  1020. * notice and a URL through which recipients can access the Corresponding
  1021. * Source.
  1022. */
  1023. const NEW_FONT_FACE_EVENT = "single-file-new-font-face";
  1024. const DELETE_FONT_EVENT = "single-file-delete-font";
  1025. const CLEAR_FONTS_EVENT = "single-file-clear-fonts";
  1026. const FONT_FACE_PROPERTY_NAME = "_singleFile_fontFaces";
  1027. const document$1 = globalThis.document;
  1028. const Document = globalThis.Document;
  1029. const JSON$2 = globalThis.JSON;
  1030. const MutationObserver = globalThis.MutationObserver;
  1031. let fontFaces;
  1032. if (window[FONT_FACE_PROPERTY_NAME]) {
  1033. fontFaces = window[FONT_FACE_PROPERTY_NAME];
  1034. } else {
  1035. fontFaces = window[FONT_FACE_PROPERTY_NAME] = new Map();
  1036. }
  1037. init();
  1038. new MutationObserver(init).observe(document$1, { childList: true });
  1039. function init() {
  1040. if (document$1 instanceof Document) {
  1041. document$1.addEventListener(NEW_FONT_FACE_EVENT, event => {
  1042. const detail = event.detail;
  1043. const key = Object.assign({}, detail);
  1044. delete key.src;
  1045. fontFaces.set(JSON$2.stringify(key), detail);
  1046. });
  1047. document$1.addEventListener(DELETE_FONT_EVENT, event => {
  1048. const detail = event.detail;
  1049. const key = Object.assign({}, detail);
  1050. delete key.src;
  1051. fontFaces.delete(JSON$2.stringify(key));
  1052. });
  1053. document$1.addEventListener(CLEAR_FONTS_EVENT, () => fontFaces = new Map());
  1054. }
  1055. }
  1056. function getFontsData$1() {
  1057. return Array.from(fontFaces.values());
  1058. }
  1059. const SINGLE_FILE_PREFIX = "single-file-";
  1060. const COMMENT_HEADER = "Page saved with SingleFile";
  1061. const SINGLE_FILE_SIGNATURE = "SingleFile";
  1062. const WAIT_FOR_USERSCRIPT_PROPERTY_NAME = "_singleFile_waitForUserScript";
  1063. const NO_SCRIPT_PROPERTY_NAME = "singleFileDisabledNoscript";
  1064. /*
  1065. * Copyright 2010-2022 Gildas Lormeau
  1066. * contact : gildas.lormeau <at> gmail.com
  1067. *
  1068. * This file is part of SingleFile.
  1069. *
  1070. * The code in this file is free software: you can redistribute it and/or
  1071. * modify it under the terms of the GNU Affero General Public License
  1072. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  1073. * of the License, or (at your option) any later version.
  1074. *
  1075. * The code in this file is distributed in the hope that it will be useful,
  1076. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  1077. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  1078. * General Public License for more details.
  1079. *
  1080. * As additional permission under GNU AGPL version 3 section 7, you may
  1081. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  1082. * AGPL normally required by section 4, provided you include this license
  1083. * notice and a URL through which recipients can access the Corresponding
  1084. * Source.
  1085. */
  1086. const INFOBAR_TAGNAME$1 = "single-file-infobar";
  1087. const INFOBAR_STYLES = `
  1088. .infobar,
  1089. .infobar .infobar-icon,
  1090. .infobar .infobar-link-icon {
  1091. min-inline-size: 28px;
  1092. min-block-size: 28px;
  1093. box-sizing: border-box;
  1094. }
  1095. .infobar,
  1096. .infobar .infobar-close-icon,
  1097. .infobar .infobar-link-icon {
  1098. opacity: 0.7;
  1099. transition: opacity 250ms;
  1100. }
  1101. .infobar:hover,
  1102. .infobar .infobar-close-icon:hover,
  1103. .infobar .infobar-link-icon:hover {
  1104. opacity: 1;
  1105. }
  1106. .infobar,
  1107. .infobar-content {
  1108. display: flex;
  1109. }
  1110. .infobar {
  1111. position: fixed;
  1112. top: 16px;
  1113. right: 16px;
  1114. margin-inline-start: 16px;
  1115. margin-block-end: 16px;
  1116. color: #2d2d2d;
  1117. background-color: #737373;
  1118. border: 2px solid;
  1119. border-color: #eee;
  1120. border-radius: 16px;
  1121. z-index: 2147483647;
  1122. }
  1123. .infobar:valid, .infobar:not(:focus-within) .infobar-content {
  1124. display: none;
  1125. }
  1126. .infobar:focus-within {
  1127. background-color: #f9f9f9;
  1128. border-color: #878787;
  1129. border-radius: 8px;
  1130. opacity: 1;
  1131. transition-property: opacity, background-color, border-color, border-radius,
  1132. color;
  1133. }
  1134. .infobar-content {
  1135. align-items: center;
  1136. }
  1137. .infobar-content span {
  1138. font-family: Arial, Helvetica, sans-serif;
  1139. font-size: 14px;
  1140. line-height: 18px;
  1141. word-break: break-word;
  1142. white-space: pre-wrap;
  1143. margin-inline: 4px;
  1144. margin-block: 4px;
  1145. }
  1146. .infobar .infobar-icon,
  1147. .infobar .infobar-close-icon,
  1148. .infobar .infobar-link-icon {
  1149. cursor: pointer;
  1150. background-position: center;
  1151. background-repeat: no-repeat;
  1152. }
  1153. .infobar .infobar-close-icon,
  1154. .infobar .infobar-link-icon {
  1155. align-self: flex-start;
  1156. }
  1157. .infobar .infobar-icon {
  1158. position: absolute;
  1159. min-inline-size: 24px;
  1160. min-block-size: 24px;
  1161. }
  1162. .infobar:focus-within .infobar-icon {
  1163. z-index: -1;
  1164. background-image: none;
  1165. }
  1166. .infobar .infobar-close-icon {
  1167. min-inline-size: 22px;
  1168. min-block-size: 22px;
  1169. }
  1170. .infobar .infobar-icon {
  1171. background-color: transparent;
  1172. background-size: 70%;
  1173. background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHADIRLMaOHwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAPUExURQAAAIqKioyNjY2OjvDw8L2y1DEAAAABdFJOUwBA5thmAAAAAWJLR0QB/wIt3gAAAGNJREFUSMdjYCAJsLi4OBCQx6/CBQwIGIDPCBcXAkYQUsACU+AwlBVQHg6Eg5pgZBGOboIJZugDFwRwoJECJCUOhJI1wZwzqmBUwagCuipgIqTABG9h7YIKaKGAURAFEF/6AQAO4HqSoDP8bgAAAABJRU5ErkJggg==);
  1174. }
  1175. .infobar .infobar-link-icon {
  1176. background-size: 60%;
  1177. background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHAB8H+DhhoQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAJUExURQAAAICHi4qKioTuJAkAAAABdFJOUwBA5thmAAAAAWJLR0QCZgt8ZAAAAJJJREFUOI3t070NRCEMA2CnYAOyDyPwpHj/Va7hJ3FzV7zy3ET5JIwoAF6Jk4wzAJAkzxAYG9YRTgB+24wBgKmfrGAKTcEfAY4KRlRoIeBTgKOCERVaCPgU4Khge2GqKOBTgKOCERVaAEC/4PNcnyoSWHpjqkhwKxbcig0Q6AorXYF/+A6eIYD1lVbwG/jdA6/kA2THRAURVubcAAAAAElFTkSuQmCC);
  1178. }
  1179. .infobar .infobar-close-icon {
  1180. appearance: none;
  1181. background-size: 80%;
  1182. background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAgMAAADXB5lNAAABhmlDQ1BJQ0MgcHJvZmlsZQAAKJF9kj1Iw0AYht+mSkUrDnYQcchQnSyIijqWKhbBQmkrtOpgcukfNGlIUlwcBdeCgz+LVQcXZ10dXAVB8AfEydFJ0UVK/C4ptIjx4LiH9+59+e67A4RGhalm1wSgapaRisfEbG5VDLyiDwEAvZiVmKkn0osZeI6ve/j4ehfhWd7n/hz9St5kgE8kjjLdsIg3iGc2LZ3zPnGIlSSF+Jx43KACiR+5Lrv8xrnosMAzQ0YmNU8cIhaLHSx3MCsZKvE0cVhRNcoXsi4rnLc4q5Uaa9XJbxjMaytprtMcQRxLSCAJETJqKKMCCxFaNVJMpGg/5uEfdvxJcsnkKoORYwFVqJAcP/gb/O6tWZiadJOCMaD7xbY/RoHALtCs2/b3sW03TwD/M3Cltf3VBjD3SXq9rYWPgIFt4OK6rcl7wOUOMPSkS4bkSH6aQqEAvJ/RM+WAwVv6EGtu31r7OH0AMtSr5Rvg4BAYK1L2use9ezr79u+ZVv9+AFlNcp0UUpiqAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AsHAB8VC4EQ6QAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAJUExURQAAAICHi4qKioTuJAkAAAABdFJOUwBA5thmAAAAAWJLR0QCZgt8ZAAAAJtJREFUOI3NkrsBgCAMRLFwBPdxBArcfxXFkO8rbKWAAJfHJ9faf9vuYX/749T5NmShm3bEwbe2SxeuM4+2oxDL1cDoKtVUjRy+tH78Cv2CS+wIiQNC1AEhk4AQeUTMWUJMfUJMSEJMSEY8kIx4IONroaYAimNxsXp1PA7PxwfVL8QnowwoVC0lig07wDDVUjAdbAnjwtow/z/bDW7eI4M2KruJAAAAAElFTkSuQmCC);
  1183. }
  1184. `;
  1185. function appendInfobar$1(doc, options, useShadowRoot) {
  1186. if (!doc.querySelector(INFOBAR_TAGNAME$1)) {
  1187. let infoData;
  1188. if (options.infobarContent) {
  1189. infoData = options.infobarContent.replace(/\\n/g, "\n").replace(/\\t/g, "\t");
  1190. } else if (options.saveDate) {
  1191. infoData = options.saveDate;
  1192. }
  1193. infoData = infoData || "No info";
  1194. const parentElement = doc.body.tagName == "BODY" ? doc.body : doc.documentElement;
  1195. const infobarElement = createElement(doc, INFOBAR_TAGNAME$1, parentElement);
  1196. let infobarContainer;
  1197. if (useShadowRoot) {
  1198. infobarContainer = infobarElement.attachShadow({ mode: "open" });
  1199. } else {
  1200. const shadowRootTemplate = doc.createElement("template");
  1201. shadowRootTemplate.setAttribute("shadowrootmode", "open");
  1202. infobarElement.appendChild(shadowRootTemplate);
  1203. infobarContainer = shadowRootTemplate;
  1204. }
  1205. const shadowRootContent = doc.createElement("div");
  1206. const styleElement = doc.createElement("style");
  1207. styleElement.textContent = INFOBAR_STYLES
  1208. .replace(/ {2}/g, "")
  1209. .replace(/\n/g, "")
  1210. .replace(/: /g, ":")
  1211. .replace(/, /g, ",");
  1212. shadowRootContent.appendChild(styleElement);
  1213. const infobarContent = doc.createElement("form");
  1214. infobarContent.classList.add("infobar");
  1215. shadowRootContent.appendChild(infobarContent);
  1216. const iconElement = doc.createElement("span");
  1217. iconElement.tabIndex = -1;
  1218. iconElement.classList.add("infobar-icon");
  1219. infobarContent.appendChild(iconElement);
  1220. const contentElement = doc.createElement("span");
  1221. contentElement.tabIndex = -1;
  1222. contentElement.classList.add("infobar-content");
  1223. const closeButtonElement = doc.createElement("input");
  1224. closeButtonElement.type = "checkbox";
  1225. closeButtonElement.required = true;
  1226. closeButtonElement.classList.add("infobar-close-icon");
  1227. closeButtonElement.title = "Close";
  1228. contentElement.appendChild(closeButtonElement);
  1229. const textElement = doc.createElement("span");
  1230. textElement.textContent = infoData;
  1231. contentElement.appendChild(textElement);
  1232. const linkElement = doc.createElement("a");
  1233. linkElement.classList.add("infobar-link-icon");
  1234. linkElement.target = "_blank";
  1235. linkElement.rel = "noopener noreferrer";
  1236. linkElement.title = "Open source URL: " + options.saveUrl;
  1237. linkElement.href = options.saveUrl;
  1238. contentElement.appendChild(linkElement);
  1239. infobarContent.appendChild(contentElement);
  1240. if (useShadowRoot) {
  1241. infobarContainer.appendChild(shadowRootContent);
  1242. } else {
  1243. const scriptElement = doc.createElement("script");
  1244. let scriptContent = refreshInfobarInfo.toString();
  1245. scriptContent += ";const SINGLE_FILE_SIGNATURE = " + JSON.stringify(SINGLE_FILE_SIGNATURE) + ";";
  1246. scriptContent += extractInfobarData.toString();
  1247. scriptContent += "(" + initInfobar.toString() + ")(document)";
  1248. scriptElement.textContent = scriptContent;
  1249. shadowRootContent.appendChild(scriptElement);
  1250. infobarContainer.innerHTML = shadowRootContent.outerHTML;
  1251. }
  1252. }
  1253. }
  1254. function extractInfobarData(doc) {
  1255. const result = doc.evaluate("//comment()", doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
  1256. let singleFileComment = result && result.singleNodeValue;
  1257. if (singleFileComment && singleFileComment.nodeType == Node.COMMENT_NODE && singleFileComment.textContent.includes(SINGLE_FILE_SIGNATURE)) {
  1258. const info = singleFileComment.textContent.split("\n");
  1259. const [, , urlData, ...optionalData] = info;
  1260. const urlMatch = urlData.match(/^ url: (.*) ?$/);
  1261. const saveUrl = urlMatch && urlMatch[1];
  1262. if (saveUrl) {
  1263. let infobarContent, saveDate;
  1264. if (optionalData.length) {
  1265. saveDate = optionalData[0].split("saved date: ")[1];
  1266. if (saveDate) {
  1267. optionalData.shift();
  1268. }
  1269. if (optionalData.length > 1) {
  1270. let content = optionalData[0].split("info: ")[1].trim();
  1271. for (let indexLine = 1; indexLine < optionalData.length - 1; indexLine++) {
  1272. content += "\n" + optionalData[indexLine].trim();
  1273. }
  1274. infobarContent = content.trim();
  1275. }
  1276. }
  1277. return { saveUrl, infobarContent, saveDate };
  1278. }
  1279. }
  1280. }
  1281. function refreshInfobarInfo(doc, { saveUrl, infobarContent, saveDate }) {
  1282. if (saveUrl) {
  1283. const infobarElement = doc.querySelector("single-file-infobar");
  1284. const shadowRootFragment = infobarElement.shadowRoot;
  1285. const infobarContentElement = shadowRootFragment.querySelector(".infobar-content span");
  1286. infobarContentElement.textContent = infobarContent || saveDate;
  1287. const linkElement = shadowRootFragment.querySelector(".infobar-content .infobar-link-icon");
  1288. linkElement.href = saveUrl;
  1289. linkElement.title = "Open source URL: " + saveUrl;
  1290. }
  1291. }
  1292. function displayIcon(doc, useShadowRoot) {
  1293. const infoData = extractInfobarData(doc);
  1294. if (infoData.saveUrl) {
  1295. appendInfobar$1(doc, infoData, useShadowRoot);
  1296. refreshInfobarInfo(doc, infoData);
  1297. }
  1298. }
  1299. function initInfobar(doc) {
  1300. const infoData = extractInfobarData(doc);
  1301. if (infoData && infoData.saveUrl) {
  1302. refreshInfobarInfo(doc, infoData);
  1303. }
  1304. }
  1305. function createElement(doc, tagName, parentElement) {
  1306. const element = doc.createElement(tagName);
  1307. parentElement.appendChild(element);
  1308. Array.from(getComputedStyle(element)).forEach(property => element.style.setProperty(property, "initial", "important"));
  1309. return element;
  1310. }
  1311. /*
  1312. * Copyright 2010-2022 Gildas Lormeau
  1313. * contact : gildas.lormeau <at> gmail.com
  1314. *
  1315. * This file is part of SingleFile.
  1316. *
  1317. * The code in this file is free software: you can redistribute it and/or
  1318. * modify it under the terms of the GNU Affero General Public License
  1319. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  1320. * of the License, or (at your option) any later version.
  1321. *
  1322. * The code in this file is distributed in the hope that it will be useful,
  1323. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  1324. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  1325. * General Public License for more details.
  1326. *
  1327. * As additional permission under GNU AGPL version 3 section 7, you may
  1328. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  1329. * AGPL normally required by section 4, provided you include this license
  1330. * notice and a URL through which recipients can access the Corresponding
  1331. * Source.
  1332. */
  1333. const ON_BEFORE_CAPTURE_EVENT_NAME = SINGLE_FILE_PREFIX + "on-before-capture";
  1334. const ON_AFTER_CAPTURE_EVENT_NAME = SINGLE_FILE_PREFIX + "on-after-capture";
  1335. const GET_ADOPTED_STYLESHEETS_REQUEST_EVENT = SINGLE_FILE_PREFIX + "request-get-adopted-stylesheets";
  1336. const GET_ADOPTED_STYLESHEETS_RESPONSE_EVENT = SINGLE_FILE_PREFIX + "response-get-adopted-stylesheets";
  1337. const UNREGISTER_GET_ADOPTED_STYLESHEETS_REQUEST_EVENT = SINGLE_FILE_PREFIX + "unregister-request-get-adopted-stylesheets";
  1338. const REMOVED_CONTENT_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "removed-content";
  1339. const HIDDEN_CONTENT_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "hidden-content";
  1340. const KEPT_CONTENT_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "kept-content";
  1341. const HIDDEN_FRAME_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "hidden-frame";
  1342. const PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "preserved-space-element";
  1343. const SHADOW_ROOT_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "shadow-root-element";
  1344. const WIN_ID_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "win-id";
  1345. const IMAGE_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "image";
  1346. const POSTER_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "poster";
  1347. const VIDEO_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "video";
  1348. const CANVAS_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "canvas";
  1349. const STYLE_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "movable-style";
  1350. const INPUT_VALUE_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "input-value";
  1351. const LAZY_SRC_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "lazy-loaded-src";
  1352. const STYLESHEET_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "stylesheet";
  1353. const DISABLED_NOSCRIPT_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "disabled-noscript";
  1354. const SELECTED_CONTENT_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "selected-content";
  1355. const INVALID_ELEMENT_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "invalid-element";
  1356. const ASYNC_SCRIPT_ATTRIBUTE_NAME = "data-" + SINGLE_FILE_PREFIX + "async-script";
  1357. const FLOW_ELEMENTS_SELECTOR = "*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)";
  1358. const KEPT_TAG_NAMES = ["NOSCRIPT", "DISABLED-NOSCRIPT", "META", "LINK", "STYLE", "TITLE", "TEMPLATE", "SOURCE", "OBJECT", "SCRIPT", "HEAD", "BODY"];
  1359. const IGNORED_TAG_NAMES = ["SCRIPT", "NOSCRIPT", "META", "LINK", "TEMPLATE"];
  1360. const REGEXP_SIMPLE_QUOTES_STRING$1 = /^'(.*?)'$/;
  1361. const REGEXP_DOUBLE_QUOTES_STRING$1 = /^"(.*?)"$/;
  1362. const FONT_WEIGHTS = {
  1363. regular: "400",
  1364. normal: "400",
  1365. bold: "700",
  1366. bolder: "700",
  1367. lighter: "100"
  1368. };
  1369. const COMMENT_HEADER_LEGACY = "Archive processed by SingleFile";
  1370. const SINGLE_FILE_UI_ELEMENT_CLASS = "single-file-ui-element";
  1371. const INFOBAR_TAGNAME = INFOBAR_TAGNAME$1;
  1372. const EMPTY_RESOURCE$1 = "data:,";
  1373. const JSON$1 = globalThis.JSON;
  1374. const crypto$1 = globalThis.crypto;
  1375. const TextEncoder$1 = globalThis.TextEncoder;
  1376. const Blob$4 = globalThis.Blob;
  1377. const CustomEvent = globalThis.CustomEvent;
  1378. function initDoc(doc) {
  1379. doc.querySelectorAll("meta[http-equiv=refresh]").forEach(element => {
  1380. element.removeAttribute("http-equiv");
  1381. element.setAttribute("disabled-http-equiv", "refresh");
  1382. });
  1383. }
  1384. function preProcessDoc(doc, win, options) {
  1385. doc.querySelectorAll("noscript:not([" + DISABLED_NOSCRIPT_ATTRIBUTE_NAME + "])").forEach(element => {
  1386. element.setAttribute(DISABLED_NOSCRIPT_ATTRIBUTE_NAME, element.textContent);
  1387. element.textContent = "";
  1388. });
  1389. initDoc(doc);
  1390. if (doc.head) {
  1391. doc.head.querySelectorAll(FLOW_ELEMENTS_SELECTOR).forEach(element => element.hidden = true);
  1392. }
  1393. doc.querySelectorAll("svg foreignObject").forEach(element => {
  1394. const flowElements = element.querySelectorAll("html > head > " + FLOW_ELEMENTS_SELECTOR + ", html > body > " + FLOW_ELEMENTS_SELECTOR);
  1395. if (flowElements.length) {
  1396. Array.from(element.childNodes).forEach(node => node.remove());
  1397. flowElements.forEach(flowElement => element.appendChild(flowElement));
  1398. }
  1399. });
  1400. const invalidElements = new Map();
  1401. let elementsInfo;
  1402. if (win && doc.documentElement) {
  1403. doc.querySelectorAll("button button, a a").forEach(element => {
  1404. const placeHolderElement = doc.createElement("template");
  1405. placeHolderElement.setAttribute(INVALID_ELEMENT_ATTRIBUTE_NAME, "");
  1406. placeHolderElement.content.appendChild(element.cloneNode(true));
  1407. invalidElements.set(element, placeHolderElement);
  1408. element.replaceWith(placeHolderElement);
  1409. });
  1410. elementsInfo = getElementsInfo(win, doc, doc.documentElement, options);
  1411. if (options.moveStylesInHead) {
  1412. doc.querySelectorAll("body style, body ~ style").forEach(element => {
  1413. const computedStyle = getComputedStyle$1(win, element);
  1414. if (computedStyle && testHiddenElement(element, computedStyle)) {
  1415. element.setAttribute(STYLE_ATTRIBUTE_NAME, "");
  1416. elementsInfo.markedElements.push(element);
  1417. }
  1418. });
  1419. }
  1420. } else {
  1421. elementsInfo = {
  1422. canvases: [],
  1423. images: [],
  1424. posters: [],
  1425. videos: [],
  1426. usedFonts: [],
  1427. shadowRoots: [],
  1428. markedElements: []
  1429. };
  1430. }
  1431. return {
  1432. canvases: elementsInfo.canvases,
  1433. fonts: getFontsData(),
  1434. stylesheets: getStylesheetsData(doc),
  1435. images: elementsInfo.images,
  1436. posters: elementsInfo.posters,
  1437. videos: elementsInfo.videos,
  1438. usedFonts: Array.from(elementsInfo.usedFonts.values()),
  1439. shadowRoots: elementsInfo.shadowRoots,
  1440. referrer: doc.referrer,
  1441. markedElements: elementsInfo.markedElements,
  1442. invalidElements,
  1443. scrollPosition: { x: win.scrollX, y: win.scrollY },
  1444. adoptedStyleSheets: getStylesheetsContent(doc.adoptedStyleSheets)
  1445. };
  1446. }
  1447. function getElementsInfo(win, doc, element, options, data = { usedFonts: new Map(), canvases: [], images: [], posters: [], videos: [], shadowRoots: [], markedElements: [] }, ascendantHidden) {
  1448. if (element.childNodes) {
  1449. const elements = Array.from(element.childNodes).filter(node => (node instanceof win.HTMLElement) || (node instanceof win.SVGElement) || (node instanceof globalThis.HTMLElement) || (node instanceof globalThis.SVGElement));
  1450. elements.forEach(element => {
  1451. let elementHidden, elementKept, computedStyle;
  1452. if (!options.autoSaveExternalSave && (options.removeHiddenElements || options.removeUnusedFonts || options.compressHTML)) {
  1453. computedStyle = getComputedStyle$1(win, element);
  1454. if ((element instanceof win.HTMLElement) || (element instanceof globalThis.HTMLElement)) {
  1455. if (options.removeHiddenElements) {
  1456. elementKept = ((ascendantHidden || element.closest("html > head")) && KEPT_TAG_NAMES.includes(element.tagName.toUpperCase())) || element.closest("details");
  1457. if (!elementKept) {
  1458. elementHidden = ascendantHidden || testHiddenElement(element, computedStyle);
  1459. if (elementHidden && !IGNORED_TAG_NAMES.includes(element.tagName.toUpperCase())) {
  1460. element.setAttribute(HIDDEN_CONTENT_ATTRIBUTE_NAME, "");
  1461. data.markedElements.push(element);
  1462. }
  1463. }
  1464. }
  1465. }
  1466. if (!elementHidden) {
  1467. if (options.compressHTML && computedStyle) {
  1468. const whiteSpace = computedStyle.getPropertyValue("white-space");
  1469. if (whiteSpace && whiteSpace.startsWith("pre")) {
  1470. element.setAttribute(PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME, "");
  1471. data.markedElements.push(element);
  1472. }
  1473. }
  1474. if (options.removeUnusedFonts) {
  1475. getUsedFont(computedStyle, options, data.usedFonts);
  1476. getUsedFont(getComputedStyle$1(win, element, ":first-letter"), options, data.usedFonts);
  1477. getUsedFont(getComputedStyle$1(win, element, ":before"), options, data.usedFonts);
  1478. getUsedFont(getComputedStyle$1(win, element, ":after"), options, data.usedFonts);
  1479. }
  1480. }
  1481. }
  1482. getResourcesInfo(win, doc, element, options, data, elementHidden, computedStyle);
  1483. const shadowRoot = !((element instanceof win.SVGElement) || (element instanceof globalThis.SVGElement)) && getShadowRoot(element);
  1484. if (shadowRoot && !element.classList.contains(SINGLE_FILE_UI_ELEMENT_CLASS) && element.tagName.toLowerCase() != INFOBAR_TAGNAME) {
  1485. const shadowRootInfo = {};
  1486. element.setAttribute(SHADOW_ROOT_ATTRIBUTE_NAME, data.shadowRoots.length);
  1487. data.markedElements.push(element);
  1488. data.shadowRoots.push(shadowRootInfo);
  1489. try {
  1490. if (shadowRoot.adoptedStyleSheets) {
  1491. if (shadowRoot.adoptedStyleSheets.length) {
  1492. shadowRootInfo.adoptedStyleSheets = getStylesheetsContent(shadowRoot.adoptedStyleSheets);
  1493. } else if (shadowRoot.adoptedStyleSheets.length === undefined) {
  1494. const listener = event => shadowRootInfo.adoptedStyleSheets = event.detail.adoptedStyleSheets;
  1495. shadowRoot.addEventListener(GET_ADOPTED_STYLESHEETS_RESPONSE_EVENT, listener);
  1496. shadowRoot.dispatchEvent(new CustomEvent(GET_ADOPTED_STYLESHEETS_REQUEST_EVENT, { bubbles: true }));
  1497. if (!shadowRootInfo.adoptedStyleSheets) {
  1498. element.dispatchEvent(new CustomEvent(GET_ADOPTED_STYLESHEETS_REQUEST_EVENT, { bubbles: true }));
  1499. }
  1500. shadowRoot.removeEventListener(GET_ADOPTED_STYLESHEETS_RESPONSE_EVENT, listener);
  1501. }
  1502. }
  1503. } catch (error) {
  1504. // ignored
  1505. }
  1506. getElementsInfo(win, doc, shadowRoot, options, data, elementHidden);
  1507. shadowRootInfo.content = shadowRoot.innerHTML;
  1508. shadowRootInfo.mode = shadowRoot.mode;
  1509. try {
  1510. if (shadowRoot.adoptedStyleSheets && shadowRoot.adoptedStyleSheets.length === undefined) {
  1511. shadowRoot.dispatchEvent(new CustomEvent(UNREGISTER_GET_ADOPTED_STYLESHEETS_REQUEST_EVENT, { bubbles: true }));
  1512. }
  1513. } catch (error) {
  1514. // ignored
  1515. }
  1516. }
  1517. getElementsInfo(win, doc, element, options, data, elementHidden);
  1518. if (!options.autoSaveExternalSave && options.removeHiddenElements && ascendantHidden) {
  1519. if (elementKept || element.getAttribute(KEPT_CONTENT_ATTRIBUTE_NAME) == "") {
  1520. if (element.parentElement) {
  1521. element.parentElement.setAttribute(KEPT_CONTENT_ATTRIBUTE_NAME, "");
  1522. data.markedElements.push(element.parentElement);
  1523. }
  1524. } else if (elementHidden) {
  1525. element.setAttribute(REMOVED_CONTENT_ATTRIBUTE_NAME, "");
  1526. data.markedElements.push(element);
  1527. }
  1528. }
  1529. });
  1530. }
  1531. return data;
  1532. }
  1533. function getStylesheetsContent(styleSheets) {
  1534. return styleSheets ? Array.from(styleSheets).map(stylesheet => Array.from(stylesheet.cssRules).map(cssRule => cssRule.cssText).join("\n")) : [];
  1535. }
  1536. function getResourcesInfo(win, doc, element, options, data, elementHidden, computedStyle) {
  1537. const tagName = element.tagName && element.tagName.toUpperCase();
  1538. if (tagName == "CANVAS") {
  1539. try {
  1540. data.canvases.push({
  1541. dataURI: element.toDataURL("image/png", ""),
  1542. backgroundColor: computedStyle.getPropertyValue("background-color")
  1543. });
  1544. element.setAttribute(CANVAS_ATTRIBUTE_NAME, data.canvases.length - 1);
  1545. data.markedElements.push(element);
  1546. } catch (error) {
  1547. // ignored
  1548. }
  1549. }
  1550. if (tagName == "IMG") {
  1551. const imageData = {
  1552. currentSrc: elementHidden ?
  1553. EMPTY_RESOURCE$1 :
  1554. (options.loadDeferredImages && element.getAttribute(LAZY_SRC_ATTRIBUTE_NAME)) || element.currentSrc
  1555. };
  1556. data.images.push(imageData);
  1557. element.setAttribute(IMAGE_ATTRIBUTE_NAME, data.images.length - 1);
  1558. data.markedElements.push(element);
  1559. element.removeAttribute(LAZY_SRC_ATTRIBUTE_NAME);
  1560. computedStyle = computedStyle || getComputedStyle$1(win, element);
  1561. if (computedStyle) {
  1562. imageData.size = getSize(win, element, computedStyle);
  1563. const boxShadow = computedStyle.getPropertyValue("box-shadow");
  1564. const backgroundImage = computedStyle.getPropertyValue("background-image");
  1565. if ((!boxShadow || boxShadow == "none") &&
  1566. (!backgroundImage || backgroundImage == "none") &&
  1567. (imageData.size.pxWidth > 1 || imageData.size.pxHeight > 1)) {
  1568. imageData.replaceable = true;
  1569. imageData.backgroundColor = computedStyle.getPropertyValue("background-color");
  1570. imageData.objectFit = computedStyle.getPropertyValue("object-fit");
  1571. imageData.boxSizing = computedStyle.getPropertyValue("box-sizing");
  1572. imageData.objectPosition = computedStyle.getPropertyValue("object-position");
  1573. }
  1574. }
  1575. }
  1576. if (tagName == "VIDEO") {
  1577. const src = element.currentSrc;
  1578. if (src && !src.startsWith("blob:") && !src.startsWith("data:")) {
  1579. const computedStyle = getComputedStyle$1(win, element.parentNode);
  1580. data.videos.push({
  1581. positionParent: computedStyle && computedStyle.getPropertyValue("position"),
  1582. src,
  1583. size: {
  1584. pxWidth: element.clientWidth,
  1585. pxHeight: element.clientHeight
  1586. },
  1587. currentTime: element.currentTime
  1588. });
  1589. element.setAttribute(VIDEO_ATTRIBUTE_NAME, data.videos.length - 1);
  1590. }
  1591. if (!element.getAttribute("poster")) {
  1592. const canvasElement = doc.createElement("canvas");
  1593. const context = canvasElement.getContext("2d");
  1594. canvasElement.width = element.clientWidth;
  1595. canvasElement.height = element.clientHeight;
  1596. try {
  1597. context.drawImage(element, 0, 0, canvasElement.width, canvasElement.height);
  1598. data.posters.push(canvasElement.toDataURL("image/png", ""));
  1599. element.setAttribute(POSTER_ATTRIBUTE_NAME, data.posters.length - 1);
  1600. data.markedElements.push(element);
  1601. } catch (error) {
  1602. // ignored
  1603. }
  1604. }
  1605. }
  1606. if (tagName == "IFRAME") {
  1607. if (elementHidden && options.removeHiddenElements) {
  1608. element.setAttribute(HIDDEN_FRAME_ATTRIBUTE_NAME, "");
  1609. data.markedElements.push(element);
  1610. }
  1611. }
  1612. if (tagName == "INPUT") {
  1613. if (element.type != "password") {
  1614. element.setAttribute(INPUT_VALUE_ATTRIBUTE_NAME, element.value);
  1615. data.markedElements.push(element);
  1616. }
  1617. if (element.type == "radio" || element.type == "checkbox") {
  1618. element.setAttribute(INPUT_VALUE_ATTRIBUTE_NAME, element.checked);
  1619. data.markedElements.push(element);
  1620. }
  1621. }
  1622. if (tagName == "TEXTAREA") {
  1623. element.setAttribute(INPUT_VALUE_ATTRIBUTE_NAME, element.value);
  1624. data.markedElements.push(element);
  1625. }
  1626. if (tagName == "SELECT") {
  1627. element.querySelectorAll("option").forEach(option => {
  1628. if (option.selected) {
  1629. option.setAttribute(INPUT_VALUE_ATTRIBUTE_NAME, "");
  1630. data.markedElements.push(option);
  1631. }
  1632. });
  1633. }
  1634. if (tagName == "SCRIPT") {
  1635. if (element.async && element.getAttribute("async") != "" && element.getAttribute("async") != "async") {
  1636. element.setAttribute(ASYNC_SCRIPT_ATTRIBUTE_NAME, "");
  1637. data.markedElements.push(element);
  1638. }
  1639. element.textContent = element.textContent.replace(/<\/script>/gi, "<\\/script>");
  1640. }
  1641. }
  1642. function getUsedFont(computedStyle, options, usedFonts) {
  1643. if (computedStyle) {
  1644. const fontStyle = computedStyle.getPropertyValue("font-style") || "normal";
  1645. computedStyle.getPropertyValue("font-family").split(",").forEach(fontFamilyName => {
  1646. fontFamilyName = normalizeFontFamily(fontFamilyName);
  1647. if (!options.loadedFonts || options.loadedFonts.find(font => normalizeFontFamily(font.family) == fontFamilyName && font.style == fontStyle)) {
  1648. const fontWeight = getFontWeight(computedStyle.getPropertyValue("font-weight"));
  1649. const fontVariant = computedStyle.getPropertyValue("font-variant") || "normal";
  1650. const value = [fontFamilyName, fontWeight, fontStyle, fontVariant];
  1651. usedFonts.set(JSON$1.stringify(value), [fontFamilyName, fontWeight, fontStyle, fontVariant]);
  1652. }
  1653. });
  1654. }
  1655. }
  1656. function getShadowRoot(element) {
  1657. const chrome = globalThis.chrome;
  1658. if (element.openOrClosedShadowRoot) {
  1659. return element.openOrClosedShadowRoot;
  1660. } else if (chrome && chrome.dom && chrome.dom.openOrClosedShadowRoot) {
  1661. try {
  1662. return chrome.dom.openOrClosedShadowRoot(element);
  1663. } catch (error) {
  1664. return element.shadowRoot;
  1665. }
  1666. } else {
  1667. return element.shadowRoot;
  1668. }
  1669. }
  1670. function appendInfobar(doc, options, useShadowRoot) {
  1671. return appendInfobar$1(doc, options, useShadowRoot);
  1672. }
  1673. function normalizeFontFamily(fontFamilyName = "") {
  1674. return removeQuotes$1(process$6(fontFamilyName.trim())).toLowerCase();
  1675. }
  1676. function testHiddenElement(element, computedStyle) {
  1677. let hidden = false;
  1678. if (computedStyle) {
  1679. const display = computedStyle.getPropertyValue("display");
  1680. const opacity = computedStyle.getPropertyValue("opacity");
  1681. const visibility = computedStyle.getPropertyValue("visibility");
  1682. hidden = display == "none";
  1683. if (!hidden && (opacity == "0" || visibility == "hidden") && element.getBoundingClientRect) {
  1684. const boundingRect = element.getBoundingClientRect();
  1685. hidden = !boundingRect.width && !boundingRect.height;
  1686. }
  1687. }
  1688. return Boolean(hidden);
  1689. }
  1690. function postProcessDoc(doc, markedElements, invalidElements) {
  1691. doc.querySelectorAll("[" + DISABLED_NOSCRIPT_ATTRIBUTE_NAME + "]").forEach(element => {
  1692. element.textContent = element.getAttribute(DISABLED_NOSCRIPT_ATTRIBUTE_NAME);
  1693. element.removeAttribute(DISABLED_NOSCRIPT_ATTRIBUTE_NAME);
  1694. });
  1695. doc.querySelectorAll("meta[disabled-http-equiv]").forEach(element => {
  1696. element.setAttribute("http-equiv", element.getAttribute("disabled-http-equiv"));
  1697. element.removeAttribute("disabled-http-equiv");
  1698. });
  1699. if (doc.head) {
  1700. doc.head.querySelectorAll("*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)").forEach(element => element.removeAttribute("hidden"));
  1701. }
  1702. if (!markedElements) {
  1703. const singleFileAttributes = [REMOVED_CONTENT_ATTRIBUTE_NAME, HIDDEN_FRAME_ATTRIBUTE_NAME, HIDDEN_CONTENT_ATTRIBUTE_NAME, PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME, IMAGE_ATTRIBUTE_NAME, POSTER_ATTRIBUTE_NAME, VIDEO_ATTRIBUTE_NAME, CANVAS_ATTRIBUTE_NAME, INPUT_VALUE_ATTRIBUTE_NAME, SHADOW_ROOT_ATTRIBUTE_NAME, STYLESHEET_ATTRIBUTE_NAME, ASYNC_SCRIPT_ATTRIBUTE_NAME];
  1704. markedElements = doc.querySelectorAll(singleFileAttributes.map(name => "[" + name + "]").join(","));
  1705. }
  1706. markedElements.forEach(element => {
  1707. element.removeAttribute(REMOVED_CONTENT_ATTRIBUTE_NAME);
  1708. element.removeAttribute(HIDDEN_CONTENT_ATTRIBUTE_NAME);
  1709. element.removeAttribute(KEPT_CONTENT_ATTRIBUTE_NAME);
  1710. element.removeAttribute(HIDDEN_FRAME_ATTRIBUTE_NAME);
  1711. element.removeAttribute(PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME);
  1712. element.removeAttribute(IMAGE_ATTRIBUTE_NAME);
  1713. element.removeAttribute(POSTER_ATTRIBUTE_NAME);
  1714. element.removeAttribute(VIDEO_ATTRIBUTE_NAME);
  1715. element.removeAttribute(CANVAS_ATTRIBUTE_NAME);
  1716. element.removeAttribute(INPUT_VALUE_ATTRIBUTE_NAME);
  1717. element.removeAttribute(SHADOW_ROOT_ATTRIBUTE_NAME);
  1718. element.removeAttribute(STYLESHEET_ATTRIBUTE_NAME);
  1719. element.removeAttribute(ASYNC_SCRIPT_ATTRIBUTE_NAME);
  1720. element.removeAttribute(STYLE_ATTRIBUTE_NAME);
  1721. });
  1722. if (invalidElements) {
  1723. invalidElements.forEach((placeholderElement, element) => placeholderElement.replaceWith(element));
  1724. }
  1725. }
  1726. function getStylesheetsData(doc) {
  1727. if (doc) {
  1728. const contents = [];
  1729. doc.querySelectorAll("style").forEach((styleElement, styleIndex) => {
  1730. try {
  1731. if (!styleElement.sheet.disabled) {
  1732. const tempStyleElement = doc.createElement("style");
  1733. tempStyleElement.textContent = styleElement.textContent;
  1734. doc.body.appendChild(tempStyleElement);
  1735. const stylesheet = tempStyleElement.sheet;
  1736. tempStyleElement.remove();
  1737. const textContentStylesheet = Array.from(stylesheet.cssRules).map(cssRule => cssRule.cssText).join("\n");
  1738. const sheetStylesheet = Array.from(styleElement.sheet.cssRules).map(cssRule => cssRule.cssText).join("\n");
  1739. if (!stylesheet || textContentStylesheet != sheetStylesheet) {
  1740. styleElement.setAttribute(STYLESHEET_ATTRIBUTE_NAME, styleIndex);
  1741. contents[styleIndex] = Array.from(styleElement.sheet.cssRules).map(cssRule => cssRule.cssText).join("\n");
  1742. }
  1743. }
  1744. } catch (error) {
  1745. // ignored
  1746. }
  1747. });
  1748. return contents;
  1749. }
  1750. }
  1751. function getSize(win, imageElement, computedStyle) {
  1752. let pxWidth = imageElement.naturalWidth;
  1753. let pxHeight = imageElement.naturalHeight;
  1754. if (!pxWidth && !pxHeight) {
  1755. const noStyleAttribute = imageElement.getAttribute("style") == null;
  1756. computedStyle = computedStyle || getComputedStyle$1(win, imageElement);
  1757. if (computedStyle) {
  1758. let removeBorderWidth = false;
  1759. if (computedStyle.getPropertyValue("box-sizing") == "content-box") {
  1760. const boxSizingValue = imageElement.style.getPropertyValue("box-sizing");
  1761. const boxSizingPriority = imageElement.style.getPropertyPriority("box-sizing");
  1762. const clientWidth = imageElement.clientWidth;
  1763. imageElement.style.setProperty("box-sizing", "border-box", "important");
  1764. removeBorderWidth = imageElement.clientWidth != clientWidth;
  1765. if (boxSizingValue) {
  1766. imageElement.style.setProperty("box-sizing", boxSizingValue, boxSizingPriority);
  1767. } else {
  1768. imageElement.style.removeProperty("box-sizing");
  1769. }
  1770. }
  1771. let paddingLeft, paddingRight, paddingTop, paddingBottom, borderLeft, borderRight, borderTop, borderBottom;
  1772. paddingLeft = getWidth("padding-left", computedStyle);
  1773. paddingRight = getWidth("padding-right", computedStyle);
  1774. paddingTop = getWidth("padding-top", computedStyle);
  1775. paddingBottom = getWidth("padding-bottom", computedStyle);
  1776. if (removeBorderWidth) {
  1777. borderLeft = getWidth("border-left-width", computedStyle);
  1778. borderRight = getWidth("border-right-width", computedStyle);
  1779. borderTop = getWidth("border-top-width", computedStyle);
  1780. borderBottom = getWidth("border-bottom-width", computedStyle);
  1781. } else {
  1782. borderLeft = borderRight = borderTop = borderBottom = 0;
  1783. }
  1784. pxWidth = Math.max(0, imageElement.clientWidth - paddingLeft - paddingRight - borderLeft - borderRight);
  1785. pxHeight = Math.max(0, imageElement.clientHeight - paddingTop - paddingBottom - borderTop - borderBottom);
  1786. if (noStyleAttribute) {
  1787. imageElement.removeAttribute("style");
  1788. }
  1789. }
  1790. }
  1791. return { pxWidth, pxHeight };
  1792. }
  1793. function getWidth(styleName, computedStyle) {
  1794. if (computedStyle.getPropertyValue(styleName).endsWith("px")) {
  1795. return parseFloat(computedStyle.getPropertyValue(styleName));
  1796. }
  1797. }
  1798. function getFontsData() {
  1799. return getFontsData$1();
  1800. }
  1801. function removeQuotes$1(string) {
  1802. if (string.match(REGEXP_SIMPLE_QUOTES_STRING$1)) {
  1803. string = string.replace(REGEXP_SIMPLE_QUOTES_STRING$1, "$1");
  1804. } else {
  1805. string = string.replace(REGEXP_DOUBLE_QUOTES_STRING$1, "$1");
  1806. }
  1807. return string.trim();
  1808. }
  1809. function getFontWeight(weight) {
  1810. return FONT_WEIGHTS[weight.toLowerCase().trim()] || weight;
  1811. }
  1812. function getContentSize(content) {
  1813. return new Blob$4([content]).size;
  1814. }
  1815. async function digest(algo, text) {
  1816. try {
  1817. const hash = await crypto$1.subtle.digest(algo, new TextEncoder$1("utf-8").encode(text));
  1818. return hex(hash);
  1819. } catch (error) {
  1820. return "";
  1821. }
  1822. }
  1823. // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
  1824. function hex(buffer) {
  1825. const hexCodes = [];
  1826. const view = new DataView(buffer);
  1827. for (let i = 0; i < view.byteLength; i += 4) {
  1828. const value = view.getUint32(i);
  1829. const stringValue = value.toString(16);
  1830. const padding = "00000000";
  1831. const paddedValue = (padding + stringValue).slice(-padding.length);
  1832. hexCodes.push(paddedValue);
  1833. }
  1834. return hexCodes.join("");
  1835. }
  1836. function flatten(array) {
  1837. return array.flat ? array.flat() : array.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []);
  1838. }
  1839. function getComputedStyle$1(win, element, pseudoElement) {
  1840. try {
  1841. return win.getComputedStyle(element, pseudoElement);
  1842. } catch (error) {
  1843. // ignored
  1844. }
  1845. }
  1846. /*
  1847. * Copyright 2010-2022 Gildas Lormeau
  1848. * contact : gildas.lormeau <at> gmail.com
  1849. *
  1850. * This file is part of SingleFile.
  1851. *
  1852. * The code in this file is free software: you can redistribute it and/or
  1853. * modify it under the terms of the GNU Affero General Public License
  1854. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  1855. * of the License, or (at your option) any later version.
  1856. *
  1857. * The code in this file is distributed in the hope that it will be useful,
  1858. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  1859. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  1860. * General Public License for more details.
  1861. *
  1862. * As additional permission under GNU AGPL version 3 section 7, you may
  1863. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  1864. * AGPL normally required by section 4, provided you include this license
  1865. * notice and a URL through which recipients can access the Corresponding
  1866. * Source.
  1867. */
  1868. const Blob$3 = globalThis.Blob;
  1869. const FileReader$2 = globalThis.FileReader;
  1870. const URL$3 = globalThis.URL;
  1871. const URLSearchParams$1 = globalThis.URLSearchParams;
  1872. // eslint-disable-next-line quotes
  1873. const DEFAULT_REPLACED_CHARACTERS$1 = ["~", "+", "\\\\", "?", "%", "*", ":", "|", '"', "<", ">", "\x00-\x1f", "\x7F"];
  1874. const DEFAULT_REPLACEMENT_CHARACTER$1 = "_";
  1875. const REGEXP_ESCAPE = /([{}()^$&.*?/+|[\\\\]|\]|-)/g;
  1876. const EMOJI_NAMES = {
  1877. "😀": "grinning-face",
  1878. "😃": "grinning-face-with-big-eyes",
  1879. "😄": "grinning-face-with-smiling-eyes",
  1880. "😁": "beaming-face-with-smiling-eyes",
  1881. "😆": "grinning-squinting-face",
  1882. "😅": "grinning-face-with-sweat",
  1883. "🤣": "rolling-on-the-floor-laughing",
  1884. "😂": "face-with-tears-of-joy",
  1885. "🙂": "slightly-smiling-face",
  1886. "🙃": "upside-down-face",
  1887. "🫠": "melting-face",
  1888. "😉": "winking-face",
  1889. "😊": "smiling-face-with-smiling-eyes",
  1890. "😇": "smiling-face-with-halo",
  1891. "🥰": "smiling-face-with-hearts",
  1892. "😍": "smiling-face-with-heart-eyes",
  1893. "🤩": "star-struck",
  1894. "😘": "face-blowing-a-kiss",
  1895. "😗": "kissing-face",
  1896. "☺": "smiling-face",
  1897. "😚": "kissing-face-with-closed-eyes",
  1898. "😙": "kissing-face-with-smiling-eyes",
  1899. "🥲": "smiling-face-with-tear",
  1900. "😋": "face-savoring-food",
  1901. "😛": "face-with-tongue",
  1902. "😜": "winking-face-with-tongue",
  1903. "🤪": "zany-face",
  1904. "😝": "squinting-face-with-tongue",
  1905. "🤑": "money-mouth-face",
  1906. "🤗": "smiling-face-with-open-hands",
  1907. "🤭": "face-with-hand-over-mouth",
  1908. "🫢": "face-with-open-eyes-and-hand-over-mouth",
  1909. "🫣": "face-with-peeking-eye",
  1910. "🤫": "shushing-face",
  1911. "🤔": "thinking-face",
  1912. "🫡": "saluting-face",
  1913. "🤐": "zipper-mouth-face",
  1914. "🤨": "face-with-raised-eyebrow",
  1915. "😐": "neutral-face",
  1916. "😑": "expressionless-face",
  1917. "😶": "face-without-mouth",
  1918. "🫥": "dotted-line-face",
  1919. "😶‍🌫️": "face-in-clouds",
  1920. "😏": "smirking-face",
  1921. "😒": "unamused-face",
  1922. "🙄": "face-with-rolling-eyes",
  1923. "😬": "grimacing-face",
  1924. "😮‍💨": "face-exhaling",
  1925. "🤥": "lying-face",
  1926. "🫨": "⊛-shaking-face",
  1927. "😌": "relieved-face",
  1928. "😔": "pensive-face",
  1929. "😪": "sleepy-face",
  1930. "🤤": "drooling-face",
  1931. "😴": "sleeping-face",
  1932. "😷": "face-with-medical-mask",
  1933. "🤒": "face-with-thermometer",
  1934. "🤕": "face-with-head-bandage",
  1935. "🤢": "nauseated-face",
  1936. "🤮": "face-vomiting",
  1937. "🤧": "sneezing-face",
  1938. "🥵": "hot-face",
  1939. "🥶": "cold-face",
  1940. "🥴": "woozy-face",
  1941. "😵": "face-with-crossed-out-eyes",
  1942. "😵‍💫": "face-with-spiral-eyes",
  1943. "🤯": "exploding-head",
  1944. "🤠": "cowboy-hat-face",
  1945. "🥳": "partying-face",
  1946. "🥸": "disguised-face",
  1947. "😎": "smiling-face-with-sunglasses",
  1948. "🤓": "nerd-face",
  1949. "🧐": "face-with-monocle",
  1950. "😕": "confused-face",
  1951. "🫤": "face-with-diagonal-mouth",
  1952. "😟": "worried-face",
  1953. "🙁": "slightly-frowning-face",
  1954. "☹": "frowning-face",
  1955. "😮": "face-with-open-mouth",
  1956. "😯": "hushed-face",
  1957. "😲": "astonished-face",
  1958. "😳": "flushed-face",
  1959. "🥺": "pleading-face",
  1960. "🥹": "face-holding-back-tears",
  1961. "😦": "frowning-face-with-open-mouth",
  1962. "😧": "anguished-face",
  1963. "😨": "fearful-face",
  1964. "😰": "anxious-face-with-sweat",
  1965. "😥": "sad-but-relieved-face",
  1966. "😢": "crying-face",
  1967. "😭": "loudly-crying-face",
  1968. "😱": "face-screaming-in-fear",
  1969. "😖": "confounded-face",
  1970. "😣": "persevering-face",
  1971. "😞": "disappointed-face",
  1972. "😓": "downcast-face-with-sweat",
  1973. "😩": "weary-face",
  1974. "😫": "tired-face",
  1975. "🥱": "yawning-face",
  1976. "😤": "face-with-steam-from-nose",
  1977. "😡": "enraged-face",
  1978. "😠": "angry-face",
  1979. "🤬": "face-with-symbols-on-mouth",
  1980. "😈": "smiling-face-with-horns",
  1981. "👿": "angry-face-with-horns",
  1982. "💀": "skull",
  1983. "☠": "skull-and-crossbones",
  1984. "💩": "pile-of-poo",
  1985. "🤡": "clown-face",
  1986. "👹": "ogre",
  1987. "👺": "goblin",
  1988. "👻": "ghost",
  1989. "👽": "alien",
  1990. "👾": "alien-monster",
  1991. "🤖": "robot",
  1992. "😺": "grinning-cat",
  1993. "😸": "grinning-cat-with-smiling-eyes",
  1994. "😹": "cat-with-tears-of-joy",
  1995. "😻": "smiling-cat-with-heart-eyes",
  1996. "😼": "cat-with-wry-smile",
  1997. "😽": "kissing-cat",
  1998. "🙀": "weary-cat",
  1999. "😿": "crying-cat",
  2000. "😾": "pouting-cat",
  2001. "🙈": "see-no-evil-monkey",
  2002. "🙉": "hear-no-evil-monkey",
  2003. "🙊": "speak-no-evil-monkey",
  2004. "💌": "love-letter",
  2005. "💘": "heart-with-arrow",
  2006. "💝": "heart-with-ribbon",
  2007. "💖": "sparkling-heart",
  2008. "💗": "growing-heart",
  2009. "💓": "beating-heart",
  2010. "💞": "revolving-hearts",
  2011. "💕": "two-hearts",
  2012. "💟": "heart-decoration",
  2013. "❣": "heart-exclamation",
  2014. "💔": "broken-heart",
  2015. "❤️‍🔥": "heart-on-fire",
  2016. "❤️‍🩹": "mending-heart",
  2017. "❤": "red-heart",
  2018. "🩷": "⊛-pink-heart",
  2019. "🧡": "orange-heart",
  2020. "💛": "yellow-heart",
  2021. "💚": "green-heart",
  2022. "💙": "blue-heart",
  2023. "🩵": "⊛-light-blue-heart",
  2024. "💜": "purple-heart",
  2025. "🤎": "brown-heart",
  2026. "🖤": "black-heart",
  2027. "🩶": "⊛-grey-heart",
  2028. "🤍": "white-heart",
  2029. "💋": "kiss-mark",
  2030. "💯": "hundred-points",
  2031. "💢": "anger-symbol",
  2032. "💥": "collision",
  2033. "💫": "dizzy",
  2034. "💦": "sweat-droplets",
  2035. "💨": "dashing-away",
  2036. "🕳": "hole",
  2037. "💬": "speech-balloon",
  2038. "👁️‍🗨️": "eye-in-speech-bubble",
  2039. "🗨": "left-speech-bubble",
  2040. "🗯": "right-anger-bubble",
  2041. "💭": "thought-balloon",
  2042. "💤": "zzz",
  2043. "👋": "waving-hand",
  2044. "🤚": "raised-back-of-hand",
  2045. "🖐": "hand-with-fingers-splayed",
  2046. "✋": "raised-hand",
  2047. "🖖": "vulcan-salute",
  2048. "🫱": "rightwards-hand",
  2049. "🫲": "leftwards-hand",
  2050. "🫳": "palm-down-hand",
  2051. "🫴": "palm-up-hand",
  2052. "🫷": "⊛-leftwards-pushing-hand",
  2053. "🫸": "⊛-rightwards-pushing-hand",
  2054. "👌": "ok-hand",
  2055. "🤌": "pinched-fingers",
  2056. "🤏": "pinching-hand",
  2057. "✌": "victory-hand",
  2058. "🤞": "crossed-fingers",
  2059. "🫰": "hand-with-index-finger-and-thumb-crossed",
  2060. "🤟": "love-you-gesture",
  2061. "🤘": "sign-of-the-horns",
  2062. "🤙": "call-me-hand",
  2063. "👈": "backhand-index-pointing-left",
  2064. "👉": "backhand-index-pointing-right",
  2065. "👆": "backhand-index-pointing-up",
  2066. "🖕": "middle-finger",
  2067. "👇": "backhand-index-pointing-down",
  2068. "☝": "index-pointing-up",
  2069. "🫵": "index-pointing-at-the-viewer",
  2070. "👍": "thumbs-up",
  2071. "👎": "thumbs-down",
  2072. "✊": "raised-fist",
  2073. "👊": "oncoming-fist",
  2074. "🤛": "left-facing-fist",
  2075. "🤜": "right-facing-fist",
  2076. "👏": "clapping-hands",
  2077. "🙌": "raising-hands",
  2078. "🫶": "heart-hands",
  2079. "👐": "open-hands",
  2080. "🤲": "palms-up-together",
  2081. "🤝": "handshake",
  2082. "🙏": "folded-hands",
  2083. "✍": "writing-hand",
  2084. "💅": "nail-polish",
  2085. "🤳": "selfie",
  2086. "💪": "flexed-biceps",
  2087. "🦾": "mechanical-arm",
  2088. "🦿": "mechanical-leg",
  2089. "🦵": "leg",
  2090. "🦶": "foot",
  2091. "👂": "ear",
  2092. "🦻": "ear-with-hearing-aid",
  2093. "👃": "nose",
  2094. "🧠": "brain",
  2095. "🫀": "anatomical-heart",
  2096. "🫁": "lungs",
  2097. "🦷": "tooth",
  2098. "🦴": "bone",
  2099. "👀": "eyes",
  2100. "👁": "eye",
  2101. "👅": "tongue",
  2102. "👄": "mouth",
  2103. "🫦": "biting-lip",
  2104. "👶": "baby",
  2105. "🧒": "child",
  2106. "👦": "boy",
  2107. "👧": "girl",
  2108. "🧑": "person",
  2109. "👱": "person-blond-hair",
  2110. "👨": "man",
  2111. "🧔": "person-beard",
  2112. "🧔‍♂️": "man-beard",
  2113. "🧔‍♀️": "woman-beard",
  2114. "👨‍🦰": "man-red-hair",
  2115. "👨‍🦱": "man-curly-hair",
  2116. "👨‍🦳": "man-white-hair",
  2117. "👨‍🦲": "man-bald",
  2118. "👩": "woman",
  2119. "👩‍🦰": "woman-red-hair",
  2120. "🧑‍🦰": "person-red-hair",
  2121. "👩‍🦱": "woman-curly-hair",
  2122. "🧑‍🦱": "person-curly-hair",
  2123. "👩‍🦳": "woman-white-hair",
  2124. "🧑‍🦳": "person-white-hair",
  2125. "👩‍🦲": "woman-bald",
  2126. "🧑‍🦲": "person-bald",
  2127. "👱‍♀️": "woman-blond-hair",
  2128. "👱‍♂️": "man-blond-hair",
  2129. "🧓": "older-person",
  2130. "👴": "old-man",
  2131. "👵": "old-woman",
  2132. "🙍": "person-frowning",
  2133. "🙍‍♂️": "man-frowning",
  2134. "🙍‍♀️": "woman-frowning",
  2135. "🙎": "person-pouting",
  2136. "🙎‍♂️": "man-pouting",
  2137. "🙎‍♀️": "woman-pouting",
  2138. "🙅": "person-gesturing-no",
  2139. "🙅‍♂️": "man-gesturing-no",
  2140. "🙅‍♀️": "woman-gesturing-no",
  2141. "🙆": "person-gesturing-ok",
  2142. "🙆‍♂️": "man-gesturing-ok",
  2143. "🙆‍♀️": "woman-gesturing-ok",
  2144. "💁": "person-tipping-hand",
  2145. "💁‍♂️": "man-tipping-hand",
  2146. "💁‍♀️": "woman-tipping-hand",
  2147. "🙋": "person-raising-hand",
  2148. "🙋‍♂️": "man-raising-hand",
  2149. "🙋‍♀️": "woman-raising-hand",
  2150. "🧏": "deaf-person",
  2151. "🧏‍♂️": "deaf-man",
  2152. "🧏‍♀️": "deaf-woman",
  2153. "🙇": "person-bowing",
  2154. "🙇‍♂️": "man-bowing",
  2155. "🙇‍♀️": "woman-bowing",
  2156. "🤦": "person-facepalming",
  2157. "🤦‍♂️": "man-facepalming",
  2158. "🤦‍♀️": "woman-facepalming",
  2159. "🤷": "person-shrugging",
  2160. "🤷‍♂️": "man-shrugging",
  2161. "🤷‍♀️": "woman-shrugging",
  2162. "🧑‍⚕️": "health-worker",
  2163. "👨‍⚕️": "man-health-worker",
  2164. "👩‍⚕️": "woman-health-worker",
  2165. "🧑‍🎓": "student",
  2166. "👨‍🎓": "man-student",
  2167. "👩‍🎓": "woman-student",
  2168. "🧑‍🏫": "teacher",
  2169. "👨‍🏫": "man-teacher",
  2170. "👩‍🏫": "woman-teacher",
  2171. "🧑‍⚖️": "judge",
  2172. "👨‍⚖️": "man-judge",
  2173. "👩‍⚖️": "woman-judge",
  2174. "🧑‍🌾": "farmer",
  2175. "👨‍🌾": "man-farmer",
  2176. "👩‍🌾": "woman-farmer",
  2177. "🧑‍🍳": "cook",
  2178. "👨‍🍳": "man-cook",
  2179. "👩‍🍳": "woman-cook",
  2180. "🧑‍🔧": "mechanic",
  2181. "👨‍🔧": "man-mechanic",
  2182. "👩‍🔧": "woman-mechanic",
  2183. "🧑‍🏭": "factory-worker",
  2184. "👨‍🏭": "man-factory-worker",
  2185. "👩‍🏭": "woman-factory-worker",
  2186. "🧑‍💼": "office-worker",
  2187. "👨‍💼": "man-office-worker",
  2188. "👩‍💼": "woman-office-worker",
  2189. "🧑‍🔬": "scientist",
  2190. "👨‍🔬": "man-scientist",
  2191. "👩‍🔬": "woman-scientist",
  2192. "🧑‍💻": "technologist",
  2193. "👨‍💻": "man-technologist",
  2194. "👩‍💻": "woman-technologist",
  2195. "🧑‍🎤": "singer",
  2196. "👨‍🎤": "man-singer",
  2197. "👩‍🎤": "woman-singer",
  2198. "🧑‍🎨": "artist",
  2199. "👨‍🎨": "man-artist",
  2200. "👩‍🎨": "woman-artist",
  2201. "🧑‍✈️": "pilot",
  2202. "👨‍✈️": "man-pilot",
  2203. "👩‍✈️": "woman-pilot",
  2204. "🧑‍🚀": "astronaut",
  2205. "👨‍🚀": "man-astronaut",
  2206. "👩‍🚀": "woman-astronaut",
  2207. "🧑‍🚒": "firefighter",
  2208. "👨‍🚒": "man-firefighter",
  2209. "👩‍🚒": "woman-firefighter",
  2210. "👮": "police-officer",
  2211. "👮‍♂️": "man-police-officer",
  2212. "👮‍♀️": "woman-police-officer",
  2213. "🕵": "detective",
  2214. "🕵️‍♂️": "man-detective",
  2215. "🕵️‍♀️": "woman-detective",
  2216. "💂": "guard",
  2217. "💂‍♂️": "man-guard",
  2218. "💂‍♀️": "woman-guard",
  2219. "🥷": "ninja",
  2220. "👷": "construction-worker",
  2221. "👷‍♂️": "man-construction-worker",
  2222. "👷‍♀️": "woman-construction-worker",
  2223. "🫅": "person-with-crown",
  2224. "🤴": "prince",
  2225. "👸": "princess",
  2226. "👳": "person-wearing-turban",
  2227. "👳‍♂️": "man-wearing-turban",
  2228. "👳‍♀️": "woman-wearing-turban",
  2229. "👲": "person-with-skullcap",
  2230. "🧕": "woman-with-headscarf",
  2231. "🤵": "person-in-tuxedo",
  2232. "🤵‍♂️": "man-in-tuxedo",
  2233. "🤵‍♀️": "woman-in-tuxedo",
  2234. "👰": "person-with-veil",
  2235. "👰‍♂️": "man-with-veil",
  2236. "👰‍♀️": "woman-with-veil",
  2237. "🤰": "pregnant-woman",
  2238. "🫃": "pregnant-man",
  2239. "🫄": "pregnant-person",
  2240. "🤱": "breast-feeding",
  2241. "👩‍🍼": "woman-feeding-baby",
  2242. "👨‍🍼": "man-feeding-baby",
  2243. "🧑‍🍼": "person-feeding-baby",
  2244. "👼": "baby-angel",
  2245. "🎅": "santa-claus",
  2246. "🤶": "mrs-claus",
  2247. "🧑‍🎄": "mx-claus",
  2248. "🦸": "superhero",
  2249. "🦸‍♂️": "man-superhero",
  2250. "🦸‍♀️": "woman-superhero",
  2251. "🦹": "supervillain",
  2252. "🦹‍♂️": "man-supervillain",
  2253. "🦹‍♀️": "woman-supervillain",
  2254. "🧙": "mage",
  2255. "🧙‍♂️": "man-mage",
  2256. "🧙‍♀️": "woman-mage",
  2257. "🧚": "fairy",
  2258. "🧚‍♂️": "man-fairy",
  2259. "🧚‍♀️": "woman-fairy",
  2260. "🧛": "vampire",
  2261. "🧛‍♂️": "man-vampire",
  2262. "🧛‍♀️": "woman-vampire",
  2263. "🧜": "merperson",
  2264. "🧜‍♂️": "merman",
  2265. "🧜‍♀️": "mermaid",
  2266. "🧝": "elf",
  2267. "🧝‍♂️": "man-elf",
  2268. "🧝‍♀️": "woman-elf",
  2269. "🧞": "genie",
  2270. "🧞‍♂️": "man-genie",
  2271. "🧞‍♀️": "woman-genie",
  2272. "🧟": "zombie",
  2273. "🧟‍♂️": "man-zombie",
  2274. "🧟‍♀️": "woman-zombie",
  2275. "🧌": "troll",
  2276. "💆": "person-getting-massage",
  2277. "💆‍♂️": "man-getting-massage",
  2278. "💆‍♀️": "woman-getting-massage",
  2279. "💇": "person-getting-haircut",
  2280. "💇‍♂️": "man-getting-haircut",
  2281. "💇‍♀️": "woman-getting-haircut",
  2282. "🚶": "person-walking",
  2283. "🚶‍♂️": "man-walking",
  2284. "🚶‍♀️": "woman-walking",
  2285. "🧍": "person-standing",
  2286. "🧍‍♂️": "man-standing",
  2287. "🧍‍♀️": "woman-standing",
  2288. "🧎": "person-kneeling",
  2289. "🧎‍♂️": "man-kneeling",
  2290. "🧎‍♀️": "woman-kneeling",
  2291. "🧑‍🦯": "person-with-white-cane",
  2292. "👨‍🦯": "man-with-white-cane",
  2293. "👩‍🦯": "woman-with-white-cane",
  2294. "🧑‍🦼": "person-in-motorized-wheelchair",
  2295. "👨‍🦼": "man-in-motorized-wheelchair",
  2296. "👩‍🦼": "woman-in-motorized-wheelchair",
  2297. "🧑‍🦽": "person-in-manual-wheelchair",
  2298. "👨‍🦽": "man-in-manual-wheelchair",
  2299. "👩‍🦽": "woman-in-manual-wheelchair",
  2300. "🏃": "person-running",
  2301. "🏃‍♂️": "man-running",
  2302. "🏃‍♀️": "woman-running",
  2303. "💃": "woman-dancing",
  2304. "🕺": "man-dancing",
  2305. "🕴": "person-in-suit-levitating",
  2306. "👯": "people-with-bunny-ears",
  2307. "👯‍♂️": "men-with-bunny-ears",
  2308. "👯‍♀️": "women-with-bunny-ears",
  2309. "🧖": "person-in-steamy-room",
  2310. "🧖‍♂️": "man-in-steamy-room",
  2311. "🧖‍♀️": "woman-in-steamy-room",
  2312. "🧗": "person-climbing",
  2313. "🧗‍♂️": "man-climbing",
  2314. "🧗‍♀️": "woman-climbing",
  2315. "🤺": "person-fencing",
  2316. "🏇": "horse-racing",
  2317. "⛷": "skier",
  2318. "🏂": "snowboarder",
  2319. "🏌": "person-golfing",
  2320. "🏌️‍♂️": "man-golfing",
  2321. "🏌️‍♀️": "woman-golfing",
  2322. "🏄": "person-surfing",
  2323. "🏄‍♂️": "man-surfing",
  2324. "🏄‍♀️": "woman-surfing",
  2325. "🚣": "person-rowing-boat",
  2326. "🚣‍♂️": "man-rowing-boat",
  2327. "🚣‍♀️": "woman-rowing-boat",
  2328. "🏊": "person-swimming",
  2329. "🏊‍♂️": "man-swimming",
  2330. "🏊‍♀️": "woman-swimming",
  2331. "⛹": "person-bouncing-ball",
  2332. "⛹️‍♂️": "man-bouncing-ball",
  2333. "⛹️‍♀️": "woman-bouncing-ball",
  2334. "🏋": "person-lifting-weights",
  2335. "🏋️‍♂️": "man-lifting-weights",
  2336. "🏋️‍♀️": "woman-lifting-weights",
  2337. "🚴": "person-biking",
  2338. "🚴‍♂️": "man-biking",
  2339. "🚴‍♀️": "woman-biking",
  2340. "🚵": "person-mountain-biking",
  2341. "🚵‍♂️": "man-mountain-biking",
  2342. "🚵‍♀️": "woman-mountain-biking",
  2343. "🤸": "person-cartwheeling",
  2344. "🤸‍♂️": "man-cartwheeling",
  2345. "🤸‍♀️": "woman-cartwheeling",
  2346. "🤼": "people-wrestling",
  2347. "🤼‍♂️": "men-wrestling",
  2348. "🤼‍♀️": "women-wrestling",
  2349. "🤽": "person-playing-water-polo",
  2350. "🤽‍♂️": "man-playing-water-polo",
  2351. "🤽‍♀️": "woman-playing-water-polo",
  2352. "🤾": "person-playing-handball",
  2353. "🤾‍♂️": "man-playing-handball",
  2354. "🤾‍♀️": "woman-playing-handball",
  2355. "🤹": "person-juggling",
  2356. "🤹‍♂️": "man-juggling",
  2357. "🤹‍♀️": "woman-juggling",
  2358. "🧘": "person-in-lotus-position",
  2359. "🧘‍♂️": "man-in-lotus-position",
  2360. "🧘‍♀️": "woman-in-lotus-position",
  2361. "🛀": "person-taking-bath",
  2362. "🛌": "person-in-bed",
  2363. "🧑‍🤝‍🧑": "people-holding-hands",
  2364. "👭": "women-holding-hands",
  2365. "👫": "woman-and-man-holding-hands",
  2366. "👬": "men-holding-hands",
  2367. "💏": "kiss",
  2368. "👩‍❤️‍💋‍👨": "kiss-woman,-man",
  2369. "👨‍❤️‍💋‍👨": "kiss-man,-man",
  2370. "👩‍❤️‍💋‍👩": "kiss-woman,-woman",
  2371. "💑": "couple-with-heart",
  2372. "👩‍❤️‍👨": "couple-with-heart-woman,-man",
  2373. "👨‍❤️‍👨": "couple-with-heart-man,-man",
  2374. "👩‍❤️‍👩": "couple-with-heart-woman,-woman",
  2375. "👪": "family",
  2376. "👨‍👩‍👦": "family-man,-woman,-boy",
  2377. "👨‍👩‍👧": "family-man,-woman,-girl",
  2378. "👨‍👩‍👧‍👦": "family-man,-woman,-girl,-boy",
  2379. "👨‍👩‍👦‍👦": "family-man,-woman,-boy,-boy",
  2380. "👨‍👩‍👧‍👧": "family-man,-woman,-girl,-girl",
  2381. "👨‍👨‍👦": "family-man,-man,-boy",
  2382. "👨‍👨‍👧": "family-man,-man,-girl",
  2383. "👨‍👨‍👧‍👦": "family-man,-man,-girl,-boy",
  2384. "👨‍👨‍👦‍👦": "family-man,-man,-boy,-boy",
  2385. "👨‍👨‍👧‍👧": "family-man,-man,-girl,-girl",
  2386. "👩‍👩‍👦": "family-woman,-woman,-boy",
  2387. "👩‍👩‍👧": "family-woman,-woman,-girl",
  2388. "👩‍👩‍👧‍👦": "family-woman,-woman,-girl,-boy",
  2389. "👩‍👩‍👦‍👦": "family-woman,-woman,-boy,-boy",
  2390. "👩‍👩‍👧‍👧": "family-woman,-woman,-girl,-girl",
  2391. "👨‍👦": "family-man,-boy",
  2392. "👨‍👦‍👦": "family-man,-boy,-boy",
  2393. "👨‍👧": "family-man,-girl",
  2394. "👨‍👧‍👦": "family-man,-girl,-boy",
  2395. "👨‍👧‍👧": "family-man,-girl,-girl",
  2396. "👩‍👦": "family-woman,-boy",
  2397. "👩‍👦‍👦": "family-woman,-boy,-boy",
  2398. "👩‍👧": "family-woman,-girl",
  2399. "👩‍👧‍👦": "family-woman,-girl,-boy",
  2400. "👩‍👧‍👧": "family-woman,-girl,-girl",
  2401. "🗣": "speaking-head",
  2402. "👤": "bust-in-silhouette",
  2403. "👥": "busts-in-silhouette",
  2404. "🫂": "people-hugging",
  2405. "👣": "footprints",
  2406. "🦰": "red-hair",
  2407. "🦱": "curly-hair",
  2408. "🦳": "white-hair",
  2409. "🦲": "bald",
  2410. "🐵": "monkey-face",
  2411. "🐒": "monkey",
  2412. "🦍": "gorilla",
  2413. "🦧": "orangutan",
  2414. "🐶": "dog-face",
  2415. "🐕": "dog",
  2416. "🦮": "guide-dog",
  2417. "🐕‍🦺": "service-dog",
  2418. "🐩": "poodle",
  2419. "🐺": "wolf",
  2420. "🦊": "fox",
  2421. "🦝": "raccoon",
  2422. "🐱": "cat-face",
  2423. "🐈": "cat",
  2424. "🐈‍⬛": "black-cat",
  2425. "🦁": "lion",
  2426. "🐯": "tiger-face",
  2427. "🐅": "tiger",
  2428. "🐆": "leopard",
  2429. "🐴": "horse-face",
  2430. "🫎": "⊛-moose",
  2431. "🫏": "⊛-donkey",
  2432. "🐎": "horse",
  2433. "🦄": "unicorn",
  2434. "🦓": "zebra",
  2435. "🦌": "deer",
  2436. "🦬": "bison",
  2437. "🐮": "cow-face",
  2438. "🐂": "ox",
  2439. "🐃": "water-buffalo",
  2440. "🐄": "cow",
  2441. "🐷": "pig-face",
  2442. "🐖": "pig",
  2443. "🐗": "boar",
  2444. "🐽": "pig-nose",
  2445. "🐏": "ram",
  2446. "🐑": "ewe",
  2447. "🐐": "goat",
  2448. "🐪": "camel",
  2449. "🐫": "two-hump-camel",
  2450. "🦙": "llama",
  2451. "🦒": "giraffe",
  2452. "🐘": "elephant",
  2453. "🦣": "mammoth",
  2454. "🦏": "rhinoceros",
  2455. "🦛": "hippopotamus",
  2456. "🐭": "mouse-face",
  2457. "🐁": "mouse",
  2458. "🐀": "rat",
  2459. "🐹": "hamster",
  2460. "🐰": "rabbit-face",
  2461. "🐇": "rabbit",
  2462. "🐿": "chipmunk",
  2463. "🦫": "beaver",
  2464. "🦔": "hedgehog",
  2465. "🦇": "bat",
  2466. "🐻": "bear",
  2467. "🐻‍❄️": "polar-bear",
  2468. "🐨": "koala",
  2469. "🐼": "panda",
  2470. "🦥": "sloth",
  2471. "🦦": "otter",
  2472. "🦨": "skunk",
  2473. "🦘": "kangaroo",
  2474. "🦡": "badger",
  2475. "🐾": "paw-prints",
  2476. "🦃": "turkey",
  2477. "🐔": "chicken",
  2478. "🐓": "rooster",
  2479. "🐣": "hatching-chick",
  2480. "🐤": "baby-chick",
  2481. "🐥": "front-facing-baby-chick",
  2482. "🐦": "bird",
  2483. "🐧": "penguin",
  2484. "🕊": "dove",
  2485. "🦅": "eagle",
  2486. "🦆": "duck",
  2487. "🦢": "swan",
  2488. "🦉": "owl",
  2489. "🦤": "dodo",
  2490. "🪶": "feather",
  2491. "🦩": "flamingo",
  2492. "🦚": "peacock",
  2493. "🦜": "parrot",
  2494. "🪽": "⊛-wing",
  2495. "🐦‍⬛": "⊛-black-bird",
  2496. "🪿": "⊛-goose",
  2497. "🐸": "frog",
  2498. "🐊": "crocodile",
  2499. "🐢": "turtle",
  2500. "🦎": "lizard",
  2501. "🐍": "snake",
  2502. "🐲": "dragon-face",
  2503. "🐉": "dragon",
  2504. "🦕": "sauropod",
  2505. "🦖": "t-rex",
  2506. "🐳": "spouting-whale",
  2507. "🐋": "whale",
  2508. "🐬": "dolphin",
  2509. "🦭": "seal",
  2510. "🐟": "fish",
  2511. "🐠": "tropical-fish",
  2512. "🐡": "blowfish",
  2513. "🦈": "shark",
  2514. "🐙": "octopus",
  2515. "🐚": "spiral-shell",
  2516. "🪸": "coral",
  2517. "🪼": "⊛-jellyfish",
  2518. "🐌": "snail",
  2519. "🦋": "butterfly",
  2520. "🐛": "bug",
  2521. "🐜": "ant",
  2522. "🐝": "honeybee",
  2523. "🪲": "beetle",
  2524. "🐞": "lady-beetle",
  2525. "🦗": "cricket",
  2526. "🪳": "cockroach",
  2527. "🕷": "spider",
  2528. "🕸": "spider-web",
  2529. "🦂": "scorpion",
  2530. "🦟": "mosquito",
  2531. "🪰": "fly",
  2532. "🪱": "worm",
  2533. "🦠": "microbe",
  2534. "💐": "bouquet",
  2535. "🌸": "cherry-blossom",
  2536. "💮": "white-flower",
  2537. "🪷": "lotus",
  2538. "🏵": "rosette",
  2539. "🌹": "rose",
  2540. "🥀": "wilted-flower",
  2541. "🌺": "hibiscus",
  2542. "🌻": "sunflower",
  2543. "🌼": "blossom",
  2544. "🌷": "tulip",
  2545. "🪻": "⊛-hyacinth",
  2546. "🌱": "seedling",
  2547. "🪴": "potted-plant",
  2548. "🌲": "evergreen-tree",
  2549. "🌳": "deciduous-tree",
  2550. "🌴": "palm-tree",
  2551. "🌵": "cactus",
  2552. "🌾": "sheaf-of-rice",
  2553. "🌿": "herb",
  2554. "☘": "shamrock",
  2555. "🍀": "four-leaf-clover",
  2556. "🍁": "maple-leaf",
  2557. "🍂": "fallen-leaf",
  2558. "🍃": "leaf-fluttering-in-wind",
  2559. "🪹": "empty-nest",
  2560. "🪺": "nest-with-eggs",
  2561. "🍄": "mushroom",
  2562. "🍇": "grapes",
  2563. "🍈": "melon",
  2564. "🍉": "watermelon",
  2565. "🍊": "tangerine",
  2566. "🍋": "lemon",
  2567. "🍌": "banana",
  2568. "🍍": "pineapple",
  2569. "🥭": "mango",
  2570. "🍎": "red-apple",
  2571. "🍏": "green-apple",
  2572. "🍐": "pear",
  2573. "🍑": "peach",
  2574. "🍒": "cherries",
  2575. "🍓": "strawberry",
  2576. "🫐": "blueberries",
  2577. "🥝": "kiwi-fruit",
  2578. "🍅": "tomato",
  2579. "🫒": "olive",
  2580. "🥥": "coconut",
  2581. "🥑": "avocado",
  2582. "🍆": "eggplant",
  2583. "🥔": "potato",
  2584. "🥕": "carrot",
  2585. "🌽": "ear-of-corn",
  2586. "🌶": "hot-pepper",
  2587. "🫑": "bell-pepper",
  2588. "🥒": "cucumber",
  2589. "🥬": "leafy-green",
  2590. "🥦": "broccoli",
  2591. "🧄": "garlic",
  2592. "🧅": "onion",
  2593. "🥜": "peanuts",
  2594. "🫘": "beans",
  2595. "🌰": "chestnut",
  2596. "🫚": "⊛-ginger-root",
  2597. "🫛": "⊛-pea-pod",
  2598. "🍞": "bread",
  2599. "🥐": "croissant",
  2600. "🥖": "baguette-bread",
  2601. "🫓": "flatbread",
  2602. "🥨": "pretzel",
  2603. "🥯": "bagel",
  2604. "🥞": "pancakes",
  2605. "🧇": "waffle",
  2606. "🧀": "cheese-wedge",
  2607. "🍖": "meat-on-bone",
  2608. "🍗": "poultry-leg",
  2609. "🥩": "cut-of-meat",
  2610. "🥓": "bacon",
  2611. "🍔": "hamburger",
  2612. "🍟": "french-fries",
  2613. "🍕": "pizza",
  2614. "🌭": "hot-dog",
  2615. "🥪": "sandwich",
  2616. "🌮": "taco",
  2617. "🌯": "burrito",
  2618. "🫔": "tamale",
  2619. "🥙": "stuffed-flatbread",
  2620. "🧆": "falafel",
  2621. "🥚": "egg",
  2622. "🍳": "cooking",
  2623. "🥘": "shallow-pan-of-food",
  2624. "🍲": "pot-of-food",
  2625. "🫕": "fondue",
  2626. "🥣": "bowl-with-spoon",
  2627. "🥗": "green-salad",
  2628. "🍿": "popcorn",
  2629. "🧈": "butter",
  2630. "🧂": "salt",
  2631. "🥫": "canned-food",
  2632. "🍱": "bento-box",
  2633. "🍘": "rice-cracker",
  2634. "🍙": "rice-ball",
  2635. "🍚": "cooked-rice",
  2636. "🍛": "curry-rice",
  2637. "🍜": "steaming-bowl",
  2638. "🍝": "spaghetti",
  2639. "🍠": "roasted-sweet-potato",
  2640. "🍢": "oden",
  2641. "🍣": "sushi",
  2642. "🍤": "fried-shrimp",
  2643. "🍥": "fish-cake-with-swirl",
  2644. "🥮": "moon-cake",
  2645. "🍡": "dango",
  2646. "🥟": "dumpling",
  2647. "🥠": "fortune-cookie",
  2648. "🥡": "takeout-box",
  2649. "🦀": "crab",
  2650. "🦞": "lobster",
  2651. "🦐": "shrimp",
  2652. "🦑": "squid",
  2653. "🦪": "oyster",
  2654. "🍦": "soft-ice-cream",
  2655. "🍧": "shaved-ice",
  2656. "🍨": "ice-cream",
  2657. "🍩": "doughnut",
  2658. "🍪": "cookie",
  2659. "🎂": "birthday-cake",
  2660. "🍰": "shortcake",
  2661. "🧁": "cupcake",
  2662. "🥧": "pie",
  2663. "🍫": "chocolate-bar",
  2664. "🍬": "candy",
  2665. "🍭": "lollipop",
  2666. "🍮": "custard",
  2667. "🍯": "honey-pot",
  2668. "🍼": "baby-bottle",
  2669. "🥛": "glass-of-milk",
  2670. "☕": "hot-beverage",
  2671. "🫖": "teapot",
  2672. "🍵": "teacup-without-handle",
  2673. "🍶": "sake",
  2674. "🍾": "bottle-with-popping-cork",
  2675. "🍷": "wine-glass",
  2676. "🍸": "cocktail-glass",
  2677. "🍹": "tropical-drink",
  2678. "🍺": "beer-mug",
  2679. "🍻": "clinking-beer-mugs",
  2680. "🥂": "clinking-glasses",
  2681. "🥃": "tumbler-glass",
  2682. "🫗": "pouring-liquid",
  2683. "🥤": "cup-with-straw",
  2684. "🧋": "bubble-tea",
  2685. "🧃": "beverage-box",
  2686. "🧉": "mate",
  2687. "🧊": "ice",
  2688. "🥢": "chopsticks",
  2689. "🍽": "fork-and-knife-with-plate",
  2690. "🍴": "fork-and-knife",
  2691. "🥄": "spoon",
  2692. "🔪": "kitchen-knife",
  2693. "🫙": "jar",
  2694. "🏺": "amphora",
  2695. "🌍": "globe-showing-europe-africa",
  2696. "🌎": "globe-showing-americas",
  2697. "🌏": "globe-showing-asia-australia",
  2698. "🌐": "globe-with-meridians",
  2699. "🗺": "world-map",
  2700. "🗾": "map-of-japan",
  2701. "🧭": "compass",
  2702. "🏔": "snow-capped-mountain",
  2703. "⛰": "mountain",
  2704. "🌋": "volcano",
  2705. "🗻": "mount-fuji",
  2706. "🏕": "camping",
  2707. "🏖": "beach-with-umbrella",
  2708. "🏜": "desert",
  2709. "🏝": "desert-island",
  2710. "🏞": "national-park",
  2711. "🏟": "stadium",
  2712. "🏛": "classical-building",
  2713. "🏗": "building-construction",
  2714. "🧱": "brick",
  2715. "🪨": "rock",
  2716. "🪵": "wood",
  2717. "🛖": "hut",
  2718. "🏘": "houses",
  2719. "🏚": "derelict-house",
  2720. "🏠": "house",
  2721. "🏡": "house-with-garden",
  2722. "🏢": "office-building",
  2723. "🏣": "japanese-post-office",
  2724. "🏤": "post-office",
  2725. "🏥": "hospital",
  2726. "🏦": "bank",
  2727. "🏨": "hotel",
  2728. "🏩": "love-hotel",
  2729. "🏪": "convenience-store",
  2730. "🏫": "school",
  2731. "🏬": "department-store",
  2732. "🏭": "factory",
  2733. "🏯": "japanese-castle",
  2734. "🏰": "castle",
  2735. "💒": "wedding",
  2736. "🗼": "tokyo-tower",
  2737. "🗽": "statue-of-liberty",
  2738. "⛪": "church",
  2739. "🕌": "mosque",
  2740. "🛕": "hindu-temple",
  2741. "🕍": "synagogue",
  2742. "⛩": "shinto-shrine",
  2743. "🕋": "kaaba",
  2744. "⛲": "fountain",
  2745. "⛺": "tent",
  2746. "🌁": "foggy",
  2747. "🌃": "night-with-stars",
  2748. "🏙": "cityscape",
  2749. "🌄": "sunrise-over-mountains",
  2750. "🌅": "sunrise",
  2751. "🌆": "cityscape-at-dusk",
  2752. "🌇": "sunset",
  2753. "🌉": "bridge-at-night",
  2754. "♨": "hot-springs",
  2755. "🎠": "carousel-horse",
  2756. "🛝": "playground-slide",
  2757. "🎡": "ferris-wheel",
  2758. "🎢": "roller-coaster",
  2759. "💈": "barber-pole",
  2760. "🎪": "circus-tent",
  2761. "🚂": "locomotive",
  2762. "🚃": "railway-car",
  2763. "🚄": "high-speed-train",
  2764. "🚅": "bullet-train",
  2765. "🚆": "train",
  2766. "🚇": "metro",
  2767. "🚈": "light-rail",
  2768. "🚉": "station",
  2769. "🚊": "tram",
  2770. "🚝": "monorail",
  2771. "🚞": "mountain-railway",
  2772. "🚋": "tram-car",
  2773. "🚌": "bus",
  2774. "🚍": "oncoming-bus",
  2775. "🚎": "trolleybus",
  2776. "🚐": "minibus",
  2777. "🚑": "ambulance",
  2778. "🚒": "fire-engine",
  2779. "🚓": "police-car",
  2780. "🚔": "oncoming-police-car",
  2781. "🚕": "taxi",
  2782. "🚖": "oncoming-taxi",
  2783. "🚗": "automobile",
  2784. "🚘": "oncoming-automobile",
  2785. "🚙": "sport-utility-vehicle",
  2786. "🛻": "pickup-truck",
  2787. "🚚": "delivery-truck",
  2788. "🚛": "articulated-lorry",
  2789. "🚜": "tractor",
  2790. "🏎": "racing-car",
  2791. "🏍": "motorcycle",
  2792. "🛵": "motor-scooter",
  2793. "🦽": "manual-wheelchair",
  2794. "🦼": "motorized-wheelchair",
  2795. "🛺": "auto-rickshaw",
  2796. "🚲": "bicycle",
  2797. "🛴": "kick-scooter",
  2798. "🛹": "skateboard",
  2799. "🛼": "roller-skate",
  2800. "🚏": "bus-stop",
  2801. "🛣": "motorway",
  2802. "🛤": "railway-track",
  2803. "🛢": "oil-drum",
  2804. "⛽": "fuel-pump",
  2805. "🛞": "wheel",
  2806. "🚨": "police-car-light",
  2807. "🚥": "horizontal-traffic-light",
  2808. "🚦": "vertical-traffic-light",
  2809. "🛑": "stop-sign",
  2810. "🚧": "construction",
  2811. "⚓": "anchor",
  2812. "🛟": "ring-buoy",
  2813. "⛵": "sailboat",
  2814. "🛶": "canoe",
  2815. "🚤": "speedboat",
  2816. "🛳": "passenger-ship",
  2817. "⛴": "ferry",
  2818. "🛥": "motor-boat",
  2819. "🚢": "ship",
  2820. "✈": "airplane",
  2821. "🛩": "small-airplane",
  2822. "🛫": "airplane-departure",
  2823. "🛬": "airplane-arrival",
  2824. "🪂": "parachute",
  2825. "💺": "seat",
  2826. "🚁": "helicopter",
  2827. "🚟": "suspension-railway",
  2828. "🚠": "mountain-cableway",
  2829. "🚡": "aerial-tramway",
  2830. "🛰": "satellite",
  2831. "🚀": "rocket",
  2832. "🛸": "flying-saucer",
  2833. "🛎": "bellhop-bell",
  2834. "🧳": "luggage",
  2835. "⌛": "hourglass-done",
  2836. "⏳": "hourglass-not-done",
  2837. "⌚": "watch",
  2838. "⏰": "alarm-clock",
  2839. "⏱": "stopwatch",
  2840. "⏲": "timer-clock",
  2841. "🕰": "mantelpiece-clock",
  2842. "🕛": "twelve-o-clock",
  2843. "🕧": "twelve-thirty",
  2844. "🕐": "one-o-clock",
  2845. "🕜": "one-thirty",
  2846. "🕑": "two-o-clock",
  2847. "🕝": "two-thirty",
  2848. "🕒": "three-o-clock",
  2849. "🕞": "three-thirty",
  2850. "🕓": "four-o-clock",
  2851. "🕟": "four-thirty",
  2852. "🕔": "five-o-clock",
  2853. "🕠": "five-thirty",
  2854. "🕕": "six-o-clock",
  2855. "🕡": "six-thirty",
  2856. "🕖": "seven-o-clock",
  2857. "🕢": "seven-thirty",
  2858. "🕗": "eight-o-clock",
  2859. "🕣": "eight-thirty",
  2860. "🕘": "nine-o-clock",
  2861. "🕤": "nine-thirty",
  2862. "🕙": "ten-o-clock",
  2863. "🕥": "ten-thirty",
  2864. "🕚": "eleven-o-clock",
  2865. "🕦": "eleven-thirty",
  2866. "🌑": "new-moon",
  2867. "🌒": "waxing-crescent-moon",
  2868. "🌓": "first-quarter-moon",
  2869. "🌔": "waxing-gibbous-moon",
  2870. "🌕": "full-moon",
  2871. "🌖": "waning-gibbous-moon",
  2872. "🌗": "last-quarter-moon",
  2873. "🌘": "waning-crescent-moon",
  2874. "🌙": "crescent-moon",
  2875. "🌚": "new-moon-face",
  2876. "🌛": "first-quarter-moon-face",
  2877. "🌜": "last-quarter-moon-face",
  2878. "🌡": "thermometer",
  2879. "☀": "sun",
  2880. "🌝": "full-moon-face",
  2881. "🌞": "sun-with-face",
  2882. "🪐": "ringed-planet",
  2883. "⭐": "star",
  2884. "🌟": "glowing-star",
  2885. "🌠": "shooting-star",
  2886. "🌌": "milky-way",
  2887. "☁": "cloud",
  2888. "⛅": "sun-behind-cloud",
  2889. "⛈": "cloud-with-lightning-and-rain",
  2890. "🌤": "sun-behind-small-cloud",
  2891. "🌥": "sun-behind-large-cloud",
  2892. "🌦": "sun-behind-rain-cloud",
  2893. "🌧": "cloud-with-rain",
  2894. "🌨": "cloud-with-snow",
  2895. "🌩": "cloud-with-lightning",
  2896. "🌪": "tornado",
  2897. "🌫": "fog",
  2898. "🌬": "wind-face",
  2899. "🌀": "cyclone",
  2900. "🌈": "rainbow",
  2901. "🌂": "closed-umbrella",
  2902. "☂": "umbrella",
  2903. "☔": "umbrella-with-rain-drops",
  2904. "⛱": "umbrella-on-ground",
  2905. "⚡": "high-voltage",
  2906. "❄": "snowflake",
  2907. "☃": "snowman",
  2908. "⛄": "snowman-without-snow",
  2909. "☄": "comet",
  2910. "🔥": "fire",
  2911. "💧": "droplet",
  2912. "🌊": "water-wave",
  2913. "🎃": "jack-o-lantern",
  2914. "🎄": "christmas-tree",
  2915. "🎆": "fireworks",
  2916. "🎇": "sparkler",
  2917. "🧨": "firecracker",
  2918. "✨": "sparkles",
  2919. "🎈": "balloon",
  2920. "🎉": "party-popper",
  2921. "🎊": "confetti-ball",
  2922. "🎋": "tanabata-tree",
  2923. "🎍": "pine-decoration",
  2924. "🎎": "japanese-dolls",
  2925. "🎏": "carp-streamer",
  2926. "🎐": "wind-chime",
  2927. "🎑": "moon-viewing-ceremony",
  2928. "🧧": "red-envelope",
  2929. "🎀": "ribbon",
  2930. "🎁": "wrapped-gift",
  2931. "🎗": "reminder-ribbon",
  2932. "🎟": "admission-tickets",
  2933. "🎫": "ticket",
  2934. "🎖": "military-medal",
  2935. "🏆": "trophy",
  2936. "🏅": "sports-medal",
  2937. "🥇": "1st-place-medal",
  2938. "🥈": "2nd-place-medal",
  2939. "🥉": "3rd-place-medal",
  2940. "⚽": "soccer-ball",
  2941. "⚾": "baseball",
  2942. "🥎": "softball",
  2943. "🏀": "basketball",
  2944. "🏐": "volleyball",
  2945. "🏈": "american-football",
  2946. "🏉": "rugby-football",
  2947. "🎾": "tennis",
  2948. "🥏": "flying-disc",
  2949. "🎳": "bowling",
  2950. "🏏": "cricket-game",
  2951. "🏑": "field-hockey",
  2952. "🏒": "ice-hockey",
  2953. "🥍": "lacrosse",
  2954. "🏓": "ping-pong",
  2955. "🏸": "badminton",
  2956. "🥊": "boxing-glove",
  2957. "🥋": "martial-arts-uniform",
  2958. "🥅": "goal-net",
  2959. "⛳": "flag-in-hole",
  2960. "⛸": "ice-skate",
  2961. "🎣": "fishing-pole",
  2962. "🤿": "diving-mask",
  2963. "🎽": "running-shirt",
  2964. "🎿": "skis",
  2965. "🛷": "sled",
  2966. "🥌": "curling-stone",
  2967. "🎯": "bullseye",
  2968. "🪀": "yo-yo",
  2969. "🪁": "kite",
  2970. "🔫": "water-pistol",
  2971. "🎱": "pool-8-ball",
  2972. "🔮": "crystal-ball",
  2973. "🪄": "magic-wand",
  2974. "🎮": "video-game",
  2975. "🕹": "joystick",
  2976. "🎰": "slot-machine",
  2977. "🎲": "game-die",
  2978. "🧩": "puzzle-piece",
  2979. "🧸": "teddy-bear",
  2980. "🪅": "piñata",
  2981. "🪩": "mirror-ball",
  2982. "🪆": "nesting-dolls",
  2983. "♠": "spade-suit",
  2984. "♥": "heart-suit",
  2985. "♦": "diamond-suit",
  2986. "♣": "club-suit",
  2987. "♟": "chess-pawn",
  2988. "🃏": "joker",
  2989. "🀄": "mahjong-red-dragon",
  2990. "🎴": "flower-playing-cards",
  2991. "🎭": "performing-arts",
  2992. "🖼": "framed-picture",
  2993. "🎨": "artist-palette",
  2994. "🧵": "thread",
  2995. "🪡": "sewing-needle",
  2996. "🧶": "yarn",
  2997. "🪢": "knot",
  2998. "👓": "glasses",
  2999. "🕶": "sunglasses",
  3000. "🥽": "goggles",
  3001. "🥼": "lab-coat",
  3002. "🦺": "safety-vest",
  3003. "👔": "necktie",
  3004. "👕": "t-shirt",
  3005. "👖": "jeans",
  3006. "🧣": "scarf",
  3007. "🧤": "gloves",
  3008. "🧥": "coat",
  3009. "🧦": "socks",
  3010. "👗": "dress",
  3011. "👘": "kimono",
  3012. "🥻": "sari",
  3013. "🩱": "one-piece-swimsuit",
  3014. "🩲": "briefs",
  3015. "🩳": "shorts",
  3016. "👙": "bikini",
  3017. "👚": "woman-s-clothes",
  3018. "🪭": "⊛-folding-hand-fan",
  3019. "👛": "purse",
  3020. "👜": "handbag",
  3021. "👝": "clutch-bag",
  3022. "🛍": "shopping-bags",
  3023. "🎒": "backpack",
  3024. "🩴": "thong-sandal",
  3025. "👞": "man-s-shoe",
  3026. "👟": "running-shoe",
  3027. "🥾": "hiking-boot",
  3028. "🥿": "flat-shoe",
  3029. "👠": "high-heeled-shoe",
  3030. "👡": "woman-s-sandal",
  3031. "🩰": "ballet-shoes",
  3032. "👢": "woman-s-boot",
  3033. "🪮": "⊛-hair-pick",
  3034. "👑": "crown",
  3035. "👒": "woman-s-hat",
  3036. "🎩": "top-hat",
  3037. "🎓": "graduation-cap",
  3038. "🧢": "billed-cap",
  3039. "🪖": "military-helmet",
  3040. "⛑": "rescue-worker-s-helmet",
  3041. "📿": "prayer-beads",
  3042. "💄": "lipstick",
  3043. "💍": "ring",
  3044. "💎": "gem-stone",
  3045. "🔇": "muted-speaker",
  3046. "🔈": "speaker-low-volume",
  3047. "🔉": "speaker-medium-volume",
  3048. "🔊": "speaker-high-volume",
  3049. "📢": "loudspeaker",
  3050. "📣": "megaphone",
  3051. "📯": "postal-horn",
  3052. "🔔": "bell",
  3053. "🔕": "bell-with-slash",
  3054. "🎼": "musical-score",
  3055. "🎵": "musical-note",
  3056. "🎶": "musical-notes",
  3057. "🎙": "studio-microphone",
  3058. "🎚": "level-slider",
  3059. "🎛": "control-knobs",
  3060. "🎤": "microphone",
  3061. "🎧": "headphone",
  3062. "📻": "radio",
  3063. "🎷": "saxophone",
  3064. "🪗": "accordion",
  3065. "🎸": "guitar",
  3066. "🎹": "musical-keyboard",
  3067. "🎺": "trumpet",
  3068. "🎻": "violin",
  3069. "🪕": "banjo",
  3070. "🥁": "drum",
  3071. "🪘": "long-drum",
  3072. "🪇": "maracas",
  3073. "🪈": "flute",
  3074. "📱": "mobile-phone",
  3075. "📲": "mobile-phone-with-arrow",
  3076. "☎": "telephone",
  3077. "📞": "telephone-receiver",
  3078. "📟": "pager",
  3079. "📠": "fax-machine",
  3080. "🔋": "battery",
  3081. "🪫": "low-battery",
  3082. "🔌": "electric-plug",
  3083. "💻": "laptop",
  3084. "🖥": "desktop-computer",
  3085. "🖨": "printer",
  3086. "⌨": "keyboard",
  3087. "🖱": "computer-mouse",
  3088. "🖲": "trackball",
  3089. "💽": "computer-disk",
  3090. "💾": "floppy-disk",
  3091. "💿": "optical-disk",
  3092. "📀": "dvd",
  3093. "🧮": "abacus",
  3094. "🎥": "movie-camera",
  3095. "🎞": "film-frames",
  3096. "📽": "film-projector",
  3097. "🎬": "clapper-board",
  3098. "📺": "television",
  3099. "📷": "camera",
  3100. "📸": "camera-with-flash",
  3101. "📹": "video-camera",
  3102. "📼": "videocassette",
  3103. "🔍": "magnifying-glass-tilted-left",
  3104. "🔎": "magnifying-glass-tilted-right",
  3105. "🕯": "candle",
  3106. "💡": "light-bulb",
  3107. "🔦": "flashlight",
  3108. "🏮": "red-paper-lantern",
  3109. "🪔": "diya-lamp",
  3110. "📔": "notebook-with-decorative-cover",
  3111. "📕": "closed-book",
  3112. "📖": "open-book",
  3113. "📗": "green-book",
  3114. "📘": "blue-book",
  3115. "📙": "orange-book",
  3116. "📚": "books",
  3117. "📓": "notebook",
  3118. "📒": "ledger",
  3119. "📃": "page-with-curl",
  3120. "📜": "scroll",
  3121. "📄": "page-facing-up",
  3122. "📰": "newspaper",
  3123. "🗞": "rolled-up-newspaper",
  3124. "📑": "bookmark-tabs",
  3125. "🔖": "bookmark",
  3126. "🏷": "label",
  3127. "💰": "money-bag",
  3128. "🪙": "coin",
  3129. "💴": "yen-banknote",
  3130. "💵": "dollar-banknote",
  3131. "💶": "euro-banknote",
  3132. "💷": "pound-banknote",
  3133. "💸": "money-with-wings",
  3134. "💳": "credit-card",
  3135. "🧾": "receipt",
  3136. "💹": "chart-increasing-with-yen",
  3137. "✉": "envelope",
  3138. "📧": "e-mail",
  3139. "📨": "incoming-envelope",
  3140. "📩": "envelope-with-arrow",
  3141. "📤": "outbox-tray",
  3142. "📥": "inbox-tray",
  3143. "📦": "package",
  3144. "📫": "closed-mailbox-with-raised-flag",
  3145. "📪": "closed-mailbox-with-lowered-flag",
  3146. "📬": "open-mailbox-with-raised-flag",
  3147. "📭": "open-mailbox-with-lowered-flag",
  3148. "📮": "postbox",
  3149. "🗳": "ballot-box-with-ballot",
  3150. "✏": "pencil",
  3151. "✒": "black-nib",
  3152. "🖋": "fountain-pen",
  3153. "🖊": "pen",
  3154. "🖌": "paintbrush",
  3155. "🖍": "crayon",
  3156. "📝": "memo",
  3157. "💼": "briefcase",
  3158. "📁": "file-folder",
  3159. "📂": "open-file-folder",
  3160. "🗂": "card-index-dividers",
  3161. "📅": "calendar",
  3162. "📆": "tear-off-calendar",
  3163. "🗒": "spiral-notepad",
  3164. "🗓": "spiral-calendar",
  3165. "📇": "card-index",
  3166. "📈": "chart-increasing",
  3167. "📉": "chart-decreasing",
  3168. "📊": "bar-chart",
  3169. "📋": "clipboard",
  3170. "📌": "pushpin",
  3171. "📍": "round-pushpin",
  3172. "📎": "paperclip",
  3173. "🖇": "linked-paperclips",
  3174. "📏": "straight-ruler",
  3175. "📐": "triangular-ruler",
  3176. "✂": "scissors",
  3177. "🗃": "card-file-box",
  3178. "🗄": "file-cabinet",
  3179. "🗑": "wastebasket",
  3180. "🔒": "locked",
  3181. "🔓": "unlocked",
  3182. "🔏": "locked-with-pen",
  3183. "🔐": "locked-with-key",
  3184. "🔑": "key",
  3185. "🗝": "old-key",
  3186. "🔨": "hammer",
  3187. "🪓": "axe",
  3188. "⛏": "pick",
  3189. "⚒": "hammer-and-pick",
  3190. "🛠": "hammer-and-wrench",
  3191. "🗡": "dagger",
  3192. "⚔": "crossed-swords",
  3193. "💣": "bomb",
  3194. "🪃": "boomerang",
  3195. "🏹": "bow-and-arrow",
  3196. "🛡": "shield",
  3197. "🪚": "carpentry-saw",
  3198. "🔧": "wrench",
  3199. "🪛": "screwdriver",
  3200. "🔩": "nut-and-bolt",
  3201. "⚙": "gear",
  3202. "🗜": "clamp",
  3203. "⚖": "balance-scale",
  3204. "🦯": "white-cane",
  3205. "🔗": "link",
  3206. "⛓": "chains",
  3207. "🪝": "hook",
  3208. "🧰": "toolbox",
  3209. "🧲": "magnet",
  3210. "🪜": "ladder",
  3211. "⚗": "alembic",
  3212. "🧪": "test-tube",
  3213. "🧫": "petri-dish",
  3214. "🧬": "dna",
  3215. "🔬": "microscope",
  3216. "🔭": "telescope",
  3217. "📡": "satellite-antenna",
  3218. "💉": "syringe",
  3219. "🩸": "drop-of-blood",
  3220. "💊": "pill",
  3221. "🩹": "adhesive-bandage",
  3222. "🩼": "crutch",
  3223. "🩺": "stethoscope",
  3224. "🩻": "x-ray",
  3225. "🚪": "door",
  3226. "🛗": "elevator",
  3227. "🪞": "mirror",
  3228. "🪟": "window",
  3229. "🛏": "bed",
  3230. "🛋": "couch-and-lamp",
  3231. "🪑": "chair",
  3232. "🚽": "toilet",
  3233. "🪠": "plunger",
  3234. "🚿": "shower",
  3235. "🛁": "bathtub",
  3236. "🪤": "mouse-trap",
  3237. "🪒": "razor",
  3238. "🧴": "lotion-bottle",
  3239. "🧷": "safety-pin",
  3240. "🧹": "broom",
  3241. "🧺": "basket",
  3242. "🧻": "roll-of-paper",
  3243. "🪣": "bucket",
  3244. "🧼": "soap",
  3245. "🫧": "bubbles",
  3246. "🪥": "toothbrush",
  3247. "🧽": "sponge",
  3248. "🧯": "fire-extinguisher",
  3249. "🛒": "shopping-cart",
  3250. "🚬": "cigarette",
  3251. "⚰": "coffin",
  3252. "🪦": "headstone",
  3253. "⚱": "funeral-urn",
  3254. "🧿": "nazar-amulet",
  3255. "🪬": "hamsa",
  3256. "🗿": "moai",
  3257. "🪧": "placard",
  3258. "🪪": "identification-card",
  3259. "🏧": "atm-sign",
  3260. "🚮": "litter-in-bin-sign",
  3261. "🚰": "potable-water",
  3262. "♿": "wheelchair-symbol",
  3263. "🚹": "men-s-room",
  3264. "🚺": "women-s-room",
  3265. "🚻": "restroom",
  3266. "🚼": "baby-symbol",
  3267. "🚾": "water-closet",
  3268. "🛂": "passport-control",
  3269. "🛃": "customs",
  3270. "🛄": "baggage-claim",
  3271. "🛅": "left-luggage",
  3272. "⚠": "warning",
  3273. "🚸": "children-crossing",
  3274. "⛔": "no-entry",
  3275. "🚫": "prohibited",
  3276. "🚳": "no-bicycles",
  3277. "🚭": "no-smoking",
  3278. "🚯": "no-littering",
  3279. "🚱": "non-potable-water",
  3280. "🚷": "no-pedestrians",
  3281. "📵": "no-mobile-phones",
  3282. "🔞": "no-one-under-eighteen",
  3283. "☢": "radioactive",
  3284. "☣": "biohazard",
  3285. "⬆": "up-arrow",
  3286. "↗": "up-right-arrow",
  3287. "➡": "right-arrow",
  3288. "↘": "down-right-arrow",
  3289. "⬇": "down-arrow",
  3290. "↙": "down-left-arrow",
  3291. "⬅": "left-arrow",
  3292. "↖": "up-left-arrow",
  3293. "↕": "up-down-arrow",
  3294. "↔": "left-right-arrow",
  3295. "↩": "right-arrow-curving-left",
  3296. "↪": "left-arrow-curving-right",
  3297. "⤴": "right-arrow-curving-up",
  3298. "⤵": "right-arrow-curving-down",
  3299. "🔃": "clockwise-vertical-arrows",
  3300. "🔄": "counterclockwise-arrows-button",
  3301. "🔙": "back-arrow",
  3302. "🔚": "end-arrow",
  3303. "🔛": "on!-arrow",
  3304. "🔜": "soon-arrow",
  3305. "🔝": "top-arrow",
  3306. "🛐": "place-of-worship",
  3307. "⚛": "atom-symbol",
  3308. "🕉": "om",
  3309. "✡": "star-of-david",
  3310. "☸": "wheel-of-dharma",
  3311. "☯": "yin-yang",
  3312. "✝": "latin-cross",
  3313. "☦": "orthodox-cross",
  3314. "☪": "star-and-crescent",
  3315. "☮": "peace-symbol",
  3316. "🕎": "menorah",
  3317. "🔯": "dotted-six-pointed-star",
  3318. "🪯": "⊛-khanda",
  3319. "♈": "aries",
  3320. "♉": "taurus",
  3321. "♊": "gemini",
  3322. "♋": "cancer",
  3323. "♌": "leo",
  3324. "♍": "virgo",
  3325. "♎": "libra",
  3326. "♏": "scorpio",
  3327. "♐": "sagittarius",
  3328. "♑": "capricorn",
  3329. "♒": "aquarius",
  3330. "♓": "pisces",
  3331. "⛎": "ophiuchus",
  3332. "🔀": "shuffle-tracks-button",
  3333. "🔁": "repeat-button",
  3334. "🔂": "repeat-single-button",
  3335. "▶": "play-button",
  3336. "⏩": "fast-forward-button",
  3337. "⏭": "next-track-button",
  3338. "⏯": "play-or-pause-button",
  3339. "◀": "reverse-button",
  3340. "⏪": "fast-reverse-button",
  3341. "⏮": "last-track-button",
  3342. "🔼": "upwards-button",
  3343. "⏫": "fast-up-button",
  3344. "🔽": "downwards-button",
  3345. "⏬": "fast-down-button",
  3346. "⏸": "pause-button",
  3347. "⏹": "stop-button",
  3348. "⏺": "record-button",
  3349. "⏏": "eject-button",
  3350. "🎦": "cinema",
  3351. "🔅": "dim-button",
  3352. "🔆": "bright-button",
  3353. "📶": "antenna-bars",
  3354. "🛜": "⊛-wireless",
  3355. "📳": "vibration-mode",
  3356. "📴": "mobile-phone-off",
  3357. "♀": "female-sign",
  3358. "♂": "male-sign",
  3359. "⚧": "transgender-symbol",
  3360. "✖": "multiply",
  3361. "➕": "plus",
  3362. "➖": "minus",
  3363. "➗": "divide",
  3364. "🟰": "heavy-equals-sign",
  3365. "♾": "infinity",
  3366. "‼": "double-exclamation-mark",
  3367. "⁉": "exclamation-question-mark",
  3368. "❓": "red-question-mark",
  3369. "❔": "white-question-mark",
  3370. "❕": "white-exclamation-mark",
  3371. "❗": "red-exclamation-mark",
  3372. "〰": "wavy-dash",
  3373. "💱": "currency-exchange",
  3374. "💲": "heavy-dollar-sign",
  3375. "⚕": "medical-symbol",
  3376. "♻": "recycling-symbol",
  3377. "⚜": "fleur-de-lis",
  3378. "🔱": "trident-emblem",
  3379. "📛": "name-badge",
  3380. "🔰": "japanese-symbol-for-beginner",
  3381. "⭕": "hollow-red-circle",
  3382. "✅": "check-mark-button",
  3383. "☑": "check-box-with-check",
  3384. "✔": "check-mark",
  3385. "❌": "cross-mark",
  3386. "❎": "cross-mark-button",
  3387. "➰": "curly-loop",
  3388. "➿": "double-curly-loop",
  3389. "〽": "part-alternation-mark",
  3390. "✳": "eight-spoked-asterisk",
  3391. "✴": "eight-pointed-star",
  3392. "❇": "sparkle",
  3393. "©": "copyright",
  3394. "®": "registered",
  3395. "™": "trade-mark",
  3396. "#️⃣": "keycap-#",
  3397. "*️⃣": "keycap-*",
  3398. "0️⃣": "keycap-0",
  3399. "1️⃣": "keycap-1",
  3400. "2️⃣": "keycap-2",
  3401. "3️⃣": "keycap-3",
  3402. "4️⃣": "keycap-4",
  3403. "5️⃣": "keycap-5",
  3404. "6️⃣": "keycap-6",
  3405. "7️⃣": "keycap-7",
  3406. "8️⃣": "keycap-8",
  3407. "9️⃣": "keycap-9",
  3408. "🔟": "keycap-10",
  3409. "🔠": "input-latin-uppercase",
  3410. "🔡": "input-latin-lowercase",
  3411. "🔢": "input-numbers",
  3412. "🔣": "input-symbols",
  3413. "🔤": "input-latin-letters",
  3414. "🅰": "a-button-(blood-type)",
  3415. "🆎": "ab-button-(blood-type)",
  3416. "🅱": "b-button-(blood-type)",
  3417. "🆑": "cl-button",
  3418. "🆒": "cool-button",
  3419. "🆓": "free-button",
  3420. ℹ: "information",
  3421. "🆔": "id-button",
  3422. "Ⓜ": "circled-m",
  3423. "🆕": "new-button",
  3424. "🆖": "ng-button",
  3425. "🅾": "o-button-(blood-type)",
  3426. "🆗": "ok-button",
  3427. "🅿": "p-button",
  3428. "🆘": "sos-button",
  3429. "🆙": "up!-button",
  3430. "🆚": "vs-button",
  3431. "🈁": "japanese-here-button",
  3432. "🈂": "japanese-service-charge-button",
  3433. "🈷": "japanese-monthly-amount-button",
  3434. "🈶": "japanese-not-free-of-charge-button",
  3435. "🈯": "japanese-reserved-button",
  3436. "🉐": "japanese-bargain-button",
  3437. "🈹": "japanese-discount-button",
  3438. "🈚": "japanese-free-of-charge-button",
  3439. "🈲": "japanese-prohibited-button",
  3440. "🉑": "japanese-acceptable-button",
  3441. "🈸": "japanese-application-button",
  3442. "🈴": "japanese-passing-grade-button",
  3443. "🈳": "japanese-vacancy-button",
  3444. "㊗": "japanese-congratulations-button",
  3445. "㊙": "japanese-secret-button",
  3446. "🈺": "japanese-open-for-business-button",
  3447. "🈵": "japanese-no-vacancy-button",
  3448. "🔴": "red-circle",
  3449. "🟠": "orange-circle",
  3450. "🟡": "yellow-circle",
  3451. "🟢": "green-circle",
  3452. "🔵": "blue-circle",
  3453. "🟣": "purple-circle",
  3454. "🟤": "brown-circle",
  3455. "⚫": "black-circle",
  3456. "⚪": "white-circle",
  3457. "🟥": "red-square",
  3458. "🟧": "orange-square",
  3459. "🟨": "yellow-square",
  3460. "🟩": "green-square",
  3461. "🟦": "blue-square",
  3462. "🟪": "purple-square",
  3463. "🟫": "brown-square",
  3464. "⬛": "black-large-square",
  3465. "⬜": "white-large-square",
  3466. "◼": "black-medium-square",
  3467. "◻": "white-medium-square",
  3468. "◾": "black-medium-small-square",
  3469. "◽": "white-medium-small-square",
  3470. "▪": "black-small-square",
  3471. "▫": "white-small-square",
  3472. "🔶": "large-orange-diamond",
  3473. "🔷": "large-blue-diamond",
  3474. "🔸": "small-orange-diamond",
  3475. "🔹": "small-blue-diamond",
  3476. "🔺": "red-triangle-pointed-up",
  3477. "🔻": "red-triangle-pointed-down",
  3478. "💠": "diamond-with-a-dot",
  3479. "🔘": "radio-button",
  3480. "🔳": "white-square-button",
  3481. "🔲": "black-square-button",
  3482. "🏁": "chequered-flag",
  3483. "🚩": "triangular-flag",
  3484. "🎌": "crossed-flags",
  3485. "🏴": "black-flag",
  3486. "🏳": "white-flag",
  3487. "🏳️‍🌈": "rainbow-flag",
  3488. "🏳️‍⚧️": "transgender-flag",
  3489. "🏴‍☠️": "pirate-flag",
  3490. "🇦🇨": "flag-ascension-island",
  3491. "🇦🇩": "flag-andorra",
  3492. "🇦🇪": "flag-united-arab-emirates",
  3493. "🇦🇫": "flag-afghanistan",
  3494. "🇦🇬": "flag-antigua-and-barbuda",
  3495. "🇦🇮": "flag-anguilla",
  3496. "🇦🇱": "flag-albania",
  3497. "🇦🇲": "flag-armenia",
  3498. "🇦🇴": "flag-angola",
  3499. "🇦🇶": "flag-antarctica",
  3500. "🇦🇷": "flag-argentina",
  3501. "🇦🇸": "flag-american-samoa",
  3502. "🇦🇹": "flag-austria",
  3503. "🇦🇺": "flag-australia",
  3504. "🇦🇼": "flag-aruba",
  3505. "🇦🇽": "flag-åland-islands",
  3506. "🇦🇿": "flag-azerbaijan",
  3507. "🇧🇦": "flag-bosnia-and-herzegovina",
  3508. "🇧🇧": "flag-barbados",
  3509. "🇧🇩": "flag-bangladesh",
  3510. "🇧🇪": "flag-belgium",
  3511. "🇧🇫": "flag-burkina-faso",
  3512. "🇧🇬": "flag-bulgaria",
  3513. "🇧🇭": "flag-bahrain",
  3514. "🇧🇮": "flag-burundi",
  3515. "🇧🇯": "flag-benin",
  3516. "🇧🇱": "flag-st-barthelemy",
  3517. "🇧🇲": "flag-bermuda",
  3518. "🇧🇳": "flag-brunei",
  3519. "🇧🇴": "flag-bolivia",
  3520. "🇧🇶": "flag-caribbean-netherlands",
  3521. "🇧🇷": "flag-brazil",
  3522. "🇧🇸": "flag-bahamas",
  3523. "🇧🇹": "flag-bhutan",
  3524. "🇧🇻": "flag-bouvet-island",
  3525. "🇧🇼": "flag-botswana",
  3526. "🇧🇾": "flag-belarus",
  3527. "🇧🇿": "flag-belize",
  3528. "🇨🇦": "flag-canada",
  3529. "🇨🇨": "flag-cocos-(keeling)-islands",
  3530. "🇨🇩": "flag-congo---kinshasa",
  3531. "🇨🇫": "flag-central-african-republic",
  3532. "🇨🇬": "flag-congo---brazzaville",
  3533. "🇨🇭": "flag-switzerland",
  3534. "🇨🇮": "flag-côte-d-ivoire",
  3535. "🇨🇰": "flag-cook-islands",
  3536. "🇨🇱": "flag-chile",
  3537. "🇨🇲": "flag-cameroon",
  3538. "🇨🇳": "flag-china",
  3539. "🇨🇴": "flag-colombia",
  3540. "🇨🇵": "flag-clipperton-island",
  3541. "🇨🇷": "flag-costa-rica",
  3542. "🇨🇺": "flag-cuba",
  3543. "🇨🇻": "flag-cape-verde",
  3544. "🇨🇼": "flag-curaçao",
  3545. "🇨🇽": "flag-christmas-island",
  3546. "🇨🇾": "flag-cyprus",
  3547. "🇨🇿": "flag-czechia",
  3548. "🇩🇪": "flag-germany",
  3549. "🇩🇬": "flag-diego-garcia",
  3550. "🇩🇯": "flag-djibouti",
  3551. "🇩🇰": "flag-denmark",
  3552. "🇩🇲": "flag-dominica",
  3553. "🇩🇴": "flag-dominican-republic",
  3554. "🇩🇿": "flag-algeria",
  3555. "🇪🇦": "flag-ceuta-and-melilla",
  3556. "🇪🇨": "flag-ecuador",
  3557. "🇪🇪": "flag-estonia",
  3558. "🇪🇬": "flag-egypt",
  3559. "🇪🇭": "flag-western-sahara",
  3560. "🇪🇷": "flag-eritrea",
  3561. "🇪🇸": "flag-spain",
  3562. "🇪🇹": "flag-ethiopia",
  3563. "🇪🇺": "flag-european-union",
  3564. "🇫🇮": "flag-finland",
  3565. "🇫🇯": "flag-fiji",
  3566. "🇫🇰": "flag-falkland-islands",
  3567. "🇫🇲": "flag-micronesia",
  3568. "🇫🇴": "flag-faroe-islands",
  3569. "🇫🇷": "flag-france",
  3570. "🇬🇦": "flag-gabon",
  3571. "🇬🇧": "flag-united-kingdom",
  3572. "🇬🇩": "flag-grenada",
  3573. "🇬🇪": "flag-georgia",
  3574. "🇬🇫": "flag-french-guiana",
  3575. "🇬🇬": "flag-guernsey",
  3576. "🇬🇭": "flag-ghana",
  3577. "🇬🇮": "flag-gibraltar",
  3578. "🇬🇱": "flag-greenland",
  3579. "🇬🇲": "flag-gambia",
  3580. "🇬🇳": "flag-guinea",
  3581. "🇬🇵": "flag-guadeloupe",
  3582. "🇬🇶": "flag-equatorial-guinea",
  3583. "🇬🇷": "flag-greece",
  3584. "🇬🇸": "flag-south-georgia-and-south-sandwich-islands",
  3585. "🇬🇹": "flag-guatemala",
  3586. "🇬🇺": "flag-guam",
  3587. "🇬🇼": "flag-guinea-bissau",
  3588. "🇬🇾": "flag-guyana",
  3589. "🇭🇰": "flag-hong-kong-sar-china",
  3590. "🇭🇲": "flag-heard-and-mcdonald-islands",
  3591. "🇭🇳": "flag-honduras",
  3592. "🇭🇷": "flag-croatia",
  3593. "🇭🇹": "flag-haiti",
  3594. "🇭🇺": "flag-hungary",
  3595. "🇮🇨": "flag-canary-islands",
  3596. "🇮🇩": "flag-indonesia",
  3597. "🇮🇪": "flag-ireland",
  3598. "🇮🇱": "flag-israel",
  3599. "🇮🇲": "flag-isle-of-man",
  3600. "🇮🇳": "flag-india",
  3601. "🇮🇴": "flag-british-indian-ocean-territory",
  3602. "🇮🇶": "flag-iraq",
  3603. "🇮🇷": "flag-iran",
  3604. "🇮🇸": "flag-iceland",
  3605. "🇮🇹": "flag-italy",
  3606. "🇯🇪": "flag-jersey",
  3607. "🇯🇲": "flag-jamaica",
  3608. "🇯🇴": "flag-jordan",
  3609. "🇯🇵": "flag-japan",
  3610. "🇰🇪": "flag-kenya",
  3611. "🇰🇬": "flag-kyrgyzstan",
  3612. "🇰🇭": "flag-cambodia",
  3613. "🇰🇮": "flag-kiribati",
  3614. "🇰🇲": "flag-comoros",
  3615. "🇰🇳": "flag-st-kitts-and-nevis",
  3616. "🇰🇵": "flag-north-korea",
  3617. "🇰🇷": "flag-south-korea",
  3618. "🇰🇼": "flag-kuwait",
  3619. "🇰🇾": "flag-cayman-islands",
  3620. "🇰🇿": "flag-kazakhstan",
  3621. "🇱🇦": "flag-laos",
  3622. "🇱🇧": "flag-lebanon",
  3623. "🇱🇨": "flag-st-lucia",
  3624. "🇱🇮": "flag-liechtenstein",
  3625. "🇱🇰": "flag-sri-lanka",
  3626. "🇱🇷": "flag-liberia",
  3627. "🇱🇸": "flag-lesotho",
  3628. "🇱🇹": "flag-lithuania",
  3629. "🇱🇺": "flag-luxembourg",
  3630. "🇱🇻": "flag-latvia",
  3631. "🇱🇾": "flag-libya",
  3632. "🇲🇦": "flag-morocco",
  3633. "🇲🇨": "flag-monaco",
  3634. "🇲🇩": "flag-moldova",
  3635. "🇲🇪": "flag-montenegro",
  3636. "🇲🇫": "flag-st-martin",
  3637. "🇲🇬": "flag-madagascar",
  3638. "🇲🇭": "flag-marshall-islands",
  3639. "🇲🇰": "flag-north-macedonia",
  3640. "🇲🇱": "flag-mali",
  3641. "🇲🇲": "flag-myanmar-(burma)",
  3642. "🇲🇳": "flag-mongolia",
  3643. "🇲🇴": "flag-macao-sar-china",
  3644. "🇲🇵": "flag-northern-mariana-islands",
  3645. "🇲🇶": "flag-martinique",
  3646. "🇲🇷": "flag-mauritania",
  3647. "🇲🇸": "flag-montserrat",
  3648. "🇲🇹": "flag-malta",
  3649. "🇲🇺": "flag-mauritius",
  3650. "🇲🇻": "flag-maldives",
  3651. "🇲🇼": "flag-malawi",
  3652. "🇲🇽": "flag-mexico",
  3653. "🇲🇾": "flag-malaysia",
  3654. "🇲🇿": "flag-mozambique",
  3655. "🇳🇦": "flag-namibia",
  3656. "🇳🇨": "flag-new-caledonia",
  3657. "🇳🇪": "flag-niger",
  3658. "🇳🇫": "flag-norfolk-island",
  3659. "🇳🇬": "flag-nigeria",
  3660. "🇳🇮": "flag-nicaragua",
  3661. "🇳🇱": "flag-netherlands",
  3662. "🇳🇴": "flag-norway",
  3663. "🇳🇵": "flag-nepal",
  3664. "🇳🇷": "flag-nauru",
  3665. "🇳🇺": "flag-niue",
  3666. "🇳🇿": "flag-new-zealand",
  3667. "🇴🇲": "flag-oman",
  3668. "🇵🇦": "flag-panama",
  3669. "🇵🇪": "flag-peru",
  3670. "🇵🇫": "flag-french-polynesia",
  3671. "🇵🇬": "flag-papua-new-guinea",
  3672. "🇵🇭": "flag-philippines",
  3673. "🇵🇰": "flag-pakistan",
  3674. "🇵🇱": "flag-poland",
  3675. "🇵🇲": "flag-st-pierre-and-miquelon",
  3676. "🇵🇳": "flag-pitcairn-islands",
  3677. "🇵🇷": "flag-puerto-rico",
  3678. "🇵🇸": "flag-palestinian-territories",
  3679. "🇵🇹": "flag-portugal",
  3680. "🇵🇼": "flag-palau",
  3681. "🇵🇾": "flag-paraguay",
  3682. "🇶🇦": "flag-qatar",
  3683. "🇷🇪": "flag-reunion",
  3684. "🇷🇴": "flag-romania",
  3685. "🇷🇸": "flag-serbia",
  3686. "🇷🇺": "flag-russia",
  3687. "🇷🇼": "flag-rwanda",
  3688. "🇸🇦": "flag-saudi-arabia",
  3689. "🇸🇧": "flag-solomon-islands",
  3690. "🇸🇨": "flag-seychelles",
  3691. "🇸🇩": "flag-sudan",
  3692. "🇸🇪": "flag-sweden",
  3693. "🇸🇬": "flag-singapore",
  3694. "🇸🇭": "flag-st-helena",
  3695. "🇸🇮": "flag-slovenia",
  3696. "🇸🇯": "flag-svalbard-and-jan-mayen",
  3697. "🇸🇰": "flag-slovakia",
  3698. "🇸🇱": "flag-sierra-leone",
  3699. "🇸🇲": "flag-san-marino",
  3700. "🇸🇳": "flag-senegal",
  3701. "🇸🇴": "flag-somalia",
  3702. "🇸🇷": "flag-suriname",
  3703. "🇸🇸": "flag-south-sudan",
  3704. "🇸🇹": "flag-são-tome-and-príncipe",
  3705. "🇸🇻": "flag-el-salvador",
  3706. "🇸🇽": "flag-sint-maarten",
  3707. "🇸🇾": "flag-syria",
  3708. "🇸🇿": "flag-eswatini",
  3709. "🇹🇦": "flag-tristan-da-cunha",
  3710. "🇹🇨": "flag-turks-and-caicos-islands",
  3711. "🇹🇩": "flag-chad",
  3712. "🇹🇫": "flag-french-southern-territories",
  3713. "🇹🇬": "flag-togo",
  3714. "🇹🇭": "flag-thailand",
  3715. "🇹🇯": "flag-tajikistan",
  3716. "🇹🇰": "flag-tokelau",
  3717. "🇹🇱": "flag-timor-leste",
  3718. "🇹🇲": "flag-turkmenistan",
  3719. "🇹🇳": "flag-tunisia",
  3720. "🇹🇴": "flag-tonga",
  3721. "🇹🇷": "flag-turkey",
  3722. "🇹🇹": "flag-trinidad-and-tobago",
  3723. "🇹🇻": "flag-tuvalu",
  3724. "🇹🇼": "flag-taiwan",
  3725. "🇹🇿": "flag-tanzania",
  3726. "🇺🇦": "flag-ukraine",
  3727. "🇺🇬": "flag-uganda",
  3728. "🇺🇲": "flag-us-outlying-islands",
  3729. "🇺🇳": "flag-united-nations",
  3730. "🇺🇸": "flag-united-states",
  3731. "🇺🇾": "flag-uruguay",
  3732. "🇺🇿": "flag-uzbekistan",
  3733. "🇻🇦": "flag-vatican-city",
  3734. "🇻🇨": "flag-st-vincent-and-grenadines",
  3735. "🇻🇪": "flag-venezuela",
  3736. "🇻🇬": "flag-british-virgin-islands",
  3737. "🇻🇮": "flag-us-virgin-islands",
  3738. "🇻🇳": "flag-vietnam",
  3739. "🇻🇺": "flag-vanuatu",
  3740. "🇼🇫": "flag-wallis-and-futuna",
  3741. "🇼🇸": "flag-samoa",
  3742. "🇽🇰": "flag-kosovo",
  3743. "🇾🇪": "flag-yemen",
  3744. "🇾🇹": "flag-mayotte",
  3745. "🇿🇦": "flag-south-africa",
  3746. "🇿🇲": "flag-zambia",
  3747. "🇿🇼": "flag-zimbabwe",
  3748. "🏴󠁧󠁢󠁥󠁮󠁧󠁿": "flag-england",
  3749. "🏴󠁧󠁢󠁳󠁣󠁴󠁿": "flag-scotland",
  3750. "🏴󠁧󠁢󠁷󠁬󠁳󠁿": "flag-wales"
  3751. };
  3752. const EMOJIS = Object.keys(EMOJI_NAMES);
  3753. // https://publicsuffix.org/list/public_suffix_list.dat
  3754. const PUBLIC_SUFFIX_LIST = `
  3755. // This Source Code Form is subject to the terms of the Mozilla Public
  3756. // License, v. 2.0. If a copy of the MPL was not distributed with this
  3757. // file, You can obtain one at https://mozilla.org/MPL/2.0/.
  3758. // Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat,
  3759. // rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported.
  3760. // Instructions on pulling and using this list can be found at https://publicsuffix.org/list/.
  3761. // ===BEGIN ICANN DOMAINS===
  3762. // ac : http://nic.ac/rules.htm
  3763. ac
  3764. com.ac
  3765. edu.ac
  3766. gov.ac
  3767. net.ac
  3768. mil.ac
  3769. org.ac
  3770. // ad : https://en.wikipedia.org/wiki/.ad
  3771. ad
  3772. nom.ad
  3773. // ae : https://tdra.gov.ae/en/aeda/ae-policies
  3774. ae
  3775. co.ae
  3776. net.ae
  3777. org.ae
  3778. sch.ae
  3779. ac.ae
  3780. gov.ae
  3781. mil.ae
  3782. // aero : see https://www.information.aero/index.php?id=66
  3783. aero
  3784. accident-investigation.aero
  3785. accident-prevention.aero
  3786. aerobatic.aero
  3787. aeroclub.aero
  3788. aerodrome.aero
  3789. agents.aero
  3790. aircraft.aero
  3791. airline.aero
  3792. airport.aero
  3793. air-surveillance.aero
  3794. airtraffic.aero
  3795. air-traffic-control.aero
  3796. ambulance.aero
  3797. amusement.aero
  3798. association.aero
  3799. author.aero
  3800. ballooning.aero
  3801. broker.aero
  3802. caa.aero
  3803. cargo.aero
  3804. catering.aero
  3805. certification.aero
  3806. championship.aero
  3807. charter.aero
  3808. civilaviation.aero
  3809. club.aero
  3810. conference.aero
  3811. consultant.aero
  3812. consulting.aero
  3813. control.aero
  3814. council.aero
  3815. crew.aero
  3816. design.aero
  3817. dgca.aero
  3818. educator.aero
  3819. emergency.aero
  3820. engine.aero
  3821. engineer.aero
  3822. entertainment.aero
  3823. equipment.aero
  3824. exchange.aero
  3825. express.aero
  3826. federation.aero
  3827. flight.aero
  3828. fuel.aero
  3829. gliding.aero
  3830. government.aero
  3831. groundhandling.aero
  3832. group.aero
  3833. hanggliding.aero
  3834. homebuilt.aero
  3835. insurance.aero
  3836. journal.aero
  3837. journalist.aero
  3838. leasing.aero
  3839. logistics.aero
  3840. magazine.aero
  3841. maintenance.aero
  3842. media.aero
  3843. microlight.aero
  3844. modelling.aero
  3845. navigation.aero
  3846. parachuting.aero
  3847. paragliding.aero
  3848. passenger-association.aero
  3849. pilot.aero
  3850. press.aero
  3851. production.aero
  3852. recreation.aero
  3853. repbody.aero
  3854. res.aero
  3855. research.aero
  3856. rotorcraft.aero
  3857. safety.aero
  3858. scientist.aero
  3859. services.aero
  3860. show.aero
  3861. skydiving.aero
  3862. software.aero
  3863. student.aero
  3864. trader.aero
  3865. trading.aero
  3866. trainer.aero
  3867. union.aero
  3868. workinggroup.aero
  3869. works.aero
  3870. // af : http://www.nic.af/help.jsp
  3871. af
  3872. gov.af
  3873. com.af
  3874. org.af
  3875. net.af
  3876. edu.af
  3877. // ag : http://www.nic.ag/prices.htm
  3878. ag
  3879. com.ag
  3880. org.ag
  3881. net.ag
  3882. co.ag
  3883. nom.ag
  3884. // ai : http://nic.com.ai/
  3885. ai
  3886. off.ai
  3887. com.ai
  3888. net.ai
  3889. org.ai
  3890. // al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31
  3891. al
  3892. com.al
  3893. edu.al
  3894. gov.al
  3895. mil.al
  3896. net.al
  3897. org.al
  3898. // am : https://www.amnic.net/policy/en/Policy_EN.pdf
  3899. am
  3900. co.am
  3901. com.am
  3902. commune.am
  3903. net.am
  3904. org.am
  3905. // ao : https://en.wikipedia.org/wiki/.ao
  3906. // http://www.dns.ao/REGISTR.DOC
  3907. ao
  3908. ed.ao
  3909. gv.ao
  3910. og.ao
  3911. co.ao
  3912. pb.ao
  3913. it.ao
  3914. // aq : https://en.wikipedia.org/wiki/.aq
  3915. aq
  3916. // ar : https://nic.ar/es/nic-argentina/normativa
  3917. ar
  3918. bet.ar
  3919. com.ar
  3920. coop.ar
  3921. edu.ar
  3922. gob.ar
  3923. gov.ar
  3924. int.ar
  3925. mil.ar
  3926. musica.ar
  3927. mutual.ar
  3928. net.ar
  3929. org.ar
  3930. senasa.ar
  3931. tur.ar
  3932. // arpa : https://en.wikipedia.org/wiki/.arpa
  3933. // Confirmed by registry <iana-questions@icann.org> 2008-06-18
  3934. arpa
  3935. e164.arpa
  3936. in-addr.arpa
  3937. ip6.arpa
  3938. iris.arpa
  3939. uri.arpa
  3940. urn.arpa
  3941. // as : https://en.wikipedia.org/wiki/.as
  3942. as
  3943. gov.as
  3944. // asia : https://en.wikipedia.org/wiki/.asia
  3945. asia
  3946. // at : https://en.wikipedia.org/wiki/.at
  3947. // Confirmed by registry <it@nic.at> 2008-06-17
  3948. at
  3949. ac.at
  3950. co.at
  3951. gv.at
  3952. or.at
  3953. sth.ac.at
  3954. // au : https://en.wikipedia.org/wiki/.au
  3955. // http://www.auda.org.au/
  3956. au
  3957. // 2LDs
  3958. com.au
  3959. net.au
  3960. org.au
  3961. edu.au
  3962. gov.au
  3963. asn.au
  3964. id.au
  3965. // Historic 2LDs (closed to new registration, but sites still exist)
  3966. info.au
  3967. conf.au
  3968. oz.au
  3969. // CGDNs - http://www.cgdn.org.au/
  3970. act.au
  3971. nsw.au
  3972. nt.au
  3973. qld.au
  3974. sa.au
  3975. tas.au
  3976. vic.au
  3977. wa.au
  3978. // 3LDs
  3979. act.edu.au
  3980. catholic.edu.au
  3981. // eq.edu.au - Removed at the request of the Queensland Department of Education
  3982. nsw.edu.au
  3983. nt.edu.au
  3984. qld.edu.au
  3985. sa.edu.au
  3986. tas.edu.au
  3987. vic.edu.au
  3988. wa.edu.au
  3989. // act.gov.au Bug 984824 - Removed at request of Greg Tankard
  3990. // nsw.gov.au Bug 547985 - Removed at request of <Shae.Donelan@services.nsw.gov.au>
  3991. // nt.gov.au Bug 940478 - Removed at request of Greg Connors <Greg.Connors@nt.gov.au>
  3992. qld.gov.au
  3993. sa.gov.au
  3994. tas.gov.au
  3995. vic.gov.au
  3996. wa.gov.au
  3997. // 4LDs
  3998. // education.tas.edu.au - Removed at the request of the Department of Education Tasmania
  3999. schools.nsw.edu.au
  4000. // aw : https://en.wikipedia.org/wiki/.aw
  4001. aw
  4002. com.aw
  4003. // ax : https://en.wikipedia.org/wiki/.ax
  4004. ax
  4005. // az : https://en.wikipedia.org/wiki/.az
  4006. az
  4007. com.az
  4008. net.az
  4009. int.az
  4010. gov.az
  4011. org.az
  4012. edu.az
  4013. info.az
  4014. pp.az
  4015. mil.az
  4016. name.az
  4017. pro.az
  4018. biz.az
  4019. // ba : http://nic.ba/users_data/files/pravilnik_o_registraciji.pdf
  4020. ba
  4021. com.ba
  4022. edu.ba
  4023. gov.ba
  4024. mil.ba
  4025. net.ba
  4026. org.ba
  4027. // bb : https://en.wikipedia.org/wiki/.bb
  4028. bb
  4029. biz.bb
  4030. co.bb
  4031. com.bb
  4032. edu.bb
  4033. gov.bb
  4034. info.bb
  4035. net.bb
  4036. org.bb
  4037. store.bb
  4038. tv.bb
  4039. // bd : https://en.wikipedia.org/wiki/.bd
  4040. *.bd
  4041. // be : https://en.wikipedia.org/wiki/.be
  4042. // Confirmed by registry <tech@dns.be> 2008-06-08
  4043. be
  4044. ac.be
  4045. // bf : https://en.wikipedia.org/wiki/.bf
  4046. bf
  4047. gov.bf
  4048. // bg : https://en.wikipedia.org/wiki/.bg
  4049. // https://www.register.bg/user/static/rules/en/index.html
  4050. bg
  4051. a.bg
  4052. b.bg
  4053. c.bg
  4054. d.bg
  4055. e.bg
  4056. f.bg
  4057. g.bg
  4058. h.bg
  4059. i.bg
  4060. j.bg
  4061. k.bg
  4062. l.bg
  4063. m.bg
  4064. n.bg
  4065. o.bg
  4066. p.bg
  4067. q.bg
  4068. r.bg
  4069. s.bg
  4070. t.bg
  4071. u.bg
  4072. v.bg
  4073. w.bg
  4074. x.bg
  4075. y.bg
  4076. z.bg
  4077. 0.bg
  4078. 1.bg
  4079. 2.bg
  4080. 3.bg
  4081. 4.bg
  4082. 5.bg
  4083. 6.bg
  4084. 7.bg
  4085. 8.bg
  4086. 9.bg
  4087. // bh : https://en.wikipedia.org/wiki/.bh
  4088. bh
  4089. com.bh
  4090. edu.bh
  4091. net.bh
  4092. org.bh
  4093. gov.bh
  4094. // bi : https://en.wikipedia.org/wiki/.bi
  4095. // http://whois.nic.bi/
  4096. bi
  4097. co.bi
  4098. com.bi
  4099. edu.bi
  4100. or.bi
  4101. org.bi
  4102. // biz : https://en.wikipedia.org/wiki/.biz
  4103. biz
  4104. // bj : https://nic.bj/bj-suffixes.txt
  4105. // submitted by registry <contact@nic.bj>
  4106. bj
  4107. africa.bj
  4108. agro.bj
  4109. architectes.bj
  4110. assur.bj
  4111. avocats.bj
  4112. co.bj
  4113. com.bj
  4114. eco.bj
  4115. econo.bj
  4116. edu.bj
  4117. info.bj
  4118. loisirs.bj
  4119. money.bj
  4120. net.bj
  4121. org.bj
  4122. ote.bj
  4123. resto.bj
  4124. restaurant.bj
  4125. tourism.bj
  4126. univ.bj
  4127. // bm : http://www.bermudanic.bm/dnr-text.txt
  4128. bm
  4129. com.bm
  4130. edu.bm
  4131. gov.bm
  4132. net.bm
  4133. org.bm
  4134. // bn : http://www.bnnic.bn/faqs
  4135. bn
  4136. com.bn
  4137. edu.bn
  4138. gov.bn
  4139. net.bn
  4140. org.bn
  4141. // bo : https://nic.bo/delegacion2015.php#h-1.10
  4142. bo
  4143. com.bo
  4144. edu.bo
  4145. gob.bo
  4146. int.bo
  4147. org.bo
  4148. net.bo
  4149. mil.bo
  4150. tv.bo
  4151. web.bo
  4152. // Social Domains
  4153. academia.bo
  4154. agro.bo
  4155. arte.bo
  4156. blog.bo
  4157. bolivia.bo
  4158. ciencia.bo
  4159. cooperativa.bo
  4160. democracia.bo
  4161. deporte.bo
  4162. ecologia.bo
  4163. economia.bo
  4164. empresa.bo
  4165. indigena.bo
  4166. industria.bo
  4167. info.bo
  4168. medicina.bo
  4169. movimiento.bo
  4170. musica.bo
  4171. natural.bo
  4172. nombre.bo
  4173. noticias.bo
  4174. patria.bo
  4175. politica.bo
  4176. profesional.bo
  4177. plurinacional.bo
  4178. pueblo.bo
  4179. revista.bo
  4180. salud.bo
  4181. tecnologia.bo
  4182. tksat.bo
  4183. transporte.bo
  4184. wiki.bo
  4185. // br : http://registro.br/dominio/categoria.html
  4186. // Submitted by registry <fneves@registro.br>
  4187. br
  4188. 9guacu.br
  4189. abc.br
  4190. adm.br
  4191. adv.br
  4192. agr.br
  4193. aju.br
  4194. am.br
  4195. anani.br
  4196. aparecida.br
  4197. app.br
  4198. arq.br
  4199. art.br
  4200. ato.br
  4201. b.br
  4202. barueri.br
  4203. belem.br
  4204. bhz.br
  4205. bib.br
  4206. bio.br
  4207. blog.br
  4208. bmd.br
  4209. boavista.br
  4210. bsb.br
  4211. campinagrande.br
  4212. campinas.br
  4213. caxias.br
  4214. cim.br
  4215. cng.br
  4216. cnt.br
  4217. com.br
  4218. contagem.br
  4219. coop.br
  4220. coz.br
  4221. cri.br
  4222. cuiaba.br
  4223. curitiba.br
  4224. def.br
  4225. des.br
  4226. det.br
  4227. dev.br
  4228. ecn.br
  4229. eco.br
  4230. edu.br
  4231. emp.br
  4232. enf.br
  4233. eng.br
  4234. esp.br
  4235. etc.br
  4236. eti.br
  4237. far.br
  4238. feira.br
  4239. flog.br
  4240. floripa.br
  4241. fm.br
  4242. fnd.br
  4243. fortal.br
  4244. fot.br
  4245. foz.br
  4246. fst.br
  4247. g12.br
  4248. geo.br
  4249. ggf.br
  4250. goiania.br
  4251. gov.br
  4252. // gov.br 26 states + df https://en.wikipedia.org/wiki/States_of_Brazil
  4253. ac.gov.br
  4254. al.gov.br
  4255. am.gov.br
  4256. ap.gov.br
  4257. ba.gov.br
  4258. ce.gov.br
  4259. df.gov.br
  4260. es.gov.br
  4261. go.gov.br
  4262. ma.gov.br
  4263. mg.gov.br
  4264. ms.gov.br
  4265. mt.gov.br
  4266. pa.gov.br
  4267. pb.gov.br
  4268. pe.gov.br
  4269. pi.gov.br
  4270. pr.gov.br
  4271. rj.gov.br
  4272. rn.gov.br
  4273. ro.gov.br
  4274. rr.gov.br
  4275. rs.gov.br
  4276. sc.gov.br
  4277. se.gov.br
  4278. sp.gov.br
  4279. to.gov.br
  4280. gru.br
  4281. imb.br
  4282. ind.br
  4283. inf.br
  4284. jab.br
  4285. jampa.br
  4286. jdf.br
  4287. joinville.br
  4288. jor.br
  4289. jus.br
  4290. leg.br
  4291. lel.br
  4292. log.br
  4293. londrina.br
  4294. macapa.br
  4295. maceio.br
  4296. manaus.br
  4297. maringa.br
  4298. mat.br
  4299. med.br
  4300. mil.br
  4301. morena.br
  4302. mp.br
  4303. mus.br
  4304. natal.br
  4305. net.br
  4306. niteroi.br
  4307. *.nom.br
  4308. not.br
  4309. ntr.br
  4310. odo.br
  4311. ong.br
  4312. org.br
  4313. osasco.br
  4314. palmas.br
  4315. poa.br
  4316. ppg.br
  4317. pro.br
  4318. psc.br
  4319. psi.br
  4320. pvh.br
  4321. qsl.br
  4322. radio.br
  4323. rec.br
  4324. recife.br
  4325. rep.br
  4326. ribeirao.br
  4327. rio.br
  4328. riobranco.br
  4329. riopreto.br
  4330. salvador.br
  4331. sampa.br
  4332. santamaria.br
  4333. santoandre.br
  4334. saobernardo.br
  4335. saogonca.br
  4336. seg.br
  4337. sjc.br
  4338. slg.br
  4339. slz.br
  4340. sorocaba.br
  4341. srv.br
  4342. taxi.br
  4343. tc.br
  4344. tec.br
  4345. teo.br
  4346. the.br
  4347. tmp.br
  4348. trd.br
  4349. tur.br
  4350. tv.br
  4351. udi.br
  4352. vet.br
  4353. vix.br
  4354. vlog.br
  4355. wiki.br
  4356. zlg.br
  4357. // bs : http://www.nic.bs/rules.html
  4358. bs
  4359. com.bs
  4360. net.bs
  4361. org.bs
  4362. edu.bs
  4363. gov.bs
  4364. // bt : https://en.wikipedia.org/wiki/.bt
  4365. bt
  4366. com.bt
  4367. edu.bt
  4368. gov.bt
  4369. net.bt
  4370. org.bt
  4371. // bv : No registrations at this time.
  4372. // Submitted by registry <jarle@uninett.no>
  4373. bv
  4374. // bw : https://en.wikipedia.org/wiki/.bw
  4375. // http://www.gobin.info/domainname/bw.doc
  4376. // list of other 2nd level tlds ?
  4377. bw
  4378. co.bw
  4379. org.bw
  4380. // by : https://en.wikipedia.org/wiki/.by
  4381. // http://tld.by/rules_2006_en.html
  4382. // list of other 2nd level tlds ?
  4383. by
  4384. gov.by
  4385. mil.by
  4386. // Official information does not indicate that com.by is a reserved
  4387. // second-level domain, but it's being used as one (see www.google.com.by and
  4388. // www.yahoo.com.by, for example), so we list it here for safety's sake.
  4389. com.by
  4390. // http://hoster.by/
  4391. of.by
  4392. // bz : https://en.wikipedia.org/wiki/.bz
  4393. // http://www.belizenic.bz/
  4394. bz
  4395. com.bz
  4396. net.bz
  4397. org.bz
  4398. edu.bz
  4399. gov.bz
  4400. // ca : https://en.wikipedia.org/wiki/.ca
  4401. ca
  4402. // ca geographical names
  4403. ab.ca
  4404. bc.ca
  4405. mb.ca
  4406. nb.ca
  4407. nf.ca
  4408. nl.ca
  4409. ns.ca
  4410. nt.ca
  4411. nu.ca
  4412. on.ca
  4413. pe.ca
  4414. qc.ca
  4415. sk.ca
  4416. yk.ca
  4417. // gc.ca: https://en.wikipedia.org/wiki/.gc.ca
  4418. // see also: http://registry.gc.ca/en/SubdomainFAQ
  4419. gc.ca
  4420. // cat : https://en.wikipedia.org/wiki/.cat
  4421. cat
  4422. // cc : https://en.wikipedia.org/wiki/.cc
  4423. cc
  4424. // cd : https://en.wikipedia.org/wiki/.cd
  4425. // see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1
  4426. cd
  4427. gov.cd
  4428. // cf : https://en.wikipedia.org/wiki/.cf
  4429. cf
  4430. // cg : https://en.wikipedia.org/wiki/.cg
  4431. cg
  4432. // ch : https://en.wikipedia.org/wiki/.ch
  4433. ch
  4434. // ci : https://en.wikipedia.org/wiki/.ci
  4435. // http://www.nic.ci/index.php?page=charte
  4436. ci
  4437. org.ci
  4438. or.ci
  4439. com.ci
  4440. co.ci
  4441. edu.ci
  4442. ed.ci
  4443. ac.ci
  4444. net.ci
  4445. go.ci
  4446. asso.ci
  4447. aéroport.ci
  4448. int.ci
  4449. presse.ci
  4450. md.ci
  4451. gouv.ci
  4452. // ck : https://en.wikipedia.org/wiki/.ck
  4453. *.ck
  4454. !www.ck
  4455. // cl : https://www.nic.cl
  4456. // Confirmed by .CL registry <hsalgado@nic.cl>
  4457. cl
  4458. co.cl
  4459. gob.cl
  4460. gov.cl
  4461. mil.cl
  4462. // cm : https://en.wikipedia.org/wiki/.cm plus bug 981927
  4463. cm
  4464. co.cm
  4465. com.cm
  4466. gov.cm
  4467. net.cm
  4468. // cn : https://en.wikipedia.org/wiki/.cn
  4469. // Submitted by registry <tanyaling@cnnic.cn>
  4470. cn
  4471. ac.cn
  4472. com.cn
  4473. edu.cn
  4474. gov.cn
  4475. net.cn
  4476. org.cn
  4477. mil.cn
  4478. 公司.cn
  4479. 网络.cn
  4480. 網絡.cn
  4481. // cn geographic names
  4482. ah.cn
  4483. bj.cn
  4484. cq.cn
  4485. fj.cn
  4486. gd.cn
  4487. gs.cn
  4488. gz.cn
  4489. gx.cn
  4490. ha.cn
  4491. hb.cn
  4492. he.cn
  4493. hi.cn
  4494. hl.cn
  4495. hn.cn
  4496. jl.cn
  4497. js.cn
  4498. jx.cn
  4499. ln.cn
  4500. nm.cn
  4501. nx.cn
  4502. qh.cn
  4503. sc.cn
  4504. sd.cn
  4505. sh.cn
  4506. sn.cn
  4507. sx.cn
  4508. tj.cn
  4509. xj.cn
  4510. xz.cn
  4511. yn.cn
  4512. zj.cn
  4513. hk.cn
  4514. mo.cn
  4515. tw.cn
  4516. // co : https://en.wikipedia.org/wiki/.co
  4517. // Submitted by registry <tecnico@uniandes.edu.co>
  4518. co
  4519. arts.co
  4520. com.co
  4521. edu.co
  4522. firm.co
  4523. gov.co
  4524. info.co
  4525. int.co
  4526. mil.co
  4527. net.co
  4528. nom.co
  4529. org.co
  4530. rec.co
  4531. web.co
  4532. // com : https://en.wikipedia.org/wiki/.com
  4533. com
  4534. // coop : https://en.wikipedia.org/wiki/.coop
  4535. coop
  4536. // cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do
  4537. cr
  4538. ac.cr
  4539. co.cr
  4540. ed.cr
  4541. fi.cr
  4542. go.cr
  4543. or.cr
  4544. sa.cr
  4545. // cu : https://en.wikipedia.org/wiki/.cu
  4546. cu
  4547. com.cu
  4548. edu.cu
  4549. org.cu
  4550. net.cu
  4551. gov.cu
  4552. inf.cu
  4553. // cv : https://en.wikipedia.org/wiki/.cv
  4554. // cv : http://www.dns.cv/tldcv_portal/do?com=DS;5446457100;111;+PAGE(4000018)+K-CAT-CODIGO(RDOM)+RCNT(100); <- registration rules
  4555. cv
  4556. com.cv
  4557. edu.cv
  4558. int.cv
  4559. nome.cv
  4560. org.cv
  4561. // cw : http://www.una.cw/cw_registry/
  4562. // Confirmed by registry <registry@una.net> 2013-03-26
  4563. cw
  4564. com.cw
  4565. edu.cw
  4566. net.cw
  4567. org.cw
  4568. // cx : https://en.wikipedia.org/wiki/.cx
  4569. // list of other 2nd level tlds ?
  4570. cx
  4571. gov.cx
  4572. // cy : http://www.nic.cy/
  4573. // Submitted by registry Panayiotou Fotia <cydns@ucy.ac.cy>
  4574. // namespace policies URL https://www.nic.cy/portal//sites/default/files/symfonia_gia_eggrafi.pdf
  4575. cy
  4576. ac.cy
  4577. biz.cy
  4578. com.cy
  4579. ekloges.cy
  4580. gov.cy
  4581. ltd.cy
  4582. mil.cy
  4583. net.cy
  4584. org.cy
  4585. press.cy
  4586. pro.cy
  4587. tm.cy
  4588. // cz : https://en.wikipedia.org/wiki/.cz
  4589. cz
  4590. // de : https://en.wikipedia.org/wiki/.de
  4591. // Confirmed by registry <ops@denic.de> (with technical
  4592. // reservations) 2008-07-01
  4593. de
  4594. // dj : https://en.wikipedia.org/wiki/.dj
  4595. dj
  4596. // dk : https://en.wikipedia.org/wiki/.dk
  4597. // Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17
  4598. dk
  4599. // dm : https://en.wikipedia.org/wiki/.dm
  4600. dm
  4601. com.dm
  4602. net.dm
  4603. org.dm
  4604. edu.dm
  4605. gov.dm
  4606. // do : https://en.wikipedia.org/wiki/.do
  4607. do
  4608. art.do
  4609. com.do
  4610. edu.do
  4611. gob.do
  4612. gov.do
  4613. mil.do
  4614. net.do
  4615. org.do
  4616. sld.do
  4617. web.do
  4618. // dz : http://www.nic.dz/images/pdf_nic/charte.pdf
  4619. dz
  4620. art.dz
  4621. asso.dz
  4622. com.dz
  4623. edu.dz
  4624. gov.dz
  4625. org.dz
  4626. net.dz
  4627. pol.dz
  4628. soc.dz
  4629. tm.dz
  4630. // ec : http://www.nic.ec/reg/paso1.asp
  4631. // Submitted by registry <vabboud@nic.ec>
  4632. ec
  4633. com.ec
  4634. info.ec
  4635. net.ec
  4636. fin.ec
  4637. k12.ec
  4638. med.ec
  4639. pro.ec
  4640. org.ec
  4641. edu.ec
  4642. gov.ec
  4643. gob.ec
  4644. mil.ec
  4645. // edu : https://en.wikipedia.org/wiki/.edu
  4646. edu
  4647. // ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B
  4648. ee
  4649. edu.ee
  4650. gov.ee
  4651. riik.ee
  4652. lib.ee
  4653. med.ee
  4654. com.ee
  4655. pri.ee
  4656. aip.ee
  4657. org.ee
  4658. fie.ee
  4659. // eg : https://en.wikipedia.org/wiki/.eg
  4660. eg
  4661. com.eg
  4662. edu.eg
  4663. eun.eg
  4664. gov.eg
  4665. mil.eg
  4666. name.eg
  4667. net.eg
  4668. org.eg
  4669. sci.eg
  4670. // er : https://en.wikipedia.org/wiki/.er
  4671. *.er
  4672. // es : https://www.nic.es/site_ingles/ingles/dominios/index.html
  4673. es
  4674. com.es
  4675. nom.es
  4676. org.es
  4677. gob.es
  4678. edu.es
  4679. // et : https://en.wikipedia.org/wiki/.et
  4680. et
  4681. com.et
  4682. gov.et
  4683. org.et
  4684. edu.et
  4685. biz.et
  4686. name.et
  4687. info.et
  4688. net.et
  4689. // eu : https://en.wikipedia.org/wiki/.eu
  4690. eu
  4691. // fi : https://en.wikipedia.org/wiki/.fi
  4692. fi
  4693. // aland.fi : https://en.wikipedia.org/wiki/.ax
  4694. // This domain is being phased out in favor of .ax. As there are still many
  4695. // domains under aland.fi, we still keep it on the list until aland.fi is
  4696. // completely removed.
  4697. // TODO: Check for updates (expected to be phased out around Q1/2009)
  4698. aland.fi
  4699. // fj : http://domains.fj/
  4700. // Submitted by registry <garth.miller@cocca.org.nz> 2020-02-11
  4701. fj
  4702. ac.fj
  4703. biz.fj
  4704. com.fj
  4705. gov.fj
  4706. info.fj
  4707. mil.fj
  4708. name.fj
  4709. net.fj
  4710. org.fj
  4711. pro.fj
  4712. // fk : https://en.wikipedia.org/wiki/.fk
  4713. *.fk
  4714. // fm : https://en.wikipedia.org/wiki/.fm
  4715. com.fm
  4716. edu.fm
  4717. net.fm
  4718. org.fm
  4719. fm
  4720. // fo : https://en.wikipedia.org/wiki/.fo
  4721. fo
  4722. // fr : https://www.afnic.fr/ https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf
  4723. fr
  4724. asso.fr
  4725. com.fr
  4726. gouv.fr
  4727. nom.fr
  4728. prd.fr
  4729. tm.fr
  4730. // Other SLDs now selfmanaged out of AFNIC range. Former "domaines sectoriels", still registration suffixes
  4731. avoues.fr
  4732. cci.fr
  4733. greta.fr
  4734. huissier-justice.fr
  4735. // ga : https://en.wikipedia.org/wiki/.ga
  4736. ga
  4737. // gb : This registry is effectively dormant
  4738. // Submitted by registry <Damien.Shaw@ja.net>
  4739. gb
  4740. // gd : https://en.wikipedia.org/wiki/.gd
  4741. edu.gd
  4742. gov.gd
  4743. gd
  4744. // ge : http://www.nic.net.ge/policy_en.pdf
  4745. ge
  4746. com.ge
  4747. edu.ge
  4748. gov.ge
  4749. org.ge
  4750. mil.ge
  4751. net.ge
  4752. pvt.ge
  4753. // gf : https://en.wikipedia.org/wiki/.gf
  4754. gf
  4755. // gg : http://www.channelisles.net/register-domains/
  4756. // Confirmed by registry <nigel@channelisles.net> 2013-11-28
  4757. gg
  4758. co.gg
  4759. net.gg
  4760. org.gg
  4761. // gh : https://en.wikipedia.org/wiki/.gh
  4762. // see also: http://www.nic.gh/reg_now.php
  4763. // Although domains directly at second level are not possible at the moment,
  4764. // they have been possible for some time and may come back.
  4765. gh
  4766. com.gh
  4767. edu.gh
  4768. gov.gh
  4769. org.gh
  4770. mil.gh
  4771. // gi : http://www.nic.gi/rules.html
  4772. gi
  4773. com.gi
  4774. ltd.gi
  4775. gov.gi
  4776. mod.gi
  4777. edu.gi
  4778. org.gi
  4779. // gl : https://en.wikipedia.org/wiki/.gl
  4780. // http://nic.gl
  4781. gl
  4782. co.gl
  4783. com.gl
  4784. edu.gl
  4785. net.gl
  4786. org.gl
  4787. // gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm
  4788. gm
  4789. // gn : http://psg.com/dns/gn/gn.txt
  4790. // Submitted by registry <randy@psg.com>
  4791. gn
  4792. ac.gn
  4793. com.gn
  4794. edu.gn
  4795. gov.gn
  4796. org.gn
  4797. net.gn
  4798. // gov : https://en.wikipedia.org/wiki/.gov
  4799. gov
  4800. // gp : http://www.nic.gp/index.php?lang=en
  4801. gp
  4802. com.gp
  4803. net.gp
  4804. mobi.gp
  4805. edu.gp
  4806. org.gp
  4807. asso.gp
  4808. // gq : https://en.wikipedia.org/wiki/.gq
  4809. gq
  4810. // gr : https://grweb.ics.forth.gr/english/1617-B-2005.html
  4811. // Submitted by registry <segred@ics.forth.gr>
  4812. gr
  4813. com.gr
  4814. edu.gr
  4815. net.gr
  4816. org.gr
  4817. gov.gr
  4818. // gs : https://en.wikipedia.org/wiki/.gs
  4819. gs
  4820. // gt : https://www.gt/sitio/registration_policy.php?lang=en
  4821. gt
  4822. com.gt
  4823. edu.gt
  4824. gob.gt
  4825. ind.gt
  4826. mil.gt
  4827. net.gt
  4828. org.gt
  4829. // gu : http://gadao.gov.gu/register.html
  4830. // University of Guam : https://www.uog.edu
  4831. // Submitted by uognoc@triton.uog.edu
  4832. gu
  4833. com.gu
  4834. edu.gu
  4835. gov.gu
  4836. guam.gu
  4837. info.gu
  4838. net.gu
  4839. org.gu
  4840. web.gu
  4841. // gw : https://en.wikipedia.org/wiki/.gw
  4842. // gw : https://nic.gw/regras/
  4843. gw
  4844. // gy : https://en.wikipedia.org/wiki/.gy
  4845. // http://registry.gy/
  4846. gy
  4847. co.gy
  4848. com.gy
  4849. edu.gy
  4850. gov.gy
  4851. net.gy
  4852. org.gy
  4853. // hk : https://www.hkirc.hk
  4854. // Submitted by registry <hk.tech@hkirc.hk>
  4855. hk
  4856. com.hk
  4857. edu.hk
  4858. gov.hk
  4859. idv.hk
  4860. net.hk
  4861. org.hk
  4862. 公司.hk
  4863. 教育.hk
  4864. 敎育.hk
  4865. 政府.hk
  4866. 個人.hk
  4867. 个人.hk
  4868. 箇人.hk
  4869. 網络.hk
  4870. 网络.hk
  4871. 组織.hk
  4872. 網絡.hk
  4873. 网絡.hk
  4874. 组织.hk
  4875. 組織.hk
  4876. 組织.hk
  4877. // hm : https://en.wikipedia.org/wiki/.hm
  4878. hm
  4879. // hn : http://www.nic.hn/politicas/ps02,,05.html
  4880. hn
  4881. com.hn
  4882. edu.hn
  4883. org.hn
  4884. net.hn
  4885. mil.hn
  4886. gob.hn
  4887. // hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf
  4888. hr
  4889. iz.hr
  4890. from.hr
  4891. name.hr
  4892. com.hr
  4893. // ht : http://www.nic.ht/info/charte.cfm
  4894. ht
  4895. com.ht
  4896. shop.ht
  4897. firm.ht
  4898. info.ht
  4899. adult.ht
  4900. net.ht
  4901. pro.ht
  4902. org.ht
  4903. med.ht
  4904. art.ht
  4905. coop.ht
  4906. pol.ht
  4907. asso.ht
  4908. edu.ht
  4909. rel.ht
  4910. gouv.ht
  4911. perso.ht
  4912. // hu : http://www.domain.hu/domain/English/sld.html
  4913. // Confirmed by registry <pasztor@iszt.hu> 2008-06-12
  4914. hu
  4915. co.hu
  4916. info.hu
  4917. org.hu
  4918. priv.hu
  4919. sport.hu
  4920. tm.hu
  4921. 2000.hu
  4922. agrar.hu
  4923. bolt.hu
  4924. casino.hu
  4925. city.hu
  4926. erotica.hu
  4927. erotika.hu
  4928. film.hu
  4929. forum.hu
  4930. games.hu
  4931. hotel.hu
  4932. ingatlan.hu
  4933. jogasz.hu
  4934. konyvelo.hu
  4935. lakas.hu
  4936. media.hu
  4937. news.hu
  4938. reklam.hu
  4939. sex.hu
  4940. shop.hu
  4941. suli.hu
  4942. szex.hu
  4943. tozsde.hu
  4944. utazas.hu
  4945. video.hu
  4946. // id : https://pandi.id/en/domain/registration-requirements/
  4947. id
  4948. ac.id
  4949. biz.id
  4950. co.id
  4951. desa.id
  4952. go.id
  4953. mil.id
  4954. my.id
  4955. net.id
  4956. or.id
  4957. ponpes.id
  4958. sch.id
  4959. web.id
  4960. // ie : https://en.wikipedia.org/wiki/.ie
  4961. ie
  4962. gov.ie
  4963. // il : http://www.isoc.org.il/domains/
  4964. // see also: https://en.isoc.org.il/il-cctld/registration-rules
  4965. // ISOC-IL (operated by .il Registry)
  4966. il
  4967. ac.il
  4968. co.il
  4969. gov.il
  4970. idf.il
  4971. k12.il
  4972. muni.il
  4973. net.il
  4974. org.il
  4975. // xn--4dbrk0ce ("Israel", Hebrew) : IL
  4976. ישראל
  4977. // xn--4dbgdty6c.xn--4dbrk0ce.
  4978. אקדמיה.ישראל
  4979. // xn--5dbhl8d.xn--4dbrk0ce.
  4980. ישוב.ישראל
  4981. // xn--8dbq2a.xn--4dbrk0ce.
  4982. צהל.ישראל
  4983. // xn--hebda8b.xn--4dbrk0ce.
  4984. ממשל.ישראל
  4985. // im : https://www.nic.im/
  4986. // Submitted by registry <info@nic.im>
  4987. im
  4988. ac.im
  4989. co.im
  4990. com.im
  4991. ltd.co.im
  4992. net.im
  4993. org.im
  4994. plc.co.im
  4995. tt.im
  4996. tv.im
  4997. // in : https://en.wikipedia.org/wiki/.in
  4998. // see also: https://registry.in/policies
  4999. // Please note, that nic.in is not an official eTLD, but used by most
  5000. // government institutions.
  5001. in
  5002. 5g.in
  5003. 6g.in
  5004. ac.in
  5005. ai.in
  5006. am.in
  5007. bihar.in
  5008. biz.in
  5009. business.in
  5010. ca.in
  5011. cn.in
  5012. co.in
  5013. com.in
  5014. coop.in
  5015. cs.in
  5016. delhi.in
  5017. dr.in
  5018. edu.in
  5019. er.in
  5020. firm.in
  5021. gen.in
  5022. gov.in
  5023. gujarat.in
  5024. ind.in
  5025. info.in
  5026. int.in
  5027. internet.in
  5028. io.in
  5029. me.in
  5030. mil.in
  5031. net.in
  5032. nic.in
  5033. org.in
  5034. pg.in
  5035. post.in
  5036. pro.in
  5037. res.in
  5038. travel.in
  5039. tv.in
  5040. uk.in
  5041. up.in
  5042. us.in
  5043. // info : https://en.wikipedia.org/wiki/.info
  5044. info
  5045. // int : https://en.wikipedia.org/wiki/.int
  5046. // Confirmed by registry <iana-questions@icann.org> 2008-06-18
  5047. int
  5048. eu.int
  5049. // io : http://www.nic.io/rules.htm
  5050. // list of other 2nd level tlds ?
  5051. io
  5052. com.io
  5053. // iq : http://www.cmc.iq/english/iq/iqregister1.htm
  5054. iq
  5055. gov.iq
  5056. edu.iq
  5057. mil.iq
  5058. com.iq
  5059. org.iq
  5060. net.iq
  5061. // ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules
  5062. // Also see http://www.nic.ir/Internationalized_Domain_Names
  5063. // Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16
  5064. ir
  5065. ac.ir
  5066. co.ir
  5067. gov.ir
  5068. id.ir
  5069. net.ir
  5070. org.ir
  5071. sch.ir
  5072. // xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH)
  5073. ایران.ir
  5074. // xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH)
  5075. ايران.ir
  5076. // is : http://www.isnic.is/domain/rules.php
  5077. // Confirmed by registry <marius@isgate.is> 2008-12-06
  5078. is
  5079. net.is
  5080. com.is
  5081. edu.is
  5082. gov.is
  5083. org.is
  5084. int.is
  5085. // it : https://en.wikipedia.org/wiki/.it
  5086. it
  5087. gov.it
  5088. edu.it
  5089. // Reserved geo-names (regions and provinces):
  5090. // https://www.nic.it/sites/default/files/archivio/docs/Regulation_assignation_v7.1.pdf
  5091. // Regions
  5092. abr.it
  5093. abruzzo.it
  5094. aosta-valley.it
  5095. aostavalley.it
  5096. bas.it
  5097. basilicata.it
  5098. cal.it
  5099. calabria.it
  5100. cam.it
  5101. campania.it
  5102. emilia-romagna.it
  5103. emiliaromagna.it
  5104. emr.it
  5105. friuli-v-giulia.it
  5106. friuli-ve-giulia.it
  5107. friuli-vegiulia.it
  5108. friuli-venezia-giulia.it
  5109. friuli-veneziagiulia.it
  5110. friuli-vgiulia.it
  5111. friuliv-giulia.it
  5112. friulive-giulia.it
  5113. friulivegiulia.it
  5114. friulivenezia-giulia.it
  5115. friuliveneziagiulia.it
  5116. friulivgiulia.it
  5117. fvg.it
  5118. laz.it
  5119. lazio.it
  5120. lig.it
  5121. liguria.it
  5122. lom.it
  5123. lombardia.it
  5124. lombardy.it
  5125. lucania.it
  5126. mar.it
  5127. marche.it
  5128. mol.it
  5129. molise.it
  5130. piedmont.it
  5131. piemonte.it
  5132. pmn.it
  5133. pug.it
  5134. puglia.it
  5135. sar.it
  5136. sardegna.it
  5137. sardinia.it
  5138. sic.it
  5139. sicilia.it
  5140. sicily.it
  5141. taa.it
  5142. tos.it
  5143. toscana.it
  5144. trentin-sud-tirol.it
  5145. trentin-süd-tirol.it
  5146. trentin-sudtirol.it
  5147. trentin-südtirol.it
  5148. trentin-sued-tirol.it
  5149. trentin-suedtirol.it
  5150. trentino-a-adige.it
  5151. trentino-aadige.it
  5152. trentino-alto-adige.it
  5153. trentino-altoadige.it
  5154. trentino-s-tirol.it
  5155. trentino-stirol.it
  5156. trentino-sud-tirol.it
  5157. trentino-süd-tirol.it
  5158. trentino-sudtirol.it
  5159. trentino-südtirol.it
  5160. trentino-sued-tirol.it
  5161. trentino-suedtirol.it
  5162. trentino.it
  5163. trentinoa-adige.it
  5164. trentinoaadige.it
  5165. trentinoalto-adige.it
  5166. trentinoaltoadige.it
  5167. trentinos-tirol.it
  5168. trentinostirol.it
  5169. trentinosud-tirol.it
  5170. trentinosüd-tirol.it
  5171. trentinosudtirol.it
  5172. trentinosüdtirol.it
  5173. trentinosued-tirol.it
  5174. trentinosuedtirol.it
  5175. trentinsud-tirol.it
  5176. trentinsüd-tirol.it
  5177. trentinsudtirol.it
  5178. trentinsüdtirol.it
  5179. trentinsued-tirol.it
  5180. trentinsuedtirol.it
  5181. tuscany.it
  5182. umb.it
  5183. umbria.it
  5184. val-d-aosta.it
  5185. val-daosta.it
  5186. vald-aosta.it
  5187. valdaosta.it
  5188. valle-aosta.it
  5189. valle-d-aosta.it
  5190. valle-daosta.it
  5191. valleaosta.it
  5192. valled-aosta.it
  5193. valledaosta.it
  5194. vallee-aoste.it
  5195. vallée-aoste.it
  5196. vallee-d-aoste.it
  5197. vallée-d-aoste.it
  5198. valleeaoste.it
  5199. valléeaoste.it
  5200. valleedaoste.it
  5201. valléedaoste.it
  5202. vao.it
  5203. vda.it
  5204. ven.it
  5205. veneto.it
  5206. // Provinces
  5207. ag.it
  5208. agrigento.it
  5209. al.it
  5210. alessandria.it
  5211. alto-adige.it
  5212. altoadige.it
  5213. an.it
  5214. ancona.it
  5215. andria-barletta-trani.it
  5216. andria-trani-barletta.it
  5217. andriabarlettatrani.it
  5218. andriatranibarletta.it
  5219. ao.it
  5220. aosta.it
  5221. aoste.it
  5222. ap.it
  5223. aq.it
  5224. aquila.it
  5225. ar.it
  5226. arezzo.it
  5227. ascoli-piceno.it
  5228. ascolipiceno.it
  5229. asti.it
  5230. at.it
  5231. av.it
  5232. avellino.it
  5233. ba.it
  5234. balsan-sudtirol.it
  5235. balsan-südtirol.it
  5236. balsan-suedtirol.it
  5237. balsan.it
  5238. bari.it
  5239. barletta-trani-andria.it
  5240. barlettatraniandria.it
  5241. belluno.it
  5242. benevento.it
  5243. bergamo.it
  5244. bg.it
  5245. bi.it
  5246. biella.it
  5247. bl.it
  5248. bn.it
  5249. bo.it
  5250. bologna.it
  5251. bolzano-altoadige.it
  5252. bolzano.it
  5253. bozen-sudtirol.it
  5254. bozen-südtirol.it
  5255. bozen-suedtirol.it
  5256. bozen.it
  5257. br.it
  5258. brescia.it
  5259. brindisi.it
  5260. bs.it
  5261. bt.it
  5262. bulsan-sudtirol.it
  5263. bulsan-südtirol.it
  5264. bulsan-suedtirol.it
  5265. bulsan.it
  5266. bz.it
  5267. ca.it
  5268. cagliari.it
  5269. caltanissetta.it
  5270. campidano-medio.it
  5271. campidanomedio.it
  5272. campobasso.it
  5273. carbonia-iglesias.it
  5274. carboniaiglesias.it
  5275. carrara-massa.it
  5276. carraramassa.it
  5277. caserta.it
  5278. catania.it
  5279. catanzaro.it
  5280. cb.it
  5281. ce.it
  5282. cesena-forli.it
  5283. cesena-forlì.it
  5284. cesenaforli.it
  5285. cesenaforlì.it
  5286. ch.it
  5287. chieti.it
  5288. ci.it
  5289. cl.it
  5290. cn.it
  5291. co.it
  5292. como.it
  5293. cosenza.it
  5294. cr.it
  5295. cremona.it
  5296. crotone.it
  5297. cs.it
  5298. ct.it
  5299. cuneo.it
  5300. cz.it
  5301. dell-ogliastra.it
  5302. dellogliastra.it
  5303. en.it
  5304. enna.it
  5305. fc.it
  5306. fe.it
  5307. fermo.it
  5308. ferrara.it
  5309. fg.it
  5310. fi.it
  5311. firenze.it
  5312. florence.it
  5313. fm.it
  5314. foggia.it
  5315. forli-cesena.it
  5316. forlì-cesena.it
  5317. forlicesena.it
  5318. forlìcesena.it
  5319. fr.it
  5320. frosinone.it
  5321. ge.it
  5322. genoa.it
  5323. genova.it
  5324. go.it
  5325. gorizia.it
  5326. gr.it
  5327. grosseto.it
  5328. iglesias-carbonia.it
  5329. iglesiascarbonia.it
  5330. im.it
  5331. imperia.it
  5332. is.it
  5333. isernia.it
  5334. kr.it
  5335. la-spezia.it
  5336. laquila.it
  5337. laspezia.it
  5338. latina.it
  5339. lc.it
  5340. le.it
  5341. lecce.it
  5342. lecco.it
  5343. li.it
  5344. livorno.it
  5345. lo.it
  5346. lodi.it
  5347. lt.it
  5348. lu.it
  5349. lucca.it
  5350. macerata.it
  5351. mantova.it
  5352. massa-carrara.it
  5353. massacarrara.it
  5354. matera.it
  5355. mb.it
  5356. mc.it
  5357. me.it
  5358. medio-campidano.it
  5359. mediocampidano.it
  5360. messina.it
  5361. mi.it
  5362. milan.it
  5363. milano.it
  5364. mn.it
  5365. mo.it
  5366. modena.it
  5367. monza-brianza.it
  5368. monza-e-della-brianza.it
  5369. monza.it
  5370. monzabrianza.it
  5371. monzaebrianza.it
  5372. monzaedellabrianza.it
  5373. ms.it
  5374. mt.it
  5375. na.it
  5376. naples.it
  5377. napoli.it
  5378. no.it
  5379. novara.it
  5380. nu.it
  5381. nuoro.it
  5382. og.it
  5383. ogliastra.it
  5384. olbia-tempio.it
  5385. olbiatempio.it
  5386. or.it
  5387. oristano.it
  5388. ot.it
  5389. pa.it
  5390. padova.it
  5391. padua.it
  5392. palermo.it
  5393. parma.it
  5394. pavia.it
  5395. pc.it
  5396. pd.it
  5397. pe.it
  5398. perugia.it
  5399. pesaro-urbino.it
  5400. pesarourbino.it
  5401. pescara.it
  5402. pg.it
  5403. pi.it
  5404. piacenza.it
  5405. pisa.it
  5406. pistoia.it
  5407. pn.it
  5408. po.it
  5409. pordenone.it
  5410. potenza.it
  5411. pr.it
  5412. prato.it
  5413. pt.it
  5414. pu.it
  5415. pv.it
  5416. pz.it
  5417. ra.it
  5418. ragusa.it
  5419. ravenna.it
  5420. rc.it
  5421. re.it
  5422. reggio-calabria.it
  5423. reggio-emilia.it
  5424. reggiocalabria.it
  5425. reggioemilia.it
  5426. rg.it
  5427. ri.it
  5428. rieti.it
  5429. rimini.it
  5430. rm.it
  5431. rn.it
  5432. ro.it
  5433. roma.it
  5434. rome.it
  5435. rovigo.it
  5436. sa.it
  5437. salerno.it
  5438. sassari.it
  5439. savona.it
  5440. si.it
  5441. siena.it
  5442. siracusa.it
  5443. so.it
  5444. sondrio.it
  5445. sp.it
  5446. sr.it
  5447. ss.it
  5448. suedtirol.it
  5449. südtirol.it
  5450. sv.it
  5451. ta.it
  5452. taranto.it
  5453. te.it
  5454. tempio-olbia.it
  5455. tempioolbia.it
  5456. teramo.it
  5457. terni.it
  5458. tn.it
  5459. to.it
  5460. torino.it
  5461. tp.it
  5462. tr.it
  5463. trani-andria-barletta.it
  5464. trani-barletta-andria.it
  5465. traniandriabarletta.it
  5466. tranibarlettaandria.it
  5467. trapani.it
  5468. trento.it
  5469. treviso.it
  5470. trieste.it
  5471. ts.it
  5472. turin.it
  5473. tv.it
  5474. ud.it
  5475. udine.it
  5476. urbino-pesaro.it
  5477. urbinopesaro.it
  5478. va.it
  5479. varese.it
  5480. vb.it
  5481. vc.it
  5482. ve.it
  5483. venezia.it
  5484. venice.it
  5485. verbania.it
  5486. vercelli.it
  5487. verona.it
  5488. vi.it
  5489. vibo-valentia.it
  5490. vibovalentia.it
  5491. vicenza.it
  5492. viterbo.it
  5493. vr.it
  5494. vs.it
  5495. vt.it
  5496. vv.it
  5497. // je : http://www.channelisles.net/register-domains/
  5498. // Confirmed by registry <nigel@channelisles.net> 2013-11-28
  5499. je
  5500. co.je
  5501. net.je
  5502. org.je
  5503. // jm : http://www.com.jm/register.html
  5504. *.jm
  5505. // jo : http://www.dns.jo/Registration_policy.aspx
  5506. jo
  5507. com.jo
  5508. org.jo
  5509. net.jo
  5510. edu.jo
  5511. sch.jo
  5512. gov.jo
  5513. mil.jo
  5514. name.jo
  5515. // jobs : https://en.wikipedia.org/wiki/.jobs
  5516. jobs
  5517. // jp : https://en.wikipedia.org/wiki/.jp
  5518. // http://jprs.co.jp/en/jpdomain.html
  5519. // Submitted by registry <info@jprs.jp>
  5520. jp
  5521. // jp organizational type names
  5522. ac.jp
  5523. ad.jp
  5524. co.jp
  5525. ed.jp
  5526. go.jp
  5527. gr.jp
  5528. lg.jp
  5529. ne.jp
  5530. or.jp
  5531. // jp prefecture type names
  5532. aichi.jp
  5533. akita.jp
  5534. aomori.jp
  5535. chiba.jp
  5536. ehime.jp
  5537. fukui.jp
  5538. fukuoka.jp
  5539. fukushima.jp
  5540. gifu.jp
  5541. gunma.jp
  5542. hiroshima.jp
  5543. hokkaido.jp
  5544. hyogo.jp
  5545. ibaraki.jp
  5546. ishikawa.jp
  5547. iwate.jp
  5548. kagawa.jp
  5549. kagoshima.jp
  5550. kanagawa.jp
  5551. kochi.jp
  5552. kumamoto.jp
  5553. kyoto.jp
  5554. mie.jp
  5555. miyagi.jp
  5556. miyazaki.jp
  5557. nagano.jp
  5558. nagasaki.jp
  5559. nara.jp
  5560. niigata.jp
  5561. oita.jp
  5562. okayama.jp
  5563. okinawa.jp
  5564. osaka.jp
  5565. saga.jp
  5566. saitama.jp
  5567. shiga.jp
  5568. shimane.jp
  5569. shizuoka.jp
  5570. tochigi.jp
  5571. tokushima.jp
  5572. tokyo.jp
  5573. tottori.jp
  5574. toyama.jp
  5575. wakayama.jp
  5576. yamagata.jp
  5577. yamaguchi.jp
  5578. yamanashi.jp
  5579. 栃木.jp
  5580. 愛知.jp
  5581. 愛媛.jp
  5582. 兵庫.jp
  5583. 熊本.jp
  5584. 茨城.jp
  5585. 北海道.jp
  5586. 千葉.jp
  5587. 和歌山.jp
  5588. 長崎.jp
  5589. 長野.jp
  5590. 新潟.jp
  5591. 青森.jp
  5592. 静岡.jp
  5593. 東京.jp
  5594. 石川.jp
  5595. 埼玉.jp
  5596. 三重.jp
  5597. 京都.jp
  5598. 佐賀.jp
  5599. 大分.jp
  5600. 大阪.jp
  5601. 奈良.jp
  5602. 宮城.jp
  5603. 宮崎.jp
  5604. 富山.jp
  5605. 山口.jp
  5606. 山形.jp
  5607. 山梨.jp
  5608. 岩手.jp
  5609. 岐阜.jp
  5610. 岡山.jp
  5611. 島根.jp
  5612. 広島.jp
  5613. 徳島.jp
  5614. 沖縄.jp
  5615. 滋賀.jp
  5616. 神奈川.jp
  5617. 福井.jp
  5618. 福岡.jp
  5619. 福島.jp
  5620. 秋田.jp
  5621. 群馬.jp
  5622. 香川.jp
  5623. 高知.jp
  5624. 鳥取.jp
  5625. 鹿児島.jp
  5626. // jp geographic type names
  5627. // http://jprs.jp/doc/rule/saisoku-1.html
  5628. *.kawasaki.jp
  5629. *.kitakyushu.jp
  5630. *.kobe.jp
  5631. *.nagoya.jp
  5632. *.sapporo.jp
  5633. *.sendai.jp
  5634. *.yokohama.jp
  5635. !city.kawasaki.jp
  5636. !city.kitakyushu.jp
  5637. !city.kobe.jp
  5638. !city.nagoya.jp
  5639. !city.sapporo.jp
  5640. !city.sendai.jp
  5641. !city.yokohama.jp
  5642. // 4th level registration
  5643. aisai.aichi.jp
  5644. ama.aichi.jp
  5645. anjo.aichi.jp
  5646. asuke.aichi.jp
  5647. chiryu.aichi.jp
  5648. chita.aichi.jp
  5649. fuso.aichi.jp
  5650. gamagori.aichi.jp
  5651. handa.aichi.jp
  5652. hazu.aichi.jp
  5653. hekinan.aichi.jp
  5654. higashiura.aichi.jp
  5655. ichinomiya.aichi.jp
  5656. inazawa.aichi.jp
  5657. inuyama.aichi.jp
  5658. isshiki.aichi.jp
  5659. iwakura.aichi.jp
  5660. kanie.aichi.jp
  5661. kariya.aichi.jp
  5662. kasugai.aichi.jp
  5663. kira.aichi.jp
  5664. kiyosu.aichi.jp
  5665. komaki.aichi.jp
  5666. konan.aichi.jp
  5667. kota.aichi.jp
  5668. mihama.aichi.jp
  5669. miyoshi.aichi.jp
  5670. nishio.aichi.jp
  5671. nisshin.aichi.jp
  5672. obu.aichi.jp
  5673. oguchi.aichi.jp
  5674. oharu.aichi.jp
  5675. okazaki.aichi.jp
  5676. owariasahi.aichi.jp
  5677. seto.aichi.jp
  5678. shikatsu.aichi.jp
  5679. shinshiro.aichi.jp
  5680. shitara.aichi.jp
  5681. tahara.aichi.jp
  5682. takahama.aichi.jp
  5683. tobishima.aichi.jp
  5684. toei.aichi.jp
  5685. togo.aichi.jp
  5686. tokai.aichi.jp
  5687. tokoname.aichi.jp
  5688. toyoake.aichi.jp
  5689. toyohashi.aichi.jp
  5690. toyokawa.aichi.jp
  5691. toyone.aichi.jp
  5692. toyota.aichi.jp
  5693. tsushima.aichi.jp
  5694. yatomi.aichi.jp
  5695. akita.akita.jp
  5696. daisen.akita.jp
  5697. fujisato.akita.jp
  5698. gojome.akita.jp
  5699. hachirogata.akita.jp
  5700. happou.akita.jp
  5701. higashinaruse.akita.jp
  5702. honjo.akita.jp
  5703. honjyo.akita.jp
  5704. ikawa.akita.jp
  5705. kamikoani.akita.jp
  5706. kamioka.akita.jp
  5707. katagami.akita.jp
  5708. kazuno.akita.jp
  5709. kitaakita.akita.jp
  5710. kosaka.akita.jp
  5711. kyowa.akita.jp
  5712. misato.akita.jp
  5713. mitane.akita.jp
  5714. moriyoshi.akita.jp
  5715. nikaho.akita.jp
  5716. noshiro.akita.jp
  5717. odate.akita.jp
  5718. oga.akita.jp
  5719. ogata.akita.jp
  5720. semboku.akita.jp
  5721. yokote.akita.jp
  5722. yurihonjo.akita.jp
  5723. aomori.aomori.jp
  5724. gonohe.aomori.jp
  5725. hachinohe.aomori.jp
  5726. hashikami.aomori.jp
  5727. hiranai.aomori.jp
  5728. hirosaki.aomori.jp
  5729. itayanagi.aomori.jp
  5730. kuroishi.aomori.jp
  5731. misawa.aomori.jp
  5732. mutsu.aomori.jp
  5733. nakadomari.aomori.jp
  5734. noheji.aomori.jp
  5735. oirase.aomori.jp
  5736. owani.aomori.jp
  5737. rokunohe.aomori.jp
  5738. sannohe.aomori.jp
  5739. shichinohe.aomori.jp
  5740. shingo.aomori.jp
  5741. takko.aomori.jp
  5742. towada.aomori.jp
  5743. tsugaru.aomori.jp
  5744. tsuruta.aomori.jp
  5745. abiko.chiba.jp
  5746. asahi.chiba.jp
  5747. chonan.chiba.jp
  5748. chosei.chiba.jp
  5749. choshi.chiba.jp
  5750. chuo.chiba.jp
  5751. funabashi.chiba.jp
  5752. futtsu.chiba.jp
  5753. hanamigawa.chiba.jp
  5754. ichihara.chiba.jp
  5755. ichikawa.chiba.jp
  5756. ichinomiya.chiba.jp
  5757. inzai.chiba.jp
  5758. isumi.chiba.jp
  5759. kamagaya.chiba.jp
  5760. kamogawa.chiba.jp
  5761. kashiwa.chiba.jp
  5762. katori.chiba.jp
  5763. katsuura.chiba.jp
  5764. kimitsu.chiba.jp
  5765. kisarazu.chiba.jp
  5766. kozaki.chiba.jp
  5767. kujukuri.chiba.jp
  5768. kyonan.chiba.jp
  5769. matsudo.chiba.jp
  5770. midori.chiba.jp
  5771. mihama.chiba.jp
  5772. minamiboso.chiba.jp
  5773. mobara.chiba.jp
  5774. mutsuzawa.chiba.jp
  5775. nagara.chiba.jp
  5776. nagareyama.chiba.jp
  5777. narashino.chiba.jp
  5778. narita.chiba.jp
  5779. noda.chiba.jp
  5780. oamishirasato.chiba.jp
  5781. omigawa.chiba.jp
  5782. onjuku.chiba.jp
  5783. otaki.chiba.jp
  5784. sakae.chiba.jp
  5785. sakura.chiba.jp
  5786. shimofusa.chiba.jp
  5787. shirako.chiba.jp
  5788. shiroi.chiba.jp
  5789. shisui.chiba.jp
  5790. sodegaura.chiba.jp
  5791. sosa.chiba.jp
  5792. tako.chiba.jp
  5793. tateyama.chiba.jp
  5794. togane.chiba.jp
  5795. tohnosho.chiba.jp
  5796. tomisato.chiba.jp
  5797. urayasu.chiba.jp
  5798. yachimata.chiba.jp
  5799. yachiyo.chiba.jp
  5800. yokaichiba.chiba.jp
  5801. yokoshibahikari.chiba.jp
  5802. yotsukaido.chiba.jp
  5803. ainan.ehime.jp
  5804. honai.ehime.jp
  5805. ikata.ehime.jp
  5806. imabari.ehime.jp
  5807. iyo.ehime.jp
  5808. kamijima.ehime.jp
  5809. kihoku.ehime.jp
  5810. kumakogen.ehime.jp
  5811. masaki.ehime.jp
  5812. matsuno.ehime.jp
  5813. matsuyama.ehime.jp
  5814. namikata.ehime.jp
  5815. niihama.ehime.jp
  5816. ozu.ehime.jp
  5817. saijo.ehime.jp
  5818. seiyo.ehime.jp
  5819. shikokuchuo.ehime.jp
  5820. tobe.ehime.jp
  5821. toon.ehime.jp
  5822. uchiko.ehime.jp
  5823. uwajima.ehime.jp
  5824. yawatahama.ehime.jp
  5825. echizen.fukui.jp
  5826. eiheiji.fukui.jp
  5827. fukui.fukui.jp
  5828. ikeda.fukui.jp
  5829. katsuyama.fukui.jp
  5830. mihama.fukui.jp
  5831. minamiechizen.fukui.jp
  5832. obama.fukui.jp
  5833. ohi.fukui.jp
  5834. ono.fukui.jp
  5835. sabae.fukui.jp
  5836. sakai.fukui.jp
  5837. takahama.fukui.jp
  5838. tsuruga.fukui.jp
  5839. wakasa.fukui.jp
  5840. ashiya.fukuoka.jp
  5841. buzen.fukuoka.jp
  5842. chikugo.fukuoka.jp
  5843. chikuho.fukuoka.jp
  5844. chikujo.fukuoka.jp
  5845. chikushino.fukuoka.jp
  5846. chikuzen.fukuoka.jp
  5847. chuo.fukuoka.jp
  5848. dazaifu.fukuoka.jp
  5849. fukuchi.fukuoka.jp
  5850. hakata.fukuoka.jp
  5851. higashi.fukuoka.jp
  5852. hirokawa.fukuoka.jp
  5853. hisayama.fukuoka.jp
  5854. iizuka.fukuoka.jp
  5855. inatsuki.fukuoka.jp
  5856. kaho.fukuoka.jp
  5857. kasuga.fukuoka.jp
  5858. kasuya.fukuoka.jp
  5859. kawara.fukuoka.jp
  5860. keisen.fukuoka.jp
  5861. koga.fukuoka.jp
  5862. kurate.fukuoka.jp
  5863. kurogi.fukuoka.jp
  5864. kurume.fukuoka.jp
  5865. minami.fukuoka.jp
  5866. miyako.fukuoka.jp
  5867. miyama.fukuoka.jp
  5868. miyawaka.fukuoka.jp
  5869. mizumaki.fukuoka.jp
  5870. munakata.fukuoka.jp
  5871. nakagawa.fukuoka.jp
  5872. nakama.fukuoka.jp
  5873. nishi.fukuoka.jp
  5874. nogata.fukuoka.jp
  5875. ogori.fukuoka.jp
  5876. okagaki.fukuoka.jp
  5877. okawa.fukuoka.jp
  5878. oki.fukuoka.jp
  5879. omuta.fukuoka.jp
  5880. onga.fukuoka.jp
  5881. onojo.fukuoka.jp
  5882. oto.fukuoka.jp
  5883. saigawa.fukuoka.jp
  5884. sasaguri.fukuoka.jp
  5885. shingu.fukuoka.jp
  5886. shinyoshitomi.fukuoka.jp
  5887. shonai.fukuoka.jp
  5888. soeda.fukuoka.jp
  5889. sue.fukuoka.jp
  5890. tachiarai.fukuoka.jp
  5891. tagawa.fukuoka.jp
  5892. takata.fukuoka.jp
  5893. toho.fukuoka.jp
  5894. toyotsu.fukuoka.jp
  5895. tsuiki.fukuoka.jp
  5896. ukiha.fukuoka.jp
  5897. umi.fukuoka.jp
  5898. usui.fukuoka.jp
  5899. yamada.fukuoka.jp
  5900. yame.fukuoka.jp
  5901. yanagawa.fukuoka.jp
  5902. yukuhashi.fukuoka.jp
  5903. aizubange.fukushima.jp
  5904. aizumisato.fukushima.jp
  5905. aizuwakamatsu.fukushima.jp
  5906. asakawa.fukushima.jp
  5907. bandai.fukushima.jp
  5908. date.fukushima.jp
  5909. fukushima.fukushima.jp
  5910. furudono.fukushima.jp
  5911. futaba.fukushima.jp
  5912. hanawa.fukushima.jp
  5913. higashi.fukushima.jp
  5914. hirata.fukushima.jp
  5915. hirono.fukushima.jp
  5916. iitate.fukushima.jp
  5917. inawashiro.fukushima.jp
  5918. ishikawa.fukushima.jp
  5919. iwaki.fukushima.jp
  5920. izumizaki.fukushima.jp
  5921. kagamiishi.fukushima.jp
  5922. kaneyama.fukushima.jp
  5923. kawamata.fukushima.jp
  5924. kitakata.fukushima.jp
  5925. kitashiobara.fukushima.jp
  5926. koori.fukushima.jp
  5927. koriyama.fukushima.jp
  5928. kunimi.fukushima.jp
  5929. miharu.fukushima.jp
  5930. mishima.fukushima.jp
  5931. namie.fukushima.jp
  5932. nango.fukushima.jp
  5933. nishiaizu.fukushima.jp
  5934. nishigo.fukushima.jp
  5935. okuma.fukushima.jp
  5936. omotego.fukushima.jp
  5937. ono.fukushima.jp
  5938. otama.fukushima.jp
  5939. samegawa.fukushima.jp
  5940. shimogo.fukushima.jp
  5941. shirakawa.fukushima.jp
  5942. showa.fukushima.jp
  5943. soma.fukushima.jp
  5944. sukagawa.fukushima.jp
  5945. taishin.fukushima.jp
  5946. tamakawa.fukushima.jp
  5947. tanagura.fukushima.jp
  5948. tenei.fukushima.jp
  5949. yabuki.fukushima.jp
  5950. yamato.fukushima.jp
  5951. yamatsuri.fukushima.jp
  5952. yanaizu.fukushima.jp
  5953. yugawa.fukushima.jp
  5954. anpachi.gifu.jp
  5955. ena.gifu.jp
  5956. gifu.gifu.jp
  5957. ginan.gifu.jp
  5958. godo.gifu.jp
  5959. gujo.gifu.jp
  5960. hashima.gifu.jp
  5961. hichiso.gifu.jp
  5962. hida.gifu.jp
  5963. higashishirakawa.gifu.jp
  5964. ibigawa.gifu.jp
  5965. ikeda.gifu.jp
  5966. kakamigahara.gifu.jp
  5967. kani.gifu.jp
  5968. kasahara.gifu.jp
  5969. kasamatsu.gifu.jp
  5970. kawaue.gifu.jp
  5971. kitagata.gifu.jp
  5972. mino.gifu.jp
  5973. minokamo.gifu.jp
  5974. mitake.gifu.jp
  5975. mizunami.gifu.jp
  5976. motosu.gifu.jp
  5977. nakatsugawa.gifu.jp
  5978. ogaki.gifu.jp
  5979. sakahogi.gifu.jp
  5980. seki.gifu.jp
  5981. sekigahara.gifu.jp
  5982. shirakawa.gifu.jp
  5983. tajimi.gifu.jp
  5984. takayama.gifu.jp
  5985. tarui.gifu.jp
  5986. toki.gifu.jp
  5987. tomika.gifu.jp
  5988. wanouchi.gifu.jp
  5989. yamagata.gifu.jp
  5990. yaotsu.gifu.jp
  5991. yoro.gifu.jp
  5992. annaka.gunma.jp
  5993. chiyoda.gunma.jp
  5994. fujioka.gunma.jp
  5995. higashiagatsuma.gunma.jp
  5996. isesaki.gunma.jp
  5997. itakura.gunma.jp
  5998. kanna.gunma.jp
  5999. kanra.gunma.jp
  6000. katashina.gunma.jp
  6001. kawaba.gunma.jp
  6002. kiryu.gunma.jp
  6003. kusatsu.gunma.jp
  6004. maebashi.gunma.jp
  6005. meiwa.gunma.jp
  6006. midori.gunma.jp
  6007. minakami.gunma.jp
  6008. naganohara.gunma.jp
  6009. nakanojo.gunma.jp
  6010. nanmoku.gunma.jp
  6011. numata.gunma.jp
  6012. oizumi.gunma.jp
  6013. ora.gunma.jp
  6014. ota.gunma.jp
  6015. shibukawa.gunma.jp
  6016. shimonita.gunma.jp
  6017. shinto.gunma.jp
  6018. showa.gunma.jp
  6019. takasaki.gunma.jp
  6020. takayama.gunma.jp
  6021. tamamura.gunma.jp
  6022. tatebayashi.gunma.jp
  6023. tomioka.gunma.jp
  6024. tsukiyono.gunma.jp
  6025. tsumagoi.gunma.jp
  6026. ueno.gunma.jp
  6027. yoshioka.gunma.jp
  6028. asaminami.hiroshima.jp
  6029. daiwa.hiroshima.jp
  6030. etajima.hiroshima.jp
  6031. fuchu.hiroshima.jp
  6032. fukuyama.hiroshima.jp
  6033. hatsukaichi.hiroshima.jp
  6034. higashihiroshima.hiroshima.jp
  6035. hongo.hiroshima.jp
  6036. jinsekikogen.hiroshima.jp
  6037. kaita.hiroshima.jp
  6038. kui.hiroshima.jp
  6039. kumano.hiroshima.jp
  6040. kure.hiroshima.jp
  6041. mihara.hiroshima.jp
  6042. miyoshi.hiroshima.jp
  6043. naka.hiroshima.jp
  6044. onomichi.hiroshima.jp
  6045. osakikamijima.hiroshima.jp
  6046. otake.hiroshima.jp
  6047. saka.hiroshima.jp
  6048. sera.hiroshima.jp
  6049. seranishi.hiroshima.jp
  6050. shinichi.hiroshima.jp
  6051. shobara.hiroshima.jp
  6052. takehara.hiroshima.jp
  6053. abashiri.hokkaido.jp
  6054. abira.hokkaido.jp
  6055. aibetsu.hokkaido.jp
  6056. akabira.hokkaido.jp
  6057. akkeshi.hokkaido.jp
  6058. asahikawa.hokkaido.jp
  6059. ashibetsu.hokkaido.jp
  6060. ashoro.hokkaido.jp
  6061. assabu.hokkaido.jp
  6062. atsuma.hokkaido.jp
  6063. bibai.hokkaido.jp
  6064. biei.hokkaido.jp
  6065. bifuka.hokkaido.jp
  6066. bihoro.hokkaido.jp
  6067. biratori.hokkaido.jp
  6068. chippubetsu.hokkaido.jp
  6069. chitose.hokkaido.jp
  6070. date.hokkaido.jp
  6071. ebetsu.hokkaido.jp
  6072. embetsu.hokkaido.jp
  6073. eniwa.hokkaido.jp
  6074. erimo.hokkaido.jp
  6075. esan.hokkaido.jp
  6076. esashi.hokkaido.jp
  6077. fukagawa.hokkaido.jp
  6078. fukushima.hokkaido.jp
  6079. furano.hokkaido.jp
  6080. furubira.hokkaido.jp
  6081. haboro.hokkaido.jp
  6082. hakodate.hokkaido.jp
  6083. hamatonbetsu.hokkaido.jp
  6084. hidaka.hokkaido.jp
  6085. higashikagura.hokkaido.jp
  6086. higashikawa.hokkaido.jp
  6087. hiroo.hokkaido.jp
  6088. hokuryu.hokkaido.jp
  6089. hokuto.hokkaido.jp
  6090. honbetsu.hokkaido.jp
  6091. horokanai.hokkaido.jp
  6092. horonobe.hokkaido.jp
  6093. ikeda.hokkaido.jp
  6094. imakane.hokkaido.jp
  6095. ishikari.hokkaido.jp
  6096. iwamizawa.hokkaido.jp
  6097. iwanai.hokkaido.jp
  6098. kamifurano.hokkaido.jp
  6099. kamikawa.hokkaido.jp
  6100. kamishihoro.hokkaido.jp
  6101. kamisunagawa.hokkaido.jp
  6102. kamoenai.hokkaido.jp
  6103. kayabe.hokkaido.jp
  6104. kembuchi.hokkaido.jp
  6105. kikonai.hokkaido.jp
  6106. kimobetsu.hokkaido.jp
  6107. kitahiroshima.hokkaido.jp
  6108. kitami.hokkaido.jp
  6109. kiyosato.hokkaido.jp
  6110. koshimizu.hokkaido.jp
  6111. kunneppu.hokkaido.jp
  6112. kuriyama.hokkaido.jp
  6113. kuromatsunai.hokkaido.jp
  6114. kushiro.hokkaido.jp
  6115. kutchan.hokkaido.jp
  6116. kyowa.hokkaido.jp
  6117. mashike.hokkaido.jp
  6118. matsumae.hokkaido.jp
  6119. mikasa.hokkaido.jp
  6120. minamifurano.hokkaido.jp
  6121. mombetsu.hokkaido.jp
  6122. moseushi.hokkaido.jp
  6123. mukawa.hokkaido.jp
  6124. muroran.hokkaido.jp
  6125. naie.hokkaido.jp
  6126. nakagawa.hokkaido.jp
  6127. nakasatsunai.hokkaido.jp
  6128. nakatombetsu.hokkaido.jp
  6129. nanae.hokkaido.jp
  6130. nanporo.hokkaido.jp
  6131. nayoro.hokkaido.jp
  6132. nemuro.hokkaido.jp
  6133. niikappu.hokkaido.jp
  6134. niki.hokkaido.jp
  6135. nishiokoppe.hokkaido.jp
  6136. noboribetsu.hokkaido.jp
  6137. numata.hokkaido.jp
  6138. obihiro.hokkaido.jp
  6139. obira.hokkaido.jp
  6140. oketo.hokkaido.jp
  6141. okoppe.hokkaido.jp
  6142. otaru.hokkaido.jp
  6143. otobe.hokkaido.jp
  6144. otofuke.hokkaido.jp
  6145. otoineppu.hokkaido.jp
  6146. oumu.hokkaido.jp
  6147. ozora.hokkaido.jp
  6148. pippu.hokkaido.jp
  6149. rankoshi.hokkaido.jp
  6150. rebun.hokkaido.jp
  6151. rikubetsu.hokkaido.jp
  6152. rishiri.hokkaido.jp
  6153. rishirifuji.hokkaido.jp
  6154. saroma.hokkaido.jp
  6155. sarufutsu.hokkaido.jp
  6156. shakotan.hokkaido.jp
  6157. shari.hokkaido.jp
  6158. shibecha.hokkaido.jp
  6159. shibetsu.hokkaido.jp
  6160. shikabe.hokkaido.jp
  6161. shikaoi.hokkaido.jp
  6162. shimamaki.hokkaido.jp
  6163. shimizu.hokkaido.jp
  6164. shimokawa.hokkaido.jp
  6165. shinshinotsu.hokkaido.jp
  6166. shintoku.hokkaido.jp
  6167. shiranuka.hokkaido.jp
  6168. shiraoi.hokkaido.jp
  6169. shiriuchi.hokkaido.jp
  6170. sobetsu.hokkaido.jp
  6171. sunagawa.hokkaido.jp
  6172. taiki.hokkaido.jp
  6173. takasu.hokkaido.jp
  6174. takikawa.hokkaido.jp
  6175. takinoue.hokkaido.jp
  6176. teshikaga.hokkaido.jp
  6177. tobetsu.hokkaido.jp
  6178. tohma.hokkaido.jp
  6179. tomakomai.hokkaido.jp
  6180. tomari.hokkaido.jp
  6181. toya.hokkaido.jp
  6182. toyako.hokkaido.jp
  6183. toyotomi.hokkaido.jp
  6184. toyoura.hokkaido.jp
  6185. tsubetsu.hokkaido.jp
  6186. tsukigata.hokkaido.jp
  6187. urakawa.hokkaido.jp
  6188. urausu.hokkaido.jp
  6189. uryu.hokkaido.jp
  6190. utashinai.hokkaido.jp
  6191. wakkanai.hokkaido.jp
  6192. wassamu.hokkaido.jp
  6193. yakumo.hokkaido.jp
  6194. yoichi.hokkaido.jp
  6195. aioi.hyogo.jp
  6196. akashi.hyogo.jp
  6197. ako.hyogo.jp
  6198. amagasaki.hyogo.jp
  6199. aogaki.hyogo.jp
  6200. asago.hyogo.jp
  6201. ashiya.hyogo.jp
  6202. awaji.hyogo.jp
  6203. fukusaki.hyogo.jp
  6204. goshiki.hyogo.jp
  6205. harima.hyogo.jp
  6206. himeji.hyogo.jp
  6207. ichikawa.hyogo.jp
  6208. inagawa.hyogo.jp
  6209. itami.hyogo.jp
  6210. kakogawa.hyogo.jp
  6211. kamigori.hyogo.jp
  6212. kamikawa.hyogo.jp
  6213. kasai.hyogo.jp
  6214. kasuga.hyogo.jp
  6215. kawanishi.hyogo.jp
  6216. miki.hyogo.jp
  6217. minamiawaji.hyogo.jp
  6218. nishinomiya.hyogo.jp
  6219. nishiwaki.hyogo.jp
  6220. ono.hyogo.jp
  6221. sanda.hyogo.jp
  6222. sannan.hyogo.jp
  6223. sasayama.hyogo.jp
  6224. sayo.hyogo.jp
  6225. shingu.hyogo.jp
  6226. shinonsen.hyogo.jp
  6227. shiso.hyogo.jp
  6228. sumoto.hyogo.jp
  6229. taishi.hyogo.jp
  6230. taka.hyogo.jp
  6231. takarazuka.hyogo.jp
  6232. takasago.hyogo.jp
  6233. takino.hyogo.jp
  6234. tamba.hyogo.jp
  6235. tatsuno.hyogo.jp
  6236. toyooka.hyogo.jp
  6237. yabu.hyogo.jp
  6238. yashiro.hyogo.jp
  6239. yoka.hyogo.jp
  6240. yokawa.hyogo.jp
  6241. ami.ibaraki.jp
  6242. asahi.ibaraki.jp
  6243. bando.ibaraki.jp
  6244. chikusei.ibaraki.jp
  6245. daigo.ibaraki.jp
  6246. fujishiro.ibaraki.jp
  6247. hitachi.ibaraki.jp
  6248. hitachinaka.ibaraki.jp
  6249. hitachiomiya.ibaraki.jp
  6250. hitachiota.ibaraki.jp
  6251. ibaraki.ibaraki.jp
  6252. ina.ibaraki.jp
  6253. inashiki.ibaraki.jp
  6254. itako.ibaraki.jp
  6255. iwama.ibaraki.jp
  6256. joso.ibaraki.jp
  6257. kamisu.ibaraki.jp
  6258. kasama.ibaraki.jp
  6259. kashima.ibaraki.jp
  6260. kasumigaura.ibaraki.jp
  6261. koga.ibaraki.jp
  6262. miho.ibaraki.jp
  6263. mito.ibaraki.jp
  6264. moriya.ibaraki.jp
  6265. naka.ibaraki.jp
  6266. namegata.ibaraki.jp
  6267. oarai.ibaraki.jp
  6268. ogawa.ibaraki.jp
  6269. omitama.ibaraki.jp
  6270. ryugasaki.ibaraki.jp
  6271. sakai.ibaraki.jp
  6272. sakuragawa.ibaraki.jp
  6273. shimodate.ibaraki.jp
  6274. shimotsuma.ibaraki.jp
  6275. shirosato.ibaraki.jp
  6276. sowa.ibaraki.jp
  6277. suifu.ibaraki.jp
  6278. takahagi.ibaraki.jp
  6279. tamatsukuri.ibaraki.jp
  6280. tokai.ibaraki.jp
  6281. tomobe.ibaraki.jp
  6282. tone.ibaraki.jp
  6283. toride.ibaraki.jp
  6284. tsuchiura.ibaraki.jp
  6285. tsukuba.ibaraki.jp
  6286. uchihara.ibaraki.jp
  6287. ushiku.ibaraki.jp
  6288. yachiyo.ibaraki.jp
  6289. yamagata.ibaraki.jp
  6290. yawara.ibaraki.jp
  6291. yuki.ibaraki.jp
  6292. anamizu.ishikawa.jp
  6293. hakui.ishikawa.jp
  6294. hakusan.ishikawa.jp
  6295. kaga.ishikawa.jp
  6296. kahoku.ishikawa.jp
  6297. kanazawa.ishikawa.jp
  6298. kawakita.ishikawa.jp
  6299. komatsu.ishikawa.jp
  6300. nakanoto.ishikawa.jp
  6301. nanao.ishikawa.jp
  6302. nomi.ishikawa.jp
  6303. nonoichi.ishikawa.jp
  6304. noto.ishikawa.jp
  6305. shika.ishikawa.jp
  6306. suzu.ishikawa.jp
  6307. tsubata.ishikawa.jp
  6308. tsurugi.ishikawa.jp
  6309. uchinada.ishikawa.jp
  6310. wajima.ishikawa.jp
  6311. fudai.iwate.jp
  6312. fujisawa.iwate.jp
  6313. hanamaki.iwate.jp
  6314. hiraizumi.iwate.jp
  6315. hirono.iwate.jp
  6316. ichinohe.iwate.jp
  6317. ichinoseki.iwate.jp
  6318. iwaizumi.iwate.jp
  6319. iwate.iwate.jp
  6320. joboji.iwate.jp
  6321. kamaishi.iwate.jp
  6322. kanegasaki.iwate.jp
  6323. karumai.iwate.jp
  6324. kawai.iwate.jp
  6325. kitakami.iwate.jp
  6326. kuji.iwate.jp
  6327. kunohe.iwate.jp
  6328. kuzumaki.iwate.jp
  6329. miyako.iwate.jp
  6330. mizusawa.iwate.jp
  6331. morioka.iwate.jp
  6332. ninohe.iwate.jp
  6333. noda.iwate.jp
  6334. ofunato.iwate.jp
  6335. oshu.iwate.jp
  6336. otsuchi.iwate.jp
  6337. rikuzentakata.iwate.jp
  6338. shiwa.iwate.jp
  6339. shizukuishi.iwate.jp
  6340. sumita.iwate.jp
  6341. tanohata.iwate.jp
  6342. tono.iwate.jp
  6343. yahaba.iwate.jp
  6344. yamada.iwate.jp
  6345. ayagawa.kagawa.jp
  6346. higashikagawa.kagawa.jp
  6347. kanonji.kagawa.jp
  6348. kotohira.kagawa.jp
  6349. manno.kagawa.jp
  6350. marugame.kagawa.jp
  6351. mitoyo.kagawa.jp
  6352. naoshima.kagawa.jp
  6353. sanuki.kagawa.jp
  6354. tadotsu.kagawa.jp
  6355. takamatsu.kagawa.jp
  6356. tonosho.kagawa.jp
  6357. uchinomi.kagawa.jp
  6358. utazu.kagawa.jp
  6359. zentsuji.kagawa.jp
  6360. akune.kagoshima.jp
  6361. amami.kagoshima.jp
  6362. hioki.kagoshima.jp
  6363. isa.kagoshima.jp
  6364. isen.kagoshima.jp
  6365. izumi.kagoshima.jp
  6366. kagoshima.kagoshima.jp
  6367. kanoya.kagoshima.jp
  6368. kawanabe.kagoshima.jp
  6369. kinko.kagoshima.jp
  6370. kouyama.kagoshima.jp
  6371. makurazaki.kagoshima.jp
  6372. matsumoto.kagoshima.jp
  6373. minamitane.kagoshima.jp
  6374. nakatane.kagoshima.jp
  6375. nishinoomote.kagoshima.jp
  6376. satsumasendai.kagoshima.jp
  6377. soo.kagoshima.jp
  6378. tarumizu.kagoshima.jp
  6379. yusui.kagoshima.jp
  6380. aikawa.kanagawa.jp
  6381. atsugi.kanagawa.jp
  6382. ayase.kanagawa.jp
  6383. chigasaki.kanagawa.jp
  6384. ebina.kanagawa.jp
  6385. fujisawa.kanagawa.jp
  6386. hadano.kanagawa.jp
  6387. hakone.kanagawa.jp
  6388. hiratsuka.kanagawa.jp
  6389. isehara.kanagawa.jp
  6390. kaisei.kanagawa.jp
  6391. kamakura.kanagawa.jp
  6392. kiyokawa.kanagawa.jp
  6393. matsuda.kanagawa.jp
  6394. minamiashigara.kanagawa.jp
  6395. miura.kanagawa.jp
  6396. nakai.kanagawa.jp
  6397. ninomiya.kanagawa.jp
  6398. odawara.kanagawa.jp
  6399. oi.kanagawa.jp
  6400. oiso.kanagawa.jp
  6401. sagamihara.kanagawa.jp
  6402. samukawa.kanagawa.jp
  6403. tsukui.kanagawa.jp
  6404. yamakita.kanagawa.jp
  6405. yamato.kanagawa.jp
  6406. yokosuka.kanagawa.jp
  6407. yugawara.kanagawa.jp
  6408. zama.kanagawa.jp
  6409. zushi.kanagawa.jp
  6410. aki.kochi.jp
  6411. geisei.kochi.jp
  6412. hidaka.kochi.jp
  6413. higashitsuno.kochi.jp
  6414. ino.kochi.jp
  6415. kagami.kochi.jp
  6416. kami.kochi.jp
  6417. kitagawa.kochi.jp
  6418. kochi.kochi.jp
  6419. mihara.kochi.jp
  6420. motoyama.kochi.jp
  6421. muroto.kochi.jp
  6422. nahari.kochi.jp
  6423. nakamura.kochi.jp
  6424. nankoku.kochi.jp
  6425. nishitosa.kochi.jp
  6426. niyodogawa.kochi.jp
  6427. ochi.kochi.jp
  6428. okawa.kochi.jp
  6429. otoyo.kochi.jp
  6430. otsuki.kochi.jp
  6431. sakawa.kochi.jp
  6432. sukumo.kochi.jp
  6433. susaki.kochi.jp
  6434. tosa.kochi.jp
  6435. tosashimizu.kochi.jp
  6436. toyo.kochi.jp
  6437. tsuno.kochi.jp
  6438. umaji.kochi.jp
  6439. yasuda.kochi.jp
  6440. yusuhara.kochi.jp
  6441. amakusa.kumamoto.jp
  6442. arao.kumamoto.jp
  6443. aso.kumamoto.jp
  6444. choyo.kumamoto.jp
  6445. gyokuto.kumamoto.jp
  6446. kamiamakusa.kumamoto.jp
  6447. kikuchi.kumamoto.jp
  6448. kumamoto.kumamoto.jp
  6449. mashiki.kumamoto.jp
  6450. mifune.kumamoto.jp
  6451. minamata.kumamoto.jp
  6452. minamioguni.kumamoto.jp
  6453. nagasu.kumamoto.jp
  6454. nishihara.kumamoto.jp
  6455. oguni.kumamoto.jp
  6456. ozu.kumamoto.jp
  6457. sumoto.kumamoto.jp
  6458. takamori.kumamoto.jp
  6459. uki.kumamoto.jp
  6460. uto.kumamoto.jp
  6461. yamaga.kumamoto.jp
  6462. yamato.kumamoto.jp
  6463. yatsushiro.kumamoto.jp
  6464. ayabe.kyoto.jp
  6465. fukuchiyama.kyoto.jp
  6466. higashiyama.kyoto.jp
  6467. ide.kyoto.jp
  6468. ine.kyoto.jp
  6469. joyo.kyoto.jp
  6470. kameoka.kyoto.jp
  6471. kamo.kyoto.jp
  6472. kita.kyoto.jp
  6473. kizu.kyoto.jp
  6474. kumiyama.kyoto.jp
  6475. kyotamba.kyoto.jp
  6476. kyotanabe.kyoto.jp
  6477. kyotango.kyoto.jp
  6478. maizuru.kyoto.jp
  6479. minami.kyoto.jp
  6480. minamiyamashiro.kyoto.jp
  6481. miyazu.kyoto.jp
  6482. muko.kyoto.jp
  6483. nagaokakyo.kyoto.jp
  6484. nakagyo.kyoto.jp
  6485. nantan.kyoto.jp
  6486. oyamazaki.kyoto.jp
  6487. sakyo.kyoto.jp
  6488. seika.kyoto.jp
  6489. tanabe.kyoto.jp
  6490. uji.kyoto.jp
  6491. ujitawara.kyoto.jp
  6492. wazuka.kyoto.jp
  6493. yamashina.kyoto.jp
  6494. yawata.kyoto.jp
  6495. asahi.mie.jp
  6496. inabe.mie.jp
  6497. ise.mie.jp
  6498. kameyama.mie.jp
  6499. kawagoe.mie.jp
  6500. kiho.mie.jp
  6501. kisosaki.mie.jp
  6502. kiwa.mie.jp
  6503. komono.mie.jp
  6504. kumano.mie.jp
  6505. kuwana.mie.jp
  6506. matsusaka.mie.jp
  6507. meiwa.mie.jp
  6508. mihama.mie.jp
  6509. minamiise.mie.jp
  6510. misugi.mie.jp
  6511. miyama.mie.jp
  6512. nabari.mie.jp
  6513. shima.mie.jp
  6514. suzuka.mie.jp
  6515. tado.mie.jp
  6516. taiki.mie.jp
  6517. taki.mie.jp
  6518. tamaki.mie.jp
  6519. toba.mie.jp
  6520. tsu.mie.jp
  6521. udono.mie.jp
  6522. ureshino.mie.jp
  6523. watarai.mie.jp
  6524. yokkaichi.mie.jp
  6525. furukawa.miyagi.jp
  6526. higashimatsushima.miyagi.jp
  6527. ishinomaki.miyagi.jp
  6528. iwanuma.miyagi.jp
  6529. kakuda.miyagi.jp
  6530. kami.miyagi.jp
  6531. kawasaki.miyagi.jp
  6532. marumori.miyagi.jp
  6533. matsushima.miyagi.jp
  6534. minamisanriku.miyagi.jp
  6535. misato.miyagi.jp
  6536. murata.miyagi.jp
  6537. natori.miyagi.jp
  6538. ogawara.miyagi.jp
  6539. ohira.miyagi.jp
  6540. onagawa.miyagi.jp
  6541. osaki.miyagi.jp
  6542. rifu.miyagi.jp
  6543. semine.miyagi.jp
  6544. shibata.miyagi.jp
  6545. shichikashuku.miyagi.jp
  6546. shikama.miyagi.jp
  6547. shiogama.miyagi.jp
  6548. shiroishi.miyagi.jp
  6549. tagajo.miyagi.jp
  6550. taiwa.miyagi.jp
  6551. tome.miyagi.jp
  6552. tomiya.miyagi.jp
  6553. wakuya.miyagi.jp
  6554. watari.miyagi.jp
  6555. yamamoto.miyagi.jp
  6556. zao.miyagi.jp
  6557. aya.miyazaki.jp
  6558. ebino.miyazaki.jp
  6559. gokase.miyazaki.jp
  6560. hyuga.miyazaki.jp
  6561. kadogawa.miyazaki.jp
  6562. kawaminami.miyazaki.jp
  6563. kijo.miyazaki.jp
  6564. kitagawa.miyazaki.jp
  6565. kitakata.miyazaki.jp
  6566. kitaura.miyazaki.jp
  6567. kobayashi.miyazaki.jp
  6568. kunitomi.miyazaki.jp
  6569. kushima.miyazaki.jp
  6570. mimata.miyazaki.jp
  6571. miyakonojo.miyazaki.jp
  6572. miyazaki.miyazaki.jp
  6573. morotsuka.miyazaki.jp
  6574. nichinan.miyazaki.jp
  6575. nishimera.miyazaki.jp
  6576. nobeoka.miyazaki.jp
  6577. saito.miyazaki.jp
  6578. shiiba.miyazaki.jp
  6579. shintomi.miyazaki.jp
  6580. takaharu.miyazaki.jp
  6581. takanabe.miyazaki.jp
  6582. takazaki.miyazaki.jp
  6583. tsuno.miyazaki.jp
  6584. achi.nagano.jp
  6585. agematsu.nagano.jp
  6586. anan.nagano.jp
  6587. aoki.nagano.jp
  6588. asahi.nagano.jp
  6589. azumino.nagano.jp
  6590. chikuhoku.nagano.jp
  6591. chikuma.nagano.jp
  6592. chino.nagano.jp
  6593. fujimi.nagano.jp
  6594. hakuba.nagano.jp
  6595. hara.nagano.jp
  6596. hiraya.nagano.jp
  6597. iida.nagano.jp
  6598. iijima.nagano.jp
  6599. iiyama.nagano.jp
  6600. iizuna.nagano.jp
  6601. ikeda.nagano.jp
  6602. ikusaka.nagano.jp
  6603. ina.nagano.jp
  6604. karuizawa.nagano.jp
  6605. kawakami.nagano.jp
  6606. kiso.nagano.jp
  6607. kisofukushima.nagano.jp
  6608. kitaaiki.nagano.jp
  6609. komagane.nagano.jp
  6610. komoro.nagano.jp
  6611. matsukawa.nagano.jp
  6612. matsumoto.nagano.jp
  6613. miasa.nagano.jp
  6614. minamiaiki.nagano.jp
  6615. minamimaki.nagano.jp
  6616. minamiminowa.nagano.jp
  6617. minowa.nagano.jp
  6618. miyada.nagano.jp
  6619. miyota.nagano.jp
  6620. mochizuki.nagano.jp
  6621. nagano.nagano.jp
  6622. nagawa.nagano.jp
  6623. nagiso.nagano.jp
  6624. nakagawa.nagano.jp
  6625. nakano.nagano.jp
  6626. nozawaonsen.nagano.jp
  6627. obuse.nagano.jp
  6628. ogawa.nagano.jp
  6629. okaya.nagano.jp
  6630. omachi.nagano.jp
  6631. omi.nagano.jp
  6632. ookuwa.nagano.jp
  6633. ooshika.nagano.jp
  6634. otaki.nagano.jp
  6635. otari.nagano.jp
  6636. sakae.nagano.jp
  6637. sakaki.nagano.jp
  6638. saku.nagano.jp
  6639. sakuho.nagano.jp
  6640. shimosuwa.nagano.jp
  6641. shinanomachi.nagano.jp
  6642. shiojiri.nagano.jp
  6643. suwa.nagano.jp
  6644. suzaka.nagano.jp
  6645. takagi.nagano.jp
  6646. takamori.nagano.jp
  6647. takayama.nagano.jp
  6648. tateshina.nagano.jp
  6649. tatsuno.nagano.jp
  6650. togakushi.nagano.jp
  6651. togura.nagano.jp
  6652. tomi.nagano.jp
  6653. ueda.nagano.jp
  6654. wada.nagano.jp
  6655. yamagata.nagano.jp
  6656. yamanouchi.nagano.jp
  6657. yasaka.nagano.jp
  6658. yasuoka.nagano.jp
  6659. chijiwa.nagasaki.jp
  6660. futsu.nagasaki.jp
  6661. goto.nagasaki.jp
  6662. hasami.nagasaki.jp
  6663. hirado.nagasaki.jp
  6664. iki.nagasaki.jp
  6665. isahaya.nagasaki.jp
  6666. kawatana.nagasaki.jp
  6667. kuchinotsu.nagasaki.jp
  6668. matsuura.nagasaki.jp
  6669. nagasaki.nagasaki.jp
  6670. obama.nagasaki.jp
  6671. omura.nagasaki.jp
  6672. oseto.nagasaki.jp
  6673. saikai.nagasaki.jp
  6674. sasebo.nagasaki.jp
  6675. seihi.nagasaki.jp
  6676. shimabara.nagasaki.jp
  6677. shinkamigoto.nagasaki.jp
  6678. togitsu.nagasaki.jp
  6679. tsushima.nagasaki.jp
  6680. unzen.nagasaki.jp
  6681. ando.nara.jp
  6682. gose.nara.jp
  6683. heguri.nara.jp
  6684. higashiyoshino.nara.jp
  6685. ikaruga.nara.jp
  6686. ikoma.nara.jp
  6687. kamikitayama.nara.jp
  6688. kanmaki.nara.jp
  6689. kashiba.nara.jp
  6690. kashihara.nara.jp
  6691. katsuragi.nara.jp
  6692. kawai.nara.jp
  6693. kawakami.nara.jp
  6694. kawanishi.nara.jp
  6695. koryo.nara.jp
  6696. kurotaki.nara.jp
  6697. mitsue.nara.jp
  6698. miyake.nara.jp
  6699. nara.nara.jp
  6700. nosegawa.nara.jp
  6701. oji.nara.jp
  6702. ouda.nara.jp
  6703. oyodo.nara.jp
  6704. sakurai.nara.jp
  6705. sango.nara.jp
  6706. shimoichi.nara.jp
  6707. shimokitayama.nara.jp
  6708. shinjo.nara.jp
  6709. soni.nara.jp
  6710. takatori.nara.jp
  6711. tawaramoto.nara.jp
  6712. tenkawa.nara.jp
  6713. tenri.nara.jp
  6714. uda.nara.jp
  6715. yamatokoriyama.nara.jp
  6716. yamatotakada.nara.jp
  6717. yamazoe.nara.jp
  6718. yoshino.nara.jp
  6719. aga.niigata.jp
  6720. agano.niigata.jp
  6721. gosen.niigata.jp
  6722. itoigawa.niigata.jp
  6723. izumozaki.niigata.jp
  6724. joetsu.niigata.jp
  6725. kamo.niigata.jp
  6726. kariwa.niigata.jp
  6727. kashiwazaki.niigata.jp
  6728. minamiuonuma.niigata.jp
  6729. mitsuke.niigata.jp
  6730. muika.niigata.jp
  6731. murakami.niigata.jp
  6732. myoko.niigata.jp
  6733. nagaoka.niigata.jp
  6734. niigata.niigata.jp
  6735. ojiya.niigata.jp
  6736. omi.niigata.jp
  6737. sado.niigata.jp
  6738. sanjo.niigata.jp
  6739. seiro.niigata.jp
  6740. seirou.niigata.jp
  6741. sekikawa.niigata.jp
  6742. shibata.niigata.jp
  6743. tagami.niigata.jp
  6744. tainai.niigata.jp
  6745. tochio.niigata.jp
  6746. tokamachi.niigata.jp
  6747. tsubame.niigata.jp
  6748. tsunan.niigata.jp
  6749. uonuma.niigata.jp
  6750. yahiko.niigata.jp
  6751. yoita.niigata.jp
  6752. yuzawa.niigata.jp
  6753. beppu.oita.jp
  6754. bungoono.oita.jp
  6755. bungotakada.oita.jp
  6756. hasama.oita.jp
  6757. hiji.oita.jp
  6758. himeshima.oita.jp
  6759. hita.oita.jp
  6760. kamitsue.oita.jp
  6761. kokonoe.oita.jp
  6762. kuju.oita.jp
  6763. kunisaki.oita.jp
  6764. kusu.oita.jp
  6765. oita.oita.jp
  6766. saiki.oita.jp
  6767. taketa.oita.jp
  6768. tsukumi.oita.jp
  6769. usa.oita.jp
  6770. usuki.oita.jp
  6771. yufu.oita.jp
  6772. akaiwa.okayama.jp
  6773. asakuchi.okayama.jp
  6774. bizen.okayama.jp
  6775. hayashima.okayama.jp
  6776. ibara.okayama.jp
  6777. kagamino.okayama.jp
  6778. kasaoka.okayama.jp
  6779. kibichuo.okayama.jp
  6780. kumenan.okayama.jp
  6781. kurashiki.okayama.jp
  6782. maniwa.okayama.jp
  6783. misaki.okayama.jp
  6784. nagi.okayama.jp
  6785. niimi.okayama.jp
  6786. nishiawakura.okayama.jp
  6787. okayama.okayama.jp
  6788. satosho.okayama.jp
  6789. setouchi.okayama.jp
  6790. shinjo.okayama.jp
  6791. shoo.okayama.jp
  6792. soja.okayama.jp
  6793. takahashi.okayama.jp
  6794. tamano.okayama.jp
  6795. tsuyama.okayama.jp
  6796. wake.okayama.jp
  6797. yakage.okayama.jp
  6798. aguni.okinawa.jp
  6799. ginowan.okinawa.jp
  6800. ginoza.okinawa.jp
  6801. gushikami.okinawa.jp
  6802. haebaru.okinawa.jp
  6803. higashi.okinawa.jp
  6804. hirara.okinawa.jp
  6805. iheya.okinawa.jp
  6806. ishigaki.okinawa.jp
  6807. ishikawa.okinawa.jp
  6808. itoman.okinawa.jp
  6809. izena.okinawa.jp
  6810. kadena.okinawa.jp
  6811. kin.okinawa.jp
  6812. kitadaito.okinawa.jp
  6813. kitanakagusuku.okinawa.jp
  6814. kumejima.okinawa.jp
  6815. kunigami.okinawa.jp
  6816. minamidaito.okinawa.jp
  6817. motobu.okinawa.jp
  6818. nago.okinawa.jp
  6819. naha.okinawa.jp
  6820. nakagusuku.okinawa.jp
  6821. nakijin.okinawa.jp
  6822. nanjo.okinawa.jp
  6823. nishihara.okinawa.jp
  6824. ogimi.okinawa.jp
  6825. okinawa.okinawa.jp
  6826. onna.okinawa.jp
  6827. shimoji.okinawa.jp
  6828. taketomi.okinawa.jp
  6829. tarama.okinawa.jp
  6830. tokashiki.okinawa.jp
  6831. tomigusuku.okinawa.jp
  6832. tonaki.okinawa.jp
  6833. urasoe.okinawa.jp
  6834. uruma.okinawa.jp
  6835. yaese.okinawa.jp
  6836. yomitan.okinawa.jp
  6837. yonabaru.okinawa.jp
  6838. yonaguni.okinawa.jp
  6839. zamami.okinawa.jp
  6840. abeno.osaka.jp
  6841. chihayaakasaka.osaka.jp
  6842. chuo.osaka.jp
  6843. daito.osaka.jp
  6844. fujiidera.osaka.jp
  6845. habikino.osaka.jp
  6846. hannan.osaka.jp
  6847. higashiosaka.osaka.jp
  6848. higashisumiyoshi.osaka.jp
  6849. higashiyodogawa.osaka.jp
  6850. hirakata.osaka.jp
  6851. ibaraki.osaka.jp
  6852. ikeda.osaka.jp
  6853. izumi.osaka.jp
  6854. izumiotsu.osaka.jp
  6855. izumisano.osaka.jp
  6856. kadoma.osaka.jp
  6857. kaizuka.osaka.jp
  6858. kanan.osaka.jp
  6859. kashiwara.osaka.jp
  6860. katano.osaka.jp
  6861. kawachinagano.osaka.jp
  6862. kishiwada.osaka.jp
  6863. kita.osaka.jp
  6864. kumatori.osaka.jp
  6865. matsubara.osaka.jp
  6866. minato.osaka.jp
  6867. minoh.osaka.jp
  6868. misaki.osaka.jp
  6869. moriguchi.osaka.jp
  6870. neyagawa.osaka.jp
  6871. nishi.osaka.jp
  6872. nose.osaka.jp
  6873. osakasayama.osaka.jp
  6874. sakai.osaka.jp
  6875. sayama.osaka.jp
  6876. sennan.osaka.jp
  6877. settsu.osaka.jp
  6878. shijonawate.osaka.jp
  6879. shimamoto.osaka.jp
  6880. suita.osaka.jp
  6881. tadaoka.osaka.jp
  6882. taishi.osaka.jp
  6883. tajiri.osaka.jp
  6884. takaishi.osaka.jp
  6885. takatsuki.osaka.jp
  6886. tondabayashi.osaka.jp
  6887. toyonaka.osaka.jp
  6888. toyono.osaka.jp
  6889. yao.osaka.jp
  6890. ariake.saga.jp
  6891. arita.saga.jp
  6892. fukudomi.saga.jp
  6893. genkai.saga.jp
  6894. hamatama.saga.jp
  6895. hizen.saga.jp
  6896. imari.saga.jp
  6897. kamimine.saga.jp
  6898. kanzaki.saga.jp
  6899. karatsu.saga.jp
  6900. kashima.saga.jp
  6901. kitagata.saga.jp
  6902. kitahata.saga.jp
  6903. kiyama.saga.jp
  6904. kouhoku.saga.jp
  6905. kyuragi.saga.jp
  6906. nishiarita.saga.jp
  6907. ogi.saga.jp
  6908. omachi.saga.jp
  6909. ouchi.saga.jp
  6910. saga.saga.jp
  6911. shiroishi.saga.jp
  6912. taku.saga.jp
  6913. tara.saga.jp
  6914. tosu.saga.jp
  6915. yoshinogari.saga.jp
  6916. arakawa.saitama.jp
  6917. asaka.saitama.jp
  6918. chichibu.saitama.jp
  6919. fujimi.saitama.jp
  6920. fujimino.saitama.jp
  6921. fukaya.saitama.jp
  6922. hanno.saitama.jp
  6923. hanyu.saitama.jp
  6924. hasuda.saitama.jp
  6925. hatogaya.saitama.jp
  6926. hatoyama.saitama.jp
  6927. hidaka.saitama.jp
  6928. higashichichibu.saitama.jp
  6929. higashimatsuyama.saitama.jp
  6930. honjo.saitama.jp
  6931. ina.saitama.jp
  6932. iruma.saitama.jp
  6933. iwatsuki.saitama.jp
  6934. kamiizumi.saitama.jp
  6935. kamikawa.saitama.jp
  6936. kamisato.saitama.jp
  6937. kasukabe.saitama.jp
  6938. kawagoe.saitama.jp
  6939. kawaguchi.saitama.jp
  6940. kawajima.saitama.jp
  6941. kazo.saitama.jp
  6942. kitamoto.saitama.jp
  6943. koshigaya.saitama.jp
  6944. kounosu.saitama.jp
  6945. kuki.saitama.jp
  6946. kumagaya.saitama.jp
  6947. matsubushi.saitama.jp
  6948. minano.saitama.jp
  6949. misato.saitama.jp
  6950. miyashiro.saitama.jp
  6951. miyoshi.saitama.jp
  6952. moroyama.saitama.jp
  6953. nagatoro.saitama.jp
  6954. namegawa.saitama.jp
  6955. niiza.saitama.jp
  6956. ogano.saitama.jp
  6957. ogawa.saitama.jp
  6958. ogose.saitama.jp
  6959. okegawa.saitama.jp
  6960. omiya.saitama.jp
  6961. otaki.saitama.jp
  6962. ranzan.saitama.jp
  6963. ryokami.saitama.jp
  6964. saitama.saitama.jp
  6965. sakado.saitama.jp
  6966. satte.saitama.jp
  6967. sayama.saitama.jp
  6968. shiki.saitama.jp
  6969. shiraoka.saitama.jp
  6970. soka.saitama.jp
  6971. sugito.saitama.jp
  6972. toda.saitama.jp
  6973. tokigawa.saitama.jp
  6974. tokorozawa.saitama.jp
  6975. tsurugashima.saitama.jp
  6976. urawa.saitama.jp
  6977. warabi.saitama.jp
  6978. yashio.saitama.jp
  6979. yokoze.saitama.jp
  6980. yono.saitama.jp
  6981. yorii.saitama.jp
  6982. yoshida.saitama.jp
  6983. yoshikawa.saitama.jp
  6984. yoshimi.saitama.jp
  6985. aisho.shiga.jp
  6986. gamo.shiga.jp
  6987. higashiomi.shiga.jp
  6988. hikone.shiga.jp
  6989. koka.shiga.jp
  6990. konan.shiga.jp
  6991. kosei.shiga.jp
  6992. koto.shiga.jp
  6993. kusatsu.shiga.jp
  6994. maibara.shiga.jp
  6995. moriyama.shiga.jp
  6996. nagahama.shiga.jp
  6997. nishiazai.shiga.jp
  6998. notogawa.shiga.jp
  6999. omihachiman.shiga.jp
  7000. otsu.shiga.jp
  7001. ritto.shiga.jp
  7002. ryuoh.shiga.jp
  7003. takashima.shiga.jp
  7004. takatsuki.shiga.jp
  7005. torahime.shiga.jp
  7006. toyosato.shiga.jp
  7007. yasu.shiga.jp
  7008. akagi.shimane.jp
  7009. ama.shimane.jp
  7010. gotsu.shimane.jp
  7011. hamada.shimane.jp
  7012. higashiizumo.shimane.jp
  7013. hikawa.shimane.jp
  7014. hikimi.shimane.jp
  7015. izumo.shimane.jp
  7016. kakinoki.shimane.jp
  7017. masuda.shimane.jp
  7018. matsue.shimane.jp
  7019. misato.shimane.jp
  7020. nishinoshima.shimane.jp
  7021. ohda.shimane.jp
  7022. okinoshima.shimane.jp
  7023. okuizumo.shimane.jp
  7024. shimane.shimane.jp
  7025. tamayu.shimane.jp
  7026. tsuwano.shimane.jp
  7027. unnan.shimane.jp
  7028. yakumo.shimane.jp
  7029. yasugi.shimane.jp
  7030. yatsuka.shimane.jp
  7031. arai.shizuoka.jp
  7032. atami.shizuoka.jp
  7033. fuji.shizuoka.jp
  7034. fujieda.shizuoka.jp
  7035. fujikawa.shizuoka.jp
  7036. fujinomiya.shizuoka.jp
  7037. fukuroi.shizuoka.jp
  7038. gotemba.shizuoka.jp
  7039. haibara.shizuoka.jp
  7040. hamamatsu.shizuoka.jp
  7041. higashiizu.shizuoka.jp
  7042. ito.shizuoka.jp
  7043. iwata.shizuoka.jp
  7044. izu.shizuoka.jp
  7045. izunokuni.shizuoka.jp
  7046. kakegawa.shizuoka.jp
  7047. kannami.shizuoka.jp
  7048. kawanehon.shizuoka.jp
  7049. kawazu.shizuoka.jp
  7050. kikugawa.shizuoka.jp
  7051. kosai.shizuoka.jp
  7052. makinohara.shizuoka.jp
  7053. matsuzaki.shizuoka.jp
  7054. minamiizu.shizuoka.jp
  7055. mishima.shizuoka.jp
  7056. morimachi.shizuoka.jp
  7057. nishiizu.shizuoka.jp
  7058. numazu.shizuoka.jp
  7059. omaezaki.shizuoka.jp
  7060. shimada.shizuoka.jp
  7061. shimizu.shizuoka.jp
  7062. shimoda.shizuoka.jp
  7063. shizuoka.shizuoka.jp
  7064. susono.shizuoka.jp
  7065. yaizu.shizuoka.jp
  7066. yoshida.shizuoka.jp
  7067. ashikaga.tochigi.jp
  7068. bato.tochigi.jp
  7069. haga.tochigi.jp
  7070. ichikai.tochigi.jp
  7071. iwafune.tochigi.jp
  7072. kaminokawa.tochigi.jp
  7073. kanuma.tochigi.jp
  7074. karasuyama.tochigi.jp
  7075. kuroiso.tochigi.jp
  7076. mashiko.tochigi.jp
  7077. mibu.tochigi.jp
  7078. moka.tochigi.jp
  7079. motegi.tochigi.jp
  7080. nasu.tochigi.jp
  7081. nasushiobara.tochigi.jp
  7082. nikko.tochigi.jp
  7083. nishikata.tochigi.jp
  7084. nogi.tochigi.jp
  7085. ohira.tochigi.jp
  7086. ohtawara.tochigi.jp
  7087. oyama.tochigi.jp
  7088. sakura.tochigi.jp
  7089. sano.tochigi.jp
  7090. shimotsuke.tochigi.jp
  7091. shioya.tochigi.jp
  7092. takanezawa.tochigi.jp
  7093. tochigi.tochigi.jp
  7094. tsuga.tochigi.jp
  7095. ujiie.tochigi.jp
  7096. utsunomiya.tochigi.jp
  7097. yaita.tochigi.jp
  7098. aizumi.tokushima.jp
  7099. anan.tokushima.jp
  7100. ichiba.tokushima.jp
  7101. itano.tokushima.jp
  7102. kainan.tokushima.jp
  7103. komatsushima.tokushima.jp
  7104. matsushige.tokushima.jp
  7105. mima.tokushima.jp
  7106. minami.tokushima.jp
  7107. miyoshi.tokushima.jp
  7108. mugi.tokushima.jp
  7109. nakagawa.tokushima.jp
  7110. naruto.tokushima.jp
  7111. sanagochi.tokushima.jp
  7112. shishikui.tokushima.jp
  7113. tokushima.tokushima.jp
  7114. wajiki.tokushima.jp
  7115. adachi.tokyo.jp
  7116. akiruno.tokyo.jp
  7117. akishima.tokyo.jp
  7118. aogashima.tokyo.jp
  7119. arakawa.tokyo.jp
  7120. bunkyo.tokyo.jp
  7121. chiyoda.tokyo.jp
  7122. chofu.tokyo.jp
  7123. chuo.tokyo.jp
  7124. edogawa.tokyo.jp
  7125. fuchu.tokyo.jp
  7126. fussa.tokyo.jp
  7127. hachijo.tokyo.jp
  7128. hachioji.tokyo.jp
  7129. hamura.tokyo.jp
  7130. higashikurume.tokyo.jp
  7131. higashimurayama.tokyo.jp
  7132. higashiyamato.tokyo.jp
  7133. hino.tokyo.jp
  7134. hinode.tokyo.jp
  7135. hinohara.tokyo.jp
  7136. inagi.tokyo.jp
  7137. itabashi.tokyo.jp
  7138. katsushika.tokyo.jp
  7139. kita.tokyo.jp
  7140. kiyose.tokyo.jp
  7141. kodaira.tokyo.jp
  7142. koganei.tokyo.jp
  7143. kokubunji.tokyo.jp
  7144. komae.tokyo.jp
  7145. koto.tokyo.jp
  7146. kouzushima.tokyo.jp
  7147. kunitachi.tokyo.jp
  7148. machida.tokyo.jp
  7149. meguro.tokyo.jp
  7150. minato.tokyo.jp
  7151. mitaka.tokyo.jp
  7152. mizuho.tokyo.jp
  7153. musashimurayama.tokyo.jp
  7154. musashino.tokyo.jp
  7155. nakano.tokyo.jp
  7156. nerima.tokyo.jp
  7157. ogasawara.tokyo.jp
  7158. okutama.tokyo.jp
  7159. ome.tokyo.jp
  7160. oshima.tokyo.jp
  7161. ota.tokyo.jp
  7162. setagaya.tokyo.jp
  7163. shibuya.tokyo.jp
  7164. shinagawa.tokyo.jp
  7165. shinjuku.tokyo.jp
  7166. suginami.tokyo.jp
  7167. sumida.tokyo.jp
  7168. tachikawa.tokyo.jp
  7169. taito.tokyo.jp
  7170. tama.tokyo.jp
  7171. toshima.tokyo.jp
  7172. chizu.tottori.jp
  7173. hino.tottori.jp
  7174. kawahara.tottori.jp
  7175. koge.tottori.jp
  7176. kotoura.tottori.jp
  7177. misasa.tottori.jp
  7178. nanbu.tottori.jp
  7179. nichinan.tottori.jp
  7180. sakaiminato.tottori.jp
  7181. tottori.tottori.jp
  7182. wakasa.tottori.jp
  7183. yazu.tottori.jp
  7184. yonago.tottori.jp
  7185. asahi.toyama.jp
  7186. fuchu.toyama.jp
  7187. fukumitsu.toyama.jp
  7188. funahashi.toyama.jp
  7189. himi.toyama.jp
  7190. imizu.toyama.jp
  7191. inami.toyama.jp
  7192. johana.toyama.jp
  7193. kamiichi.toyama.jp
  7194. kurobe.toyama.jp
  7195. nakaniikawa.toyama.jp
  7196. namerikawa.toyama.jp
  7197. nanto.toyama.jp
  7198. nyuzen.toyama.jp
  7199. oyabe.toyama.jp
  7200. taira.toyama.jp
  7201. takaoka.toyama.jp
  7202. tateyama.toyama.jp
  7203. toga.toyama.jp
  7204. tonami.toyama.jp
  7205. toyama.toyama.jp
  7206. unazuki.toyama.jp
  7207. uozu.toyama.jp
  7208. yamada.toyama.jp
  7209. arida.wakayama.jp
  7210. aridagawa.wakayama.jp
  7211. gobo.wakayama.jp
  7212. hashimoto.wakayama.jp
  7213. hidaka.wakayama.jp
  7214. hirogawa.wakayama.jp
  7215. inami.wakayama.jp
  7216. iwade.wakayama.jp
  7217. kainan.wakayama.jp
  7218. kamitonda.wakayama.jp
  7219. katsuragi.wakayama.jp
  7220. kimino.wakayama.jp
  7221. kinokawa.wakayama.jp
  7222. kitayama.wakayama.jp
  7223. koya.wakayama.jp
  7224. koza.wakayama.jp
  7225. kozagawa.wakayama.jp
  7226. kudoyama.wakayama.jp
  7227. kushimoto.wakayama.jp
  7228. mihama.wakayama.jp
  7229. misato.wakayama.jp
  7230. nachikatsuura.wakayama.jp
  7231. shingu.wakayama.jp
  7232. shirahama.wakayama.jp
  7233. taiji.wakayama.jp
  7234. tanabe.wakayama.jp
  7235. wakayama.wakayama.jp
  7236. yuasa.wakayama.jp
  7237. yura.wakayama.jp
  7238. asahi.yamagata.jp
  7239. funagata.yamagata.jp
  7240. higashine.yamagata.jp
  7241. iide.yamagata.jp
  7242. kahoku.yamagata.jp
  7243. kaminoyama.yamagata.jp
  7244. kaneyama.yamagata.jp
  7245. kawanishi.yamagata.jp
  7246. mamurogawa.yamagata.jp
  7247. mikawa.yamagata.jp
  7248. murayama.yamagata.jp
  7249. nagai.yamagata.jp
  7250. nakayama.yamagata.jp
  7251. nanyo.yamagata.jp
  7252. nishikawa.yamagata.jp
  7253. obanazawa.yamagata.jp
  7254. oe.yamagata.jp
  7255. oguni.yamagata.jp
  7256. ohkura.yamagata.jp
  7257. oishida.yamagata.jp
  7258. sagae.yamagata.jp
  7259. sakata.yamagata.jp
  7260. sakegawa.yamagata.jp
  7261. shinjo.yamagata.jp
  7262. shirataka.yamagata.jp
  7263. shonai.yamagata.jp
  7264. takahata.yamagata.jp
  7265. tendo.yamagata.jp
  7266. tozawa.yamagata.jp
  7267. tsuruoka.yamagata.jp
  7268. yamagata.yamagata.jp
  7269. yamanobe.yamagata.jp
  7270. yonezawa.yamagata.jp
  7271. yuza.yamagata.jp
  7272. abu.yamaguchi.jp
  7273. hagi.yamaguchi.jp
  7274. hikari.yamaguchi.jp
  7275. hofu.yamaguchi.jp
  7276. iwakuni.yamaguchi.jp
  7277. kudamatsu.yamaguchi.jp
  7278. mitou.yamaguchi.jp
  7279. nagato.yamaguchi.jp
  7280. oshima.yamaguchi.jp
  7281. shimonoseki.yamaguchi.jp
  7282. shunan.yamaguchi.jp
  7283. tabuse.yamaguchi.jp
  7284. tokuyama.yamaguchi.jp
  7285. toyota.yamaguchi.jp
  7286. ube.yamaguchi.jp
  7287. yuu.yamaguchi.jp
  7288. chuo.yamanashi.jp
  7289. doshi.yamanashi.jp
  7290. fuefuki.yamanashi.jp
  7291. fujikawa.yamanashi.jp
  7292. fujikawaguchiko.yamanashi.jp
  7293. fujiyoshida.yamanashi.jp
  7294. hayakawa.yamanashi.jp
  7295. hokuto.yamanashi.jp
  7296. ichikawamisato.yamanashi.jp
  7297. kai.yamanashi.jp
  7298. kofu.yamanashi.jp
  7299. koshu.yamanashi.jp
  7300. kosuge.yamanashi.jp
  7301. minami-alps.yamanashi.jp
  7302. minobu.yamanashi.jp
  7303. nakamichi.yamanashi.jp
  7304. nanbu.yamanashi.jp
  7305. narusawa.yamanashi.jp
  7306. nirasaki.yamanashi.jp
  7307. nishikatsura.yamanashi.jp
  7308. oshino.yamanashi.jp
  7309. otsuki.yamanashi.jp
  7310. showa.yamanashi.jp
  7311. tabayama.yamanashi.jp
  7312. tsuru.yamanashi.jp
  7313. uenohara.yamanashi.jp
  7314. yamanakako.yamanashi.jp
  7315. yamanashi.yamanashi.jp
  7316. // ke : http://www.kenic.or.ke/index.php/en/ke-domains/ke-domains
  7317. ke
  7318. ac.ke
  7319. co.ke
  7320. go.ke
  7321. info.ke
  7322. me.ke
  7323. mobi.ke
  7324. ne.ke
  7325. or.ke
  7326. sc.ke
  7327. // kg : http://www.domain.kg/dmn_n.html
  7328. kg
  7329. org.kg
  7330. net.kg
  7331. com.kg
  7332. edu.kg
  7333. gov.kg
  7334. mil.kg
  7335. // kh : http://www.mptc.gov.kh/dns_registration.htm
  7336. *.kh
  7337. // ki : http://www.ki/dns/index.html
  7338. ki
  7339. edu.ki
  7340. biz.ki
  7341. net.ki
  7342. org.ki
  7343. gov.ki
  7344. info.ki
  7345. com.ki
  7346. // km : https://en.wikipedia.org/wiki/.km
  7347. // http://www.domaine.km/documents/charte.doc
  7348. km
  7349. org.km
  7350. nom.km
  7351. gov.km
  7352. prd.km
  7353. tm.km
  7354. edu.km
  7355. mil.km
  7356. ass.km
  7357. com.km
  7358. // These are only mentioned as proposed suggestions at domaine.km, but
  7359. // https://en.wikipedia.org/wiki/.km says they're available for registration:
  7360. coop.km
  7361. asso.km
  7362. presse.km
  7363. medecin.km
  7364. notaires.km
  7365. pharmaciens.km
  7366. veterinaire.km
  7367. gouv.km
  7368. // kn : https://en.wikipedia.org/wiki/.kn
  7369. // http://www.dot.kn/domainRules.html
  7370. kn
  7371. net.kn
  7372. org.kn
  7373. edu.kn
  7374. gov.kn
  7375. // kp : http://www.kcce.kp/en_index.php
  7376. kp
  7377. com.kp
  7378. edu.kp
  7379. gov.kp
  7380. org.kp
  7381. rep.kp
  7382. tra.kp
  7383. // kr : https://en.wikipedia.org/wiki/.kr
  7384. // see also: http://domain.nida.or.kr/eng/registration.jsp
  7385. kr
  7386. ac.kr
  7387. co.kr
  7388. es.kr
  7389. go.kr
  7390. hs.kr
  7391. kg.kr
  7392. mil.kr
  7393. ms.kr
  7394. ne.kr
  7395. or.kr
  7396. pe.kr
  7397. re.kr
  7398. sc.kr
  7399. // kr geographical names
  7400. busan.kr
  7401. chungbuk.kr
  7402. chungnam.kr
  7403. daegu.kr
  7404. daejeon.kr
  7405. gangwon.kr
  7406. gwangju.kr
  7407. gyeongbuk.kr
  7408. gyeonggi.kr
  7409. gyeongnam.kr
  7410. incheon.kr
  7411. jeju.kr
  7412. jeonbuk.kr
  7413. jeonnam.kr
  7414. seoul.kr
  7415. ulsan.kr
  7416. // kw : https://www.nic.kw/policies/
  7417. // Confirmed by registry <nic.tech@citra.gov.kw>
  7418. kw
  7419. com.kw
  7420. edu.kw
  7421. emb.kw
  7422. gov.kw
  7423. ind.kw
  7424. net.kw
  7425. org.kw
  7426. // ky : http://www.icta.ky/da_ky_reg_dom.php
  7427. // Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17
  7428. ky
  7429. com.ky
  7430. edu.ky
  7431. net.ky
  7432. org.ky
  7433. // kz : https://en.wikipedia.org/wiki/.kz
  7434. // see also: http://www.nic.kz/rules/index.jsp
  7435. kz
  7436. org.kz
  7437. edu.kz
  7438. net.kz
  7439. gov.kz
  7440. mil.kz
  7441. com.kz
  7442. // la : https://en.wikipedia.org/wiki/.la
  7443. // Submitted by registry <gavin.brown@nic.la>
  7444. la
  7445. int.la
  7446. net.la
  7447. info.la
  7448. edu.la
  7449. gov.la
  7450. per.la
  7451. com.la
  7452. org.la
  7453. // lb : https://en.wikipedia.org/wiki/.lb
  7454. // Submitted by registry <randy@psg.com>
  7455. lb
  7456. com.lb
  7457. edu.lb
  7458. gov.lb
  7459. net.lb
  7460. org.lb
  7461. // lc : https://en.wikipedia.org/wiki/.lc
  7462. // see also: http://www.nic.lc/rules.htm
  7463. lc
  7464. com.lc
  7465. net.lc
  7466. co.lc
  7467. org.lc
  7468. edu.lc
  7469. gov.lc
  7470. // li : https://en.wikipedia.org/wiki/.li
  7471. li
  7472. // lk : https://www.nic.lk/index.php/domain-registration/lk-domain-naming-structure
  7473. lk
  7474. gov.lk
  7475. sch.lk
  7476. net.lk
  7477. int.lk
  7478. com.lk
  7479. org.lk
  7480. edu.lk
  7481. ngo.lk
  7482. soc.lk
  7483. web.lk
  7484. ltd.lk
  7485. assn.lk
  7486. grp.lk
  7487. hotel.lk
  7488. ac.lk
  7489. // lr : http://psg.com/dns/lr/lr.txt
  7490. // Submitted by registry <randy@psg.com>
  7491. lr
  7492. com.lr
  7493. edu.lr
  7494. gov.lr
  7495. org.lr
  7496. net.lr
  7497. // ls : http://www.nic.ls/
  7498. // Confirmed by registry <lsadmin@nic.ls>
  7499. ls
  7500. ac.ls
  7501. biz.ls
  7502. co.ls
  7503. edu.ls
  7504. gov.ls
  7505. info.ls
  7506. net.ls
  7507. org.ls
  7508. sc.ls
  7509. // lt : https://en.wikipedia.org/wiki/.lt
  7510. lt
  7511. // gov.lt : http://www.gov.lt/index_en.php
  7512. gov.lt
  7513. // lu : http://www.dns.lu/en/
  7514. lu
  7515. // lv : http://www.nic.lv/DNS/En/generic.php
  7516. lv
  7517. com.lv
  7518. edu.lv
  7519. gov.lv
  7520. org.lv
  7521. mil.lv
  7522. id.lv
  7523. net.lv
  7524. asn.lv
  7525. conf.lv
  7526. // ly : http://www.nic.ly/regulations.php
  7527. ly
  7528. com.ly
  7529. net.ly
  7530. gov.ly
  7531. plc.ly
  7532. edu.ly
  7533. sch.ly
  7534. med.ly
  7535. org.ly
  7536. id.ly
  7537. // ma : https://en.wikipedia.org/wiki/.ma
  7538. // http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf
  7539. ma
  7540. co.ma
  7541. net.ma
  7542. gov.ma
  7543. org.ma
  7544. ac.ma
  7545. press.ma
  7546. // mc : http://www.nic.mc/
  7547. mc
  7548. tm.mc
  7549. asso.mc
  7550. // md : https://en.wikipedia.org/wiki/.md
  7551. md
  7552. // me : https://en.wikipedia.org/wiki/.me
  7553. me
  7554. co.me
  7555. net.me
  7556. org.me
  7557. edu.me
  7558. ac.me
  7559. gov.me
  7560. its.me
  7561. priv.me
  7562. // mg : http://nic.mg/nicmg/?page_id=39
  7563. mg
  7564. org.mg
  7565. nom.mg
  7566. gov.mg
  7567. prd.mg
  7568. tm.mg
  7569. edu.mg
  7570. mil.mg
  7571. com.mg
  7572. co.mg
  7573. // mh : https://en.wikipedia.org/wiki/.mh
  7574. mh
  7575. // mil : https://en.wikipedia.org/wiki/.mil
  7576. mil
  7577. // mk : https://en.wikipedia.org/wiki/.mk
  7578. // see also: http://dns.marnet.net.mk/postapka.php
  7579. mk
  7580. com.mk
  7581. org.mk
  7582. net.mk
  7583. edu.mk
  7584. gov.mk
  7585. inf.mk
  7586. name.mk
  7587. // ml : http://www.gobin.info/domainname/ml-template.doc
  7588. // see also: https://en.wikipedia.org/wiki/.ml
  7589. ml
  7590. com.ml
  7591. edu.ml
  7592. gouv.ml
  7593. gov.ml
  7594. net.ml
  7595. org.ml
  7596. presse.ml
  7597. // mm : https://en.wikipedia.org/wiki/.mm
  7598. *.mm
  7599. // mn : https://en.wikipedia.org/wiki/.mn
  7600. mn
  7601. gov.mn
  7602. edu.mn
  7603. org.mn
  7604. // mo : http://www.monic.net.mo/
  7605. mo
  7606. com.mo
  7607. net.mo
  7608. org.mo
  7609. edu.mo
  7610. gov.mo
  7611. // mobi : https://en.wikipedia.org/wiki/.mobi
  7612. mobi
  7613. // mp : http://www.dot.mp/
  7614. // Confirmed by registry <dcamacho@saipan.com> 2008-06-17
  7615. mp
  7616. // mq : https://en.wikipedia.org/wiki/.mq
  7617. mq
  7618. // mr : https://en.wikipedia.org/wiki/.mr
  7619. mr
  7620. gov.mr
  7621. // ms : http://www.nic.ms/pdf/MS_Domain_Name_Rules.pdf
  7622. ms
  7623. com.ms
  7624. edu.ms
  7625. gov.ms
  7626. net.ms
  7627. org.ms
  7628. // mt : https://www.nic.org.mt/go/policy
  7629. // Submitted by registry <help@nic.org.mt>
  7630. mt
  7631. com.mt
  7632. edu.mt
  7633. net.mt
  7634. org.mt
  7635. // mu : https://en.wikipedia.org/wiki/.mu
  7636. mu
  7637. com.mu
  7638. net.mu
  7639. org.mu
  7640. gov.mu
  7641. ac.mu
  7642. co.mu
  7643. or.mu
  7644. // museum : https://welcome.museum/wp-content/uploads/2018/05/20180525-Registration-Policy-MUSEUM-EN_VF-2.pdf https://welcome.museum/buy-your-dot-museum-2/
  7645. museum
  7646. // mv : https://en.wikipedia.org/wiki/.mv
  7647. // "mv" included because, contra Wikipedia, google.mv exists.
  7648. mv
  7649. aero.mv
  7650. biz.mv
  7651. com.mv
  7652. coop.mv
  7653. edu.mv
  7654. gov.mv
  7655. info.mv
  7656. int.mv
  7657. mil.mv
  7658. museum.mv
  7659. name.mv
  7660. net.mv
  7661. org.mv
  7662. pro.mv
  7663. // mw : http://www.registrar.mw/
  7664. mw
  7665. ac.mw
  7666. biz.mw
  7667. co.mw
  7668. com.mw
  7669. coop.mw
  7670. edu.mw
  7671. gov.mw
  7672. int.mw
  7673. museum.mw
  7674. net.mw
  7675. org.mw
  7676. // mx : http://www.nic.mx/
  7677. // Submitted by registry <farias@nic.mx>
  7678. mx
  7679. com.mx
  7680. org.mx
  7681. gob.mx
  7682. edu.mx
  7683. net.mx
  7684. // my : http://www.mynic.my/
  7685. // Available strings: https://mynic.my/resources/domains/buying-a-domain/
  7686. my
  7687. biz.my
  7688. com.my
  7689. edu.my
  7690. gov.my
  7691. mil.my
  7692. name.my
  7693. net.my
  7694. org.my
  7695. // mz : http://www.uem.mz/
  7696. // Submitted by registry <antonio@uem.mz>
  7697. mz
  7698. ac.mz
  7699. adv.mz
  7700. co.mz
  7701. edu.mz
  7702. gov.mz
  7703. mil.mz
  7704. net.mz
  7705. org.mz
  7706. // na : http://www.na-nic.com.na/
  7707. // http://www.info.na/domain/
  7708. na
  7709. info.na
  7710. pro.na
  7711. name.na
  7712. school.na
  7713. or.na
  7714. dr.na
  7715. us.na
  7716. mx.na
  7717. ca.na
  7718. in.na
  7719. cc.na
  7720. tv.na
  7721. ws.na
  7722. mobi.na
  7723. co.na
  7724. com.na
  7725. org.na
  7726. // name : has 2nd-level tlds, but there's no list of them
  7727. name
  7728. // nc : http://www.cctld.nc/
  7729. nc
  7730. asso.nc
  7731. nom.nc
  7732. // ne : https://en.wikipedia.org/wiki/.ne
  7733. ne
  7734. // net : https://en.wikipedia.org/wiki/.net
  7735. net
  7736. // nf : https://en.wikipedia.org/wiki/.nf
  7737. nf
  7738. com.nf
  7739. net.nf
  7740. per.nf
  7741. rec.nf
  7742. web.nf
  7743. arts.nf
  7744. firm.nf
  7745. info.nf
  7746. other.nf
  7747. store.nf
  7748. // ng : http://www.nira.org.ng/index.php/join-us/register-ng-domain/189-nira-slds
  7749. ng
  7750. com.ng
  7751. edu.ng
  7752. gov.ng
  7753. i.ng
  7754. mil.ng
  7755. mobi.ng
  7756. name.ng
  7757. net.ng
  7758. org.ng
  7759. sch.ng
  7760. // ni : http://www.nic.ni/
  7761. ni
  7762. ac.ni
  7763. biz.ni
  7764. co.ni
  7765. com.ni
  7766. edu.ni
  7767. gob.ni
  7768. in.ni
  7769. info.ni
  7770. int.ni
  7771. mil.ni
  7772. net.ni
  7773. nom.ni
  7774. org.ni
  7775. web.ni
  7776. // nl : https://en.wikipedia.org/wiki/.nl
  7777. // https://www.sidn.nl/
  7778. // ccTLD for the Netherlands
  7779. nl
  7780. // no : https://www.norid.no/en/om-domenenavn/regelverk-for-no/
  7781. // Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/
  7782. // Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/
  7783. // Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/
  7784. // RSS feed: https://teknisk.norid.no/en/feed/
  7785. no
  7786. // Norid category second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-c/
  7787. fhs.no
  7788. vgs.no
  7789. fylkesbibl.no
  7790. folkebibl.no
  7791. museum.no
  7792. idrett.no
  7793. priv.no
  7794. // Norid category second-level domains managed by parties other than Norid : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-d/
  7795. mil.no
  7796. stat.no
  7797. dep.no
  7798. kommune.no
  7799. herad.no
  7800. // Norid geographical second level domains : https://www.norid.no/en/om-domenenavn/regelverk-for-no/vedlegg-b/
  7801. // counties
  7802. aa.no
  7803. ah.no
  7804. bu.no
  7805. fm.no
  7806. hl.no
  7807. hm.no
  7808. jan-mayen.no
  7809. mr.no
  7810. nl.no
  7811. nt.no
  7812. of.no
  7813. ol.no
  7814. oslo.no
  7815. rl.no
  7816. sf.no
  7817. st.no
  7818. svalbard.no
  7819. tm.no
  7820. tr.no
  7821. va.no
  7822. vf.no
  7823. // primary and lower secondary schools per county
  7824. gs.aa.no
  7825. gs.ah.no
  7826. gs.bu.no
  7827. gs.fm.no
  7828. gs.hl.no
  7829. gs.hm.no
  7830. gs.jan-mayen.no
  7831. gs.mr.no
  7832. gs.nl.no
  7833. gs.nt.no
  7834. gs.of.no
  7835. gs.ol.no
  7836. gs.oslo.no
  7837. gs.rl.no
  7838. gs.sf.no
  7839. gs.st.no
  7840. gs.svalbard.no
  7841. gs.tm.no
  7842. gs.tr.no
  7843. gs.va.no
  7844. gs.vf.no
  7845. // cities
  7846. akrehamn.no
  7847. åkrehamn.no
  7848. algard.no
  7849. ålgård.no
  7850. arna.no
  7851. brumunddal.no
  7852. bryne.no
  7853. bronnoysund.no
  7854. brønnøysund.no
  7855. drobak.no
  7856. drøbak.no
  7857. egersund.no
  7858. fetsund.no
  7859. floro.no
  7860. florø.no
  7861. fredrikstad.no
  7862. hokksund.no
  7863. honefoss.no
  7864. hønefoss.no
  7865. jessheim.no
  7866. jorpeland.no
  7867. jørpeland.no
  7868. kirkenes.no
  7869. kopervik.no
  7870. krokstadelva.no
  7871. langevag.no
  7872. langevåg.no
  7873. leirvik.no
  7874. mjondalen.no
  7875. mjøndalen.no
  7876. mo-i-rana.no
  7877. mosjoen.no
  7878. mosjøen.no
  7879. nesoddtangen.no
  7880. orkanger.no
  7881. osoyro.no
  7882. osøyro.no
  7883. raholt.no
  7884. råholt.no
  7885. sandnessjoen.no
  7886. sandnessjøen.no
  7887. skedsmokorset.no
  7888. slattum.no
  7889. spjelkavik.no
  7890. stathelle.no
  7891. stavern.no
  7892. stjordalshalsen.no
  7893. stjørdalshalsen.no
  7894. tananger.no
  7895. tranby.no
  7896. vossevangen.no
  7897. // communities
  7898. afjord.no
  7899. åfjord.no
  7900. agdenes.no
  7901. al.no
  7902. ål.no
  7903. alesund.no
  7904. ålesund.no
  7905. alstahaug.no
  7906. alta.no
  7907. áltá.no
  7908. alaheadju.no
  7909. álaheadju.no
  7910. alvdal.no
  7911. amli.no
  7912. åmli.no
  7913. amot.no
  7914. åmot.no
  7915. andebu.no
  7916. andoy.no
  7917. andøy.no
  7918. andasuolo.no
  7919. ardal.no
  7920. årdal.no
  7921. aremark.no
  7922. arendal.no
  7923. ås.no
  7924. aseral.no
  7925. åseral.no
  7926. asker.no
  7927. askim.no
  7928. askvoll.no
  7929. askoy.no
  7930. askøy.no
  7931. asnes.no
  7932. åsnes.no
  7933. audnedaln.no
  7934. aukra.no
  7935. aure.no
  7936. aurland.no
  7937. aurskog-holand.no
  7938. aurskog-høland.no
  7939. austevoll.no
  7940. austrheim.no
  7941. averoy.no
  7942. averøy.no
  7943. balestrand.no
  7944. ballangen.no
  7945. balat.no
  7946. bálát.no
  7947. balsfjord.no
  7948. bahccavuotna.no
  7949. báhccavuotna.no
  7950. bamble.no
  7951. bardu.no
  7952. beardu.no
  7953. beiarn.no
  7954. bajddar.no
  7955. bájddar.no
  7956. baidar.no
  7957. báidár.no
  7958. berg.no
  7959. bergen.no
  7960. berlevag.no
  7961. berlevåg.no
  7962. bearalvahki.no
  7963. bearalváhki.no
  7964. bindal.no
  7965. birkenes.no
  7966. bjarkoy.no
  7967. bjarkøy.no
  7968. bjerkreim.no
  7969. bjugn.no
  7970. bodo.no
  7971. bodø.no
  7972. badaddja.no
  7973. bådåddjå.no
  7974. budejju.no
  7975. bokn.no
  7976. bremanger.no
  7977. bronnoy.no
  7978. brønnøy.no
  7979. bygland.no
  7980. bykle.no
  7981. barum.no
  7982. bærum.no
  7983. bo.telemark.no
  7984. bø.telemark.no
  7985. bo.nordland.no
  7986. bø.nordland.no
  7987. bievat.no
  7988. bievát.no
  7989. bomlo.no
  7990. bømlo.no
  7991. batsfjord.no
  7992. båtsfjord.no
  7993. bahcavuotna.no
  7994. báhcavuotna.no
  7995. dovre.no
  7996. drammen.no
  7997. drangedal.no
  7998. dyroy.no
  7999. dyrøy.no
  8000. donna.no
  8001. dønna.no
  8002. eid.no
  8003. eidfjord.no
  8004. eidsberg.no
  8005. eidskog.no
  8006. eidsvoll.no
  8007. eigersund.no
  8008. elverum.no
  8009. enebakk.no
  8010. engerdal.no
  8011. etne.no
  8012. etnedal.no
  8013. evenes.no
  8014. evenassi.no
  8015. evenášši.no
  8016. evje-og-hornnes.no
  8017. farsund.no
  8018. fauske.no
  8019. fuossko.no
  8020. fuoisku.no
  8021. fedje.no
  8022. fet.no
  8023. finnoy.no
  8024. finnøy.no
  8025. fitjar.no
  8026. fjaler.no
  8027. fjell.no
  8028. flakstad.no
  8029. flatanger.no
  8030. flekkefjord.no
  8031. flesberg.no
  8032. flora.no
  8033. fla.no
  8034. flå.no
  8035. folldal.no
  8036. forsand.no
  8037. fosnes.no
  8038. frei.no
  8039. frogn.no
  8040. froland.no
  8041. frosta.no
  8042. frana.no
  8043. fræna.no
  8044. froya.no
  8045. frøya.no
  8046. fusa.no
  8047. fyresdal.no
  8048. forde.no
  8049. førde.no
  8050. gamvik.no
  8051. gangaviika.no
  8052. gáŋgaviika.no
  8053. gaular.no
  8054. gausdal.no
  8055. gildeskal.no
  8056. gildeskål.no
  8057. giske.no
  8058. gjemnes.no
  8059. gjerdrum.no
  8060. gjerstad.no
  8061. gjesdal.no
  8062. gjovik.no
  8063. gjøvik.no
  8064. gloppen.no
  8065. gol.no
  8066. gran.no
  8067. grane.no
  8068. granvin.no
  8069. gratangen.no
  8070. grimstad.no
  8071. grong.no
  8072. kraanghke.no
  8073. kråanghke.no
  8074. grue.no
  8075. gulen.no
  8076. hadsel.no
  8077. halden.no
  8078. halsa.no
  8079. hamar.no
  8080. hamaroy.no
  8081. habmer.no
  8082. hábmer.no
  8083. hapmir.no
  8084. hápmir.no
  8085. hammerfest.no
  8086. hammarfeasta.no
  8087. hámmárfeasta.no
  8088. haram.no
  8089. hareid.no
  8090. harstad.no
  8091. hasvik.no
  8092. aknoluokta.no
  8093. ákŋoluokta.no
  8094. hattfjelldal.no
  8095. aarborte.no
  8096. haugesund.no
  8097. hemne.no
  8098. hemnes.no
  8099. hemsedal.no
  8100. heroy.more-og-romsdal.no
  8101. herøy.møre-og-romsdal.no
  8102. heroy.nordland.no
  8103. herøy.nordland.no
  8104. hitra.no
  8105. hjartdal.no
  8106. hjelmeland.no
  8107. hobol.no
  8108. hobøl.no
  8109. hof.no
  8110. hol.no
  8111. hole.no
  8112. holmestrand.no
  8113. holtalen.no
  8114. holtålen.no
  8115. hornindal.no
  8116. horten.no
  8117. hurdal.no
  8118. hurum.no
  8119. hvaler.no
  8120. hyllestad.no
  8121. hagebostad.no
  8122. hægebostad.no
  8123. hoyanger.no
  8124. høyanger.no
  8125. hoylandet.no
  8126. høylandet.no
  8127. ha.no
  8128. hå.no
  8129. ibestad.no
  8130. inderoy.no
  8131. inderøy.no
  8132. iveland.no
  8133. jevnaker.no
  8134. jondal.no
  8135. jolster.no
  8136. jølster.no
  8137. karasjok.no
  8138. karasjohka.no
  8139. kárášjohka.no
  8140. karlsoy.no
  8141. galsa.no
  8142. gálsá.no
  8143. karmoy.no
  8144. karmøy.no
  8145. kautokeino.no
  8146. guovdageaidnu.no
  8147. klepp.no
  8148. klabu.no
  8149. klæbu.no
  8150. kongsberg.no
  8151. kongsvinger.no
  8152. kragero.no
  8153. kragerø.no
  8154. kristiansand.no
  8155. kristiansund.no
  8156. krodsherad.no
  8157. krødsherad.no
  8158. kvalsund.no
  8159. rahkkeravju.no
  8160. ráhkkerávju.no
  8161. kvam.no
  8162. kvinesdal.no
  8163. kvinnherad.no
  8164. kviteseid.no
  8165. kvitsoy.no
  8166. kvitsøy.no
  8167. kvafjord.no
  8168. kvæfjord.no
  8169. giehtavuoatna.no
  8170. kvanangen.no
  8171. kvænangen.no
  8172. navuotna.no
  8173. návuotna.no
  8174. kafjord.no
  8175. kåfjord.no
  8176. gaivuotna.no
  8177. gáivuotna.no
  8178. larvik.no
  8179. lavangen.no
  8180. lavagis.no
  8181. loabat.no
  8182. loabát.no
  8183. lebesby.no
  8184. davvesiida.no
  8185. leikanger.no
  8186. leirfjord.no
  8187. leka.no
  8188. leksvik.no
  8189. lenvik.no
  8190. leangaviika.no
  8191. leaŋgaviika.no
  8192. lesja.no
  8193. levanger.no
  8194. lier.no
  8195. lierne.no
  8196. lillehammer.no
  8197. lillesand.no
  8198. lindesnes.no
  8199. lindas.no
  8200. lindås.no
  8201. lom.no
  8202. loppa.no
  8203. lahppi.no
  8204. láhppi.no
  8205. lund.no
  8206. lunner.no
  8207. luroy.no
  8208. lurøy.no
  8209. luster.no
  8210. lyngdal.no
  8211. lyngen.no
  8212. ivgu.no
  8213. lardal.no
  8214. lerdal.no
  8215. lærdal.no
  8216. lodingen.no
  8217. lødingen.no
  8218. lorenskog.no
  8219. lørenskog.no
  8220. loten.no
  8221. løten.no
  8222. malvik.no
  8223. masoy.no
  8224. måsøy.no
  8225. muosat.no
  8226. muosát.no
  8227. mandal.no
  8228. marker.no
  8229. marnardal.no
  8230. masfjorden.no
  8231. meland.no
  8232. meldal.no
  8233. melhus.no
  8234. meloy.no
  8235. meløy.no
  8236. meraker.no
  8237. meråker.no
  8238. moareke.no
  8239. moåreke.no
  8240. midsund.no
  8241. midtre-gauldal.no
  8242. modalen.no
  8243. modum.no
  8244. molde.no
  8245. moskenes.no
  8246. moss.no
  8247. mosvik.no
  8248. malselv.no
  8249. målselv.no
  8250. malatvuopmi.no
  8251. málatvuopmi.no
  8252. namdalseid.no
  8253. aejrie.no
  8254. namsos.no
  8255. namsskogan.no
  8256. naamesjevuemie.no
  8257. nååmesjevuemie.no
  8258. laakesvuemie.no
  8259. nannestad.no
  8260. narvik.no
  8261. narviika.no
  8262. naustdal.no
  8263. nedre-eiker.no
  8264. nes.akershus.no
  8265. nes.buskerud.no
  8266. nesna.no
  8267. nesodden.no
  8268. nesseby.no
  8269. unjarga.no
  8270. unjárga.no
  8271. nesset.no
  8272. nissedal.no
  8273. nittedal.no
  8274. nord-aurdal.no
  8275. nord-fron.no
  8276. nord-odal.no
  8277. norddal.no
  8278. nordkapp.no
  8279. davvenjarga.no
  8280. davvenjárga.no
  8281. nordre-land.no
  8282. nordreisa.no
  8283. raisa.no
  8284. ráisa.no
  8285. nore-og-uvdal.no
  8286. notodden.no
  8287. naroy.no
  8288. nærøy.no
  8289. notteroy.no
  8290. nøtterøy.no
  8291. odda.no
  8292. oksnes.no
  8293. øksnes.no
  8294. oppdal.no
  8295. oppegard.no
  8296. oppegård.no
  8297. orkdal.no
  8298. orland.no
  8299. ørland.no
  8300. orskog.no
  8301. ørskog.no
  8302. orsta.no
  8303. ørsta.no
  8304. os.hedmark.no
  8305. os.hordaland.no
  8306. osen.no
  8307. osteroy.no
  8308. osterøy.no
  8309. ostre-toten.no
  8310. østre-toten.no
  8311. overhalla.no
  8312. ovre-eiker.no
  8313. øvre-eiker.no
  8314. oyer.no
  8315. øyer.no
  8316. oygarden.no
  8317. øygarden.no
  8318. oystre-slidre.no
  8319. øystre-slidre.no
  8320. porsanger.no
  8321. porsangu.no
  8322. porsáŋgu.no
  8323. porsgrunn.no
  8324. radoy.no
  8325. radøy.no
  8326. rakkestad.no
  8327. rana.no
  8328. ruovat.no
  8329. randaberg.no
  8330. rauma.no
  8331. rendalen.no
  8332. rennebu.no
  8333. rennesoy.no
  8334. rennesøy.no
  8335. rindal.no
  8336. ringebu.no
  8337. ringerike.no
  8338. ringsaker.no
  8339. rissa.no
  8340. risor.no
  8341. risør.no
  8342. roan.no
  8343. rollag.no
  8344. rygge.no
  8345. ralingen.no
  8346. rælingen.no
  8347. rodoy.no
  8348. rødøy.no
  8349. romskog.no
  8350. rømskog.no
  8351. roros.no
  8352. røros.no
  8353. rost.no
  8354. røst.no
  8355. royken.no
  8356. røyken.no
  8357. royrvik.no
  8358. røyrvik.no
  8359. rade.no
  8360. råde.no
  8361. salangen.no
  8362. siellak.no
  8363. saltdal.no
  8364. salat.no
  8365. sálát.no
  8366. sálat.no
  8367. samnanger.no
  8368. sande.more-og-romsdal.no
  8369. sande.møre-og-romsdal.no
  8370. sande.vestfold.no
  8371. sandefjord.no
  8372. sandnes.no
  8373. sandoy.no
  8374. sandøy.no
  8375. sarpsborg.no
  8376. sauda.no
  8377. sauherad.no
  8378. sel.no
  8379. selbu.no
  8380. selje.no
  8381. seljord.no
  8382. sigdal.no
  8383. siljan.no
  8384. sirdal.no
  8385. skaun.no
  8386. skedsmo.no
  8387. ski.no
  8388. skien.no
  8389. skiptvet.no
  8390. skjervoy.no
  8391. skjervøy.no
  8392. skierva.no
  8393. skiervá.no
  8394. skjak.no
  8395. skjåk.no
  8396. skodje.no
  8397. skanland.no
  8398. skånland.no
  8399. skanit.no
  8400. skánit.no
  8401. smola.no
  8402. smøla.no
  8403. snillfjord.no
  8404. snasa.no
  8405. snåsa.no
  8406. snoasa.no
  8407. snaase.no
  8408. snåase.no
  8409. sogndal.no
  8410. sokndal.no
  8411. sola.no
  8412. solund.no
  8413. songdalen.no
  8414. sortland.no
  8415. spydeberg.no
  8416. stange.no
  8417. stavanger.no
  8418. steigen.no
  8419. steinkjer.no
  8420. stjordal.no
  8421. stjørdal.no
  8422. stokke.no
  8423. stor-elvdal.no
  8424. stord.no
  8425. stordal.no
  8426. storfjord.no
  8427. omasvuotna.no
  8428. strand.no
  8429. stranda.no
  8430. stryn.no
  8431. sula.no
  8432. suldal.no
  8433. sund.no
  8434. sunndal.no
  8435. surnadal.no
  8436. sveio.no
  8437. svelvik.no
  8438. sykkylven.no
  8439. sogne.no
  8440. søgne.no
  8441. somna.no
  8442. sømna.no
  8443. sondre-land.no
  8444. søndre-land.no
  8445. sor-aurdal.no
  8446. sør-aurdal.no
  8447. sor-fron.no
  8448. sør-fron.no
  8449. sor-odal.no
  8450. sør-odal.no
  8451. sor-varanger.no
  8452. sør-varanger.no
  8453. matta-varjjat.no
  8454. mátta-várjjat.no
  8455. sorfold.no
  8456. sørfold.no
  8457. sorreisa.no
  8458. sørreisa.no
  8459. sorum.no
  8460. sørum.no
  8461. tana.no
  8462. deatnu.no
  8463. time.no
  8464. tingvoll.no
  8465. tinn.no
  8466. tjeldsund.no
  8467. dielddanuorri.no
  8468. tjome.no
  8469. tjøme.no
  8470. tokke.no
  8471. tolga.no
  8472. torsken.no
  8473. tranoy.no
  8474. tranøy.no
  8475. tromso.no
  8476. tromsø.no
  8477. tromsa.no
  8478. romsa.no
  8479. trondheim.no
  8480. troandin.no
  8481. trysil.no
  8482. trana.no
  8483. træna.no
  8484. trogstad.no
  8485. trøgstad.no
  8486. tvedestrand.no
  8487. tydal.no
  8488. tynset.no
  8489. tysfjord.no
  8490. divtasvuodna.no
  8491. divttasvuotna.no
  8492. tysnes.no
  8493. tysvar.no
  8494. tysvær.no
  8495. tonsberg.no
  8496. tønsberg.no
  8497. ullensaker.no
  8498. ullensvang.no
  8499. ulvik.no
  8500. utsira.no
  8501. vadso.no
  8502. vadsø.no
  8503. cahcesuolo.no
  8504. čáhcesuolo.no
  8505. vaksdal.no
  8506. valle.no
  8507. vang.no
  8508. vanylven.no
  8509. vardo.no
  8510. vardø.no
  8511. varggat.no
  8512. várggát.no
  8513. vefsn.no
  8514. vaapste.no
  8515. vega.no
  8516. vegarshei.no
  8517. vegårshei.no
  8518. vennesla.no
  8519. verdal.no
  8520. verran.no
  8521. vestby.no
  8522. vestnes.no
  8523. vestre-slidre.no
  8524. vestre-toten.no
  8525. vestvagoy.no
  8526. vestvågøy.no
  8527. vevelstad.no
  8528. vik.no
  8529. vikna.no
  8530. vindafjord.no
  8531. volda.no
  8532. voss.no
  8533. varoy.no
  8534. værøy.no
  8535. vagan.no
  8536. vågan.no
  8537. voagat.no
  8538. vagsoy.no
  8539. vågsøy.no
  8540. vaga.no
  8541. vågå.no
  8542. valer.ostfold.no
  8543. våler.østfold.no
  8544. valer.hedmark.no
  8545. våler.hedmark.no
  8546. // np : http://www.mos.com.np/register.html
  8547. *.np
  8548. // nr : http://cenpac.net.nr/dns/index.html
  8549. // Submitted by registry <technician@cenpac.net.nr>
  8550. nr
  8551. biz.nr
  8552. info.nr
  8553. gov.nr
  8554. edu.nr
  8555. org.nr
  8556. net.nr
  8557. com.nr
  8558. // nu : https://en.wikipedia.org/wiki/.nu
  8559. nu
  8560. // nz : https://en.wikipedia.org/wiki/.nz
  8561. // Submitted by registry <jay@nzrs.net.nz>
  8562. nz
  8563. ac.nz
  8564. co.nz
  8565. cri.nz
  8566. geek.nz
  8567. gen.nz
  8568. govt.nz
  8569. health.nz
  8570. iwi.nz
  8571. kiwi.nz
  8572. maori.nz
  8573. mil.nz
  8574. māori.nz
  8575. net.nz
  8576. org.nz
  8577. parliament.nz
  8578. school.nz
  8579. // om : https://en.wikipedia.org/wiki/.om
  8580. om
  8581. co.om
  8582. com.om
  8583. edu.om
  8584. gov.om
  8585. med.om
  8586. museum.om
  8587. net.om
  8588. org.om
  8589. pro.om
  8590. // onion : https://tools.ietf.org/html/rfc7686
  8591. onion
  8592. // org : https://en.wikipedia.org/wiki/.org
  8593. org
  8594. // pa : http://www.nic.pa/
  8595. // Some additional second level "domains" resolve directly as hostnames, such as
  8596. // pannet.pa, so we add a rule for "pa".
  8597. pa
  8598. ac.pa
  8599. gob.pa
  8600. com.pa
  8601. org.pa
  8602. sld.pa
  8603. edu.pa
  8604. net.pa
  8605. ing.pa
  8606. abo.pa
  8607. med.pa
  8608. nom.pa
  8609. // pe : https://www.nic.pe/InformeFinalComision.pdf
  8610. pe
  8611. edu.pe
  8612. gob.pe
  8613. nom.pe
  8614. mil.pe
  8615. org.pe
  8616. com.pe
  8617. net.pe
  8618. // pf : http://www.gobin.info/domainname/formulaire-pf.pdf
  8619. pf
  8620. com.pf
  8621. org.pf
  8622. edu.pf
  8623. // pg : https://en.wikipedia.org/wiki/.pg
  8624. *.pg
  8625. // ph : http://www.domains.ph/FAQ2.asp
  8626. // Submitted by registry <jed@email.com.ph>
  8627. ph
  8628. com.ph
  8629. net.ph
  8630. org.ph
  8631. gov.ph
  8632. edu.ph
  8633. ngo.ph
  8634. mil.ph
  8635. i.ph
  8636. // pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK
  8637. pk
  8638. com.pk
  8639. net.pk
  8640. edu.pk
  8641. org.pk
  8642. fam.pk
  8643. biz.pk
  8644. web.pk
  8645. gov.pk
  8646. gob.pk
  8647. gok.pk
  8648. gon.pk
  8649. gop.pk
  8650. gos.pk
  8651. info.pk
  8652. // pl http://www.dns.pl/english/index.html
  8653. // Submitted by registry
  8654. pl
  8655. com.pl
  8656. net.pl
  8657. org.pl
  8658. // pl functional domains (http://www.dns.pl/english/index.html)
  8659. aid.pl
  8660. agro.pl
  8661. atm.pl
  8662. auto.pl
  8663. biz.pl
  8664. edu.pl
  8665. gmina.pl
  8666. gsm.pl
  8667. info.pl
  8668. mail.pl
  8669. miasta.pl
  8670. media.pl
  8671. mil.pl
  8672. nieruchomosci.pl
  8673. nom.pl
  8674. pc.pl
  8675. powiat.pl
  8676. priv.pl
  8677. realestate.pl
  8678. rel.pl
  8679. sex.pl
  8680. shop.pl
  8681. sklep.pl
  8682. sos.pl
  8683. szkola.pl
  8684. targi.pl
  8685. tm.pl
  8686. tourism.pl
  8687. travel.pl
  8688. turystyka.pl
  8689. // Government domains
  8690. gov.pl
  8691. ap.gov.pl
  8692. griw.gov.pl
  8693. ic.gov.pl
  8694. is.gov.pl
  8695. kmpsp.gov.pl
  8696. konsulat.gov.pl
  8697. kppsp.gov.pl
  8698. kwp.gov.pl
  8699. kwpsp.gov.pl
  8700. mup.gov.pl
  8701. mw.gov.pl
  8702. oia.gov.pl
  8703. oirm.gov.pl
  8704. oke.gov.pl
  8705. oow.gov.pl
  8706. oschr.gov.pl
  8707. oum.gov.pl
  8708. pa.gov.pl
  8709. pinb.gov.pl
  8710. piw.gov.pl
  8711. po.gov.pl
  8712. pr.gov.pl
  8713. psp.gov.pl
  8714. psse.gov.pl
  8715. pup.gov.pl
  8716. rzgw.gov.pl
  8717. sa.gov.pl
  8718. sdn.gov.pl
  8719. sko.gov.pl
  8720. so.gov.pl
  8721. sr.gov.pl
  8722. starostwo.gov.pl
  8723. ug.gov.pl
  8724. ugim.gov.pl
  8725. um.gov.pl
  8726. umig.gov.pl
  8727. upow.gov.pl
  8728. uppo.gov.pl
  8729. us.gov.pl
  8730. uw.gov.pl
  8731. uzs.gov.pl
  8732. wif.gov.pl
  8733. wiih.gov.pl
  8734. winb.gov.pl
  8735. wios.gov.pl
  8736. witd.gov.pl
  8737. wiw.gov.pl
  8738. wkz.gov.pl
  8739. wsa.gov.pl
  8740. wskr.gov.pl
  8741. wsse.gov.pl
  8742. wuoz.gov.pl
  8743. wzmiuw.gov.pl
  8744. zp.gov.pl
  8745. zpisdn.gov.pl
  8746. // pl regional domains (http://www.dns.pl/english/index.html)
  8747. augustow.pl
  8748. babia-gora.pl
  8749. bedzin.pl
  8750. beskidy.pl
  8751. bialowieza.pl
  8752. bialystok.pl
  8753. bielawa.pl
  8754. bieszczady.pl
  8755. boleslawiec.pl
  8756. bydgoszcz.pl
  8757. bytom.pl
  8758. cieszyn.pl
  8759. czeladz.pl
  8760. czest.pl
  8761. dlugoleka.pl
  8762. elblag.pl
  8763. elk.pl
  8764. glogow.pl
  8765. gniezno.pl
  8766. gorlice.pl
  8767. grajewo.pl
  8768. ilawa.pl
  8769. jaworzno.pl
  8770. jelenia-gora.pl
  8771. jgora.pl
  8772. kalisz.pl
  8773. kazimierz-dolny.pl
  8774. karpacz.pl
  8775. kartuzy.pl
  8776. kaszuby.pl
  8777. katowice.pl
  8778. kepno.pl
  8779. ketrzyn.pl
  8780. klodzko.pl
  8781. kobierzyce.pl
  8782. kolobrzeg.pl
  8783. konin.pl
  8784. konskowola.pl
  8785. kutno.pl
  8786. lapy.pl
  8787. lebork.pl
  8788. legnica.pl
  8789. lezajsk.pl
  8790. limanowa.pl
  8791. lomza.pl
  8792. lowicz.pl
  8793. lubin.pl
  8794. lukow.pl
  8795. malbork.pl
  8796. malopolska.pl
  8797. mazowsze.pl
  8798. mazury.pl
  8799. mielec.pl
  8800. mielno.pl
  8801. mragowo.pl
  8802. naklo.pl
  8803. nowaruda.pl
  8804. nysa.pl
  8805. olawa.pl
  8806. olecko.pl
  8807. olkusz.pl
  8808. olsztyn.pl
  8809. opoczno.pl
  8810. opole.pl
  8811. ostroda.pl
  8812. ostroleka.pl
  8813. ostrowiec.pl
  8814. ostrowwlkp.pl
  8815. pila.pl
  8816. pisz.pl
  8817. podhale.pl
  8818. podlasie.pl
  8819. polkowice.pl
  8820. pomorze.pl
  8821. pomorskie.pl
  8822. prochowice.pl
  8823. pruszkow.pl
  8824. przeworsk.pl
  8825. pulawy.pl
  8826. radom.pl
  8827. rawa-maz.pl
  8828. rybnik.pl
  8829. rzeszow.pl
  8830. sanok.pl
  8831. sejny.pl
  8832. slask.pl
  8833. slupsk.pl
  8834. sosnowiec.pl
  8835. stalowa-wola.pl
  8836. skoczow.pl
  8837. starachowice.pl
  8838. stargard.pl
  8839. suwalki.pl
  8840. swidnica.pl
  8841. swiebodzin.pl
  8842. swinoujscie.pl
  8843. szczecin.pl
  8844. szczytno.pl
  8845. tarnobrzeg.pl
  8846. tgory.pl
  8847. turek.pl
  8848. tychy.pl
  8849. ustka.pl
  8850. walbrzych.pl
  8851. warmia.pl
  8852. warszawa.pl
  8853. waw.pl
  8854. wegrow.pl
  8855. wielun.pl
  8856. wlocl.pl
  8857. wloclawek.pl
  8858. wodzislaw.pl
  8859. wolomin.pl
  8860. wroclaw.pl
  8861. zachpomor.pl
  8862. zagan.pl
  8863. zarow.pl
  8864. zgora.pl
  8865. zgorzelec.pl
  8866. // pm : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf
  8867. pm
  8868. // pn : http://www.government.pn/PnRegistry/policies.htm
  8869. pn
  8870. gov.pn
  8871. co.pn
  8872. org.pn
  8873. edu.pn
  8874. net.pn
  8875. // post : https://en.wikipedia.org/wiki/.post
  8876. post
  8877. // pr : http://www.nic.pr/index.asp?f=1
  8878. pr
  8879. com.pr
  8880. net.pr
  8881. org.pr
  8882. gov.pr
  8883. edu.pr
  8884. isla.pr
  8885. pro.pr
  8886. biz.pr
  8887. info.pr
  8888. name.pr
  8889. // these aren't mentioned on nic.pr, but on https://en.wikipedia.org/wiki/.pr
  8890. est.pr
  8891. prof.pr
  8892. ac.pr
  8893. // pro : http://registry.pro/get-pro
  8894. pro
  8895. aaa.pro
  8896. aca.pro
  8897. acct.pro
  8898. avocat.pro
  8899. bar.pro
  8900. cpa.pro
  8901. eng.pro
  8902. jur.pro
  8903. law.pro
  8904. med.pro
  8905. recht.pro
  8906. // ps : https://en.wikipedia.org/wiki/.ps
  8907. // http://www.nic.ps/registration/policy.html#reg
  8908. ps
  8909. edu.ps
  8910. gov.ps
  8911. sec.ps
  8912. plo.ps
  8913. com.ps
  8914. org.ps
  8915. net.ps
  8916. // pt : https://www.dns.pt/en/domain/pt-terms-and-conditions-registration-rules/
  8917. pt
  8918. net.pt
  8919. gov.pt
  8920. org.pt
  8921. edu.pt
  8922. int.pt
  8923. publ.pt
  8924. com.pt
  8925. nome.pt
  8926. // pw : https://en.wikipedia.org/wiki/.pw
  8927. pw
  8928. co.pw
  8929. ne.pw
  8930. or.pw
  8931. ed.pw
  8932. go.pw
  8933. belau.pw
  8934. // py : http://www.nic.py/pautas.html#seccion_9
  8935. // Submitted by registry
  8936. py
  8937. com.py
  8938. coop.py
  8939. edu.py
  8940. gov.py
  8941. mil.py
  8942. net.py
  8943. org.py
  8944. // qa : http://domains.qa/en/
  8945. qa
  8946. com.qa
  8947. edu.qa
  8948. gov.qa
  8949. mil.qa
  8950. name.qa
  8951. net.qa
  8952. org.qa
  8953. sch.qa
  8954. // re : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf
  8955. re
  8956. asso.re
  8957. com.re
  8958. nom.re
  8959. // ro : http://www.rotld.ro/
  8960. ro
  8961. arts.ro
  8962. com.ro
  8963. firm.ro
  8964. info.ro
  8965. nom.ro
  8966. nt.ro
  8967. org.ro
  8968. rec.ro
  8969. store.ro
  8970. tm.ro
  8971. www.ro
  8972. // rs : https://www.rnids.rs/en/domains/national-domains
  8973. rs
  8974. ac.rs
  8975. co.rs
  8976. edu.rs
  8977. gov.rs
  8978. in.rs
  8979. org.rs
  8980. // ru : https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf
  8981. // Submitted by George Georgievsky <gug@cctld.ru>
  8982. ru
  8983. // rw : https://www.ricta.org.rw/sites/default/files/resources/registry_registrar_contract_0.pdf
  8984. rw
  8985. ac.rw
  8986. co.rw
  8987. coop.rw
  8988. gov.rw
  8989. mil.rw
  8990. net.rw
  8991. org.rw
  8992. // sa : http://www.nic.net.sa/
  8993. sa
  8994. com.sa
  8995. net.sa
  8996. org.sa
  8997. gov.sa
  8998. med.sa
  8999. pub.sa
  9000. edu.sa
  9001. sch.sa
  9002. // sb : http://www.sbnic.net.sb/
  9003. // Submitted by registry <lee.humphries@telekom.com.sb>
  9004. sb
  9005. com.sb
  9006. edu.sb
  9007. gov.sb
  9008. net.sb
  9009. org.sb
  9010. // sc : http://www.nic.sc/
  9011. sc
  9012. com.sc
  9013. gov.sc
  9014. net.sc
  9015. org.sc
  9016. edu.sc
  9017. // sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm
  9018. // Submitted by registry <admin@isoc.sd>
  9019. sd
  9020. com.sd
  9021. net.sd
  9022. org.sd
  9023. edu.sd
  9024. med.sd
  9025. tv.sd
  9026. gov.sd
  9027. info.sd
  9028. // se : https://en.wikipedia.org/wiki/.se
  9029. // Submitted by registry <patrik.wallstrom@iis.se>
  9030. se
  9031. a.se
  9032. ac.se
  9033. b.se
  9034. bd.se
  9035. brand.se
  9036. c.se
  9037. d.se
  9038. e.se
  9039. f.se
  9040. fh.se
  9041. fhsk.se
  9042. fhv.se
  9043. g.se
  9044. h.se
  9045. i.se
  9046. k.se
  9047. komforb.se
  9048. kommunalforbund.se
  9049. komvux.se
  9050. l.se
  9051. lanbib.se
  9052. m.se
  9053. n.se
  9054. naturbruksgymn.se
  9055. o.se
  9056. org.se
  9057. p.se
  9058. parti.se
  9059. pp.se
  9060. press.se
  9061. r.se
  9062. s.se
  9063. t.se
  9064. tm.se
  9065. u.se
  9066. w.se
  9067. x.se
  9068. y.se
  9069. z.se
  9070. // sg : http://www.nic.net.sg/page/registration-policies-procedures-and-guidelines
  9071. sg
  9072. com.sg
  9073. net.sg
  9074. org.sg
  9075. gov.sg
  9076. edu.sg
  9077. per.sg
  9078. // sh : http://nic.sh/rules.htm
  9079. sh
  9080. com.sh
  9081. net.sh
  9082. gov.sh
  9083. org.sh
  9084. mil.sh
  9085. // si : https://en.wikipedia.org/wiki/.si
  9086. si
  9087. // sj : No registrations at this time.
  9088. // Submitted by registry <jarle@uninett.no>
  9089. sj
  9090. // sk : https://en.wikipedia.org/wiki/.sk
  9091. // list of 2nd level domains ?
  9092. sk
  9093. // sl : http://www.nic.sl
  9094. // Submitted by registry <adam@neoip.com>
  9095. sl
  9096. com.sl
  9097. net.sl
  9098. edu.sl
  9099. gov.sl
  9100. org.sl
  9101. // sm : https://en.wikipedia.org/wiki/.sm
  9102. sm
  9103. // sn : https://en.wikipedia.org/wiki/.sn
  9104. sn
  9105. art.sn
  9106. com.sn
  9107. edu.sn
  9108. gouv.sn
  9109. org.sn
  9110. perso.sn
  9111. univ.sn
  9112. // so : http://sonic.so/policies/
  9113. so
  9114. com.so
  9115. edu.so
  9116. gov.so
  9117. me.so
  9118. net.so
  9119. org.so
  9120. // sr : https://en.wikipedia.org/wiki/.sr
  9121. sr
  9122. // ss : https://registry.nic.ss/
  9123. // Submitted by registry <technical@nic.ss>
  9124. ss
  9125. biz.ss
  9126. com.ss
  9127. edu.ss
  9128. gov.ss
  9129. me.ss
  9130. net.ss
  9131. org.ss
  9132. sch.ss
  9133. // st : http://www.nic.st/html/policyrules/
  9134. st
  9135. co.st
  9136. com.st
  9137. consulado.st
  9138. edu.st
  9139. embaixada.st
  9140. mil.st
  9141. net.st
  9142. org.st
  9143. principe.st
  9144. saotome.st
  9145. store.st
  9146. // su : https://en.wikipedia.org/wiki/.su
  9147. su
  9148. // sv : http://www.svnet.org.sv/niveldos.pdf
  9149. sv
  9150. com.sv
  9151. edu.sv
  9152. gob.sv
  9153. org.sv
  9154. red.sv
  9155. // sx : https://en.wikipedia.org/wiki/.sx
  9156. // Submitted by registry <jcvignes@openregistry.com>
  9157. sx
  9158. gov.sx
  9159. // sy : https://en.wikipedia.org/wiki/.sy
  9160. // see also: http://www.gobin.info/domainname/sy.doc
  9161. sy
  9162. edu.sy
  9163. gov.sy
  9164. net.sy
  9165. mil.sy
  9166. com.sy
  9167. org.sy
  9168. // sz : https://en.wikipedia.org/wiki/.sz
  9169. // http://www.sispa.org.sz/
  9170. sz
  9171. co.sz
  9172. ac.sz
  9173. org.sz
  9174. // tc : https://en.wikipedia.org/wiki/.tc
  9175. tc
  9176. // td : https://en.wikipedia.org/wiki/.td
  9177. td
  9178. // tel: https://en.wikipedia.org/wiki/.tel
  9179. // http://www.telnic.org/
  9180. tel
  9181. // tf : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf
  9182. tf
  9183. // tg : https://en.wikipedia.org/wiki/.tg
  9184. // http://www.nic.tg/
  9185. tg
  9186. // th : https://en.wikipedia.org/wiki/.th
  9187. // Submitted by registry <krit@thains.co.th>
  9188. th
  9189. ac.th
  9190. co.th
  9191. go.th
  9192. in.th
  9193. mi.th
  9194. net.th
  9195. or.th
  9196. // tj : http://www.nic.tj/policy.html
  9197. tj
  9198. ac.tj
  9199. biz.tj
  9200. co.tj
  9201. com.tj
  9202. edu.tj
  9203. go.tj
  9204. gov.tj
  9205. int.tj
  9206. mil.tj
  9207. name.tj
  9208. net.tj
  9209. nic.tj
  9210. org.tj
  9211. test.tj
  9212. web.tj
  9213. // tk : https://en.wikipedia.org/wiki/.tk
  9214. tk
  9215. // tl : https://en.wikipedia.org/wiki/.tl
  9216. tl
  9217. gov.tl
  9218. // tm : http://www.nic.tm/local.html
  9219. tm
  9220. com.tm
  9221. co.tm
  9222. org.tm
  9223. net.tm
  9224. nom.tm
  9225. gov.tm
  9226. mil.tm
  9227. edu.tm
  9228. // tn : http://www.registre.tn/fr/
  9229. // https://whois.ati.tn/
  9230. tn
  9231. com.tn
  9232. ens.tn
  9233. fin.tn
  9234. gov.tn
  9235. ind.tn
  9236. info.tn
  9237. intl.tn
  9238. mincom.tn
  9239. nat.tn
  9240. net.tn
  9241. org.tn
  9242. perso.tn
  9243. tourism.tn
  9244. // to : https://en.wikipedia.org/wiki/.to
  9245. // Submitted by registry <egullich@colo.to>
  9246. to
  9247. com.to
  9248. gov.to
  9249. net.to
  9250. org.to
  9251. edu.to
  9252. mil.to
  9253. // tr : https://nic.tr/
  9254. // https://nic.tr/forms/eng/policies.pdf
  9255. // https://nic.tr/index.php?USRACTN=PRICELST
  9256. tr
  9257. av.tr
  9258. bbs.tr
  9259. bel.tr
  9260. biz.tr
  9261. com.tr
  9262. dr.tr
  9263. edu.tr
  9264. gen.tr
  9265. gov.tr
  9266. info.tr
  9267. mil.tr
  9268. k12.tr
  9269. kep.tr
  9270. name.tr
  9271. net.tr
  9272. org.tr
  9273. pol.tr
  9274. tel.tr
  9275. tsk.tr
  9276. tv.tr
  9277. web.tr
  9278. // Used by Northern Cyprus
  9279. nc.tr
  9280. // Used by government agencies of Northern Cyprus
  9281. gov.nc.tr
  9282. // tt : http://www.nic.tt/
  9283. tt
  9284. co.tt
  9285. com.tt
  9286. org.tt
  9287. net.tt
  9288. biz.tt
  9289. info.tt
  9290. pro.tt
  9291. int.tt
  9292. coop.tt
  9293. jobs.tt
  9294. mobi.tt
  9295. travel.tt
  9296. museum.tt
  9297. aero.tt
  9298. name.tt
  9299. gov.tt
  9300. edu.tt
  9301. // tv : https://en.wikipedia.org/wiki/.tv
  9302. // Not listing any 2LDs as reserved since none seem to exist in practice,
  9303. // Wikipedia notwithstanding.
  9304. tv
  9305. // tw : https://en.wikipedia.org/wiki/.tw
  9306. tw
  9307. edu.tw
  9308. gov.tw
  9309. mil.tw
  9310. com.tw
  9311. net.tw
  9312. org.tw
  9313. idv.tw
  9314. game.tw
  9315. ebiz.tw
  9316. club.tw
  9317. 網路.tw
  9318. 組織.tw
  9319. 商業.tw
  9320. // tz : http://www.tznic.or.tz/index.php/domains
  9321. // Submitted by registry <manager@tznic.or.tz>
  9322. tz
  9323. ac.tz
  9324. co.tz
  9325. go.tz
  9326. hotel.tz
  9327. info.tz
  9328. me.tz
  9329. mil.tz
  9330. mobi.tz
  9331. ne.tz
  9332. or.tz
  9333. sc.tz
  9334. tv.tz
  9335. // ua : https://hostmaster.ua/policy/?ua
  9336. // Submitted by registry <dk@cctld.ua>
  9337. ua
  9338. // ua 2LD
  9339. com.ua
  9340. edu.ua
  9341. gov.ua
  9342. in.ua
  9343. net.ua
  9344. org.ua
  9345. // ua geographic names
  9346. // https://hostmaster.ua/2ld/
  9347. cherkassy.ua
  9348. cherkasy.ua
  9349. chernigov.ua
  9350. chernihiv.ua
  9351. chernivtsi.ua
  9352. chernovtsy.ua
  9353. ck.ua
  9354. cn.ua
  9355. cr.ua
  9356. crimea.ua
  9357. cv.ua
  9358. dn.ua
  9359. dnepropetrovsk.ua
  9360. dnipropetrovsk.ua
  9361. donetsk.ua
  9362. dp.ua
  9363. if.ua
  9364. ivano-frankivsk.ua
  9365. kh.ua
  9366. kharkiv.ua
  9367. kharkov.ua
  9368. kherson.ua
  9369. khmelnitskiy.ua
  9370. khmelnytskyi.ua
  9371. kiev.ua
  9372. kirovograd.ua
  9373. km.ua
  9374. kr.ua
  9375. kropyvnytskyi.ua
  9376. krym.ua
  9377. ks.ua
  9378. kv.ua
  9379. kyiv.ua
  9380. lg.ua
  9381. lt.ua
  9382. lugansk.ua
  9383. luhansk.ua
  9384. lutsk.ua
  9385. lv.ua
  9386. lviv.ua
  9387. mk.ua
  9388. mykolaiv.ua
  9389. nikolaev.ua
  9390. od.ua
  9391. odesa.ua
  9392. odessa.ua
  9393. pl.ua
  9394. poltava.ua
  9395. rivne.ua
  9396. rovno.ua
  9397. rv.ua
  9398. sb.ua
  9399. sebastopol.ua
  9400. sevastopol.ua
  9401. sm.ua
  9402. sumy.ua
  9403. te.ua
  9404. ternopil.ua
  9405. uz.ua
  9406. uzhgorod.ua
  9407. uzhhorod.ua
  9408. vinnica.ua
  9409. vinnytsia.ua
  9410. vn.ua
  9411. volyn.ua
  9412. yalta.ua
  9413. zakarpattia.ua
  9414. zaporizhzhe.ua
  9415. zaporizhzhia.ua
  9416. zhitomir.ua
  9417. zhytomyr.ua
  9418. zp.ua
  9419. zt.ua
  9420. // ug : https://www.registry.co.ug/
  9421. ug
  9422. co.ug
  9423. or.ug
  9424. ac.ug
  9425. sc.ug
  9426. go.ug
  9427. ne.ug
  9428. com.ug
  9429. org.ug
  9430. // uk : https://en.wikipedia.org/wiki/.uk
  9431. // Submitted by registry <Michael.Daly@nominet.org.uk>
  9432. uk
  9433. ac.uk
  9434. co.uk
  9435. gov.uk
  9436. ltd.uk
  9437. me.uk
  9438. net.uk
  9439. nhs.uk
  9440. org.uk
  9441. plc.uk
  9442. police.uk
  9443. *.sch.uk
  9444. // us : https://en.wikipedia.org/wiki/.us
  9445. us
  9446. dni.us
  9447. fed.us
  9448. isa.us
  9449. kids.us
  9450. nsn.us
  9451. // us geographic names
  9452. ak.us
  9453. al.us
  9454. ar.us
  9455. as.us
  9456. az.us
  9457. ca.us
  9458. co.us
  9459. ct.us
  9460. dc.us
  9461. de.us
  9462. fl.us
  9463. ga.us
  9464. gu.us
  9465. hi.us
  9466. ia.us
  9467. id.us
  9468. il.us
  9469. in.us
  9470. ks.us
  9471. ky.us
  9472. la.us
  9473. ma.us
  9474. md.us
  9475. me.us
  9476. mi.us
  9477. mn.us
  9478. mo.us
  9479. ms.us
  9480. mt.us
  9481. nc.us
  9482. nd.us
  9483. ne.us
  9484. nh.us
  9485. nj.us
  9486. nm.us
  9487. nv.us
  9488. ny.us
  9489. oh.us
  9490. ok.us
  9491. or.us
  9492. pa.us
  9493. pr.us
  9494. ri.us
  9495. sc.us
  9496. sd.us
  9497. tn.us
  9498. tx.us
  9499. ut.us
  9500. vi.us
  9501. vt.us
  9502. va.us
  9503. wa.us
  9504. wi.us
  9505. wv.us
  9506. wy.us
  9507. // The registrar notes several more specific domains available in each state,
  9508. // such as state.*.us, dst.*.us, etc., but resolution of these is somewhat
  9509. // haphazard; in some states these domains resolve as addresses, while in others
  9510. // only subdomains are available, or even nothing at all. We include the
  9511. // most common ones where it's clear that different sites are different
  9512. // entities.
  9513. k12.ak.us
  9514. k12.al.us
  9515. k12.ar.us
  9516. k12.as.us
  9517. k12.az.us
  9518. k12.ca.us
  9519. k12.co.us
  9520. k12.ct.us
  9521. k12.dc.us
  9522. k12.fl.us
  9523. k12.ga.us
  9524. k12.gu.us
  9525. // k12.hi.us Bug 614565 - Hawaii has a state-wide DOE login
  9526. k12.ia.us
  9527. k12.id.us
  9528. k12.il.us
  9529. k12.in.us
  9530. k12.ks.us
  9531. k12.ky.us
  9532. k12.la.us
  9533. k12.ma.us
  9534. k12.md.us
  9535. k12.me.us
  9536. k12.mi.us
  9537. k12.mn.us
  9538. k12.mo.us
  9539. k12.ms.us
  9540. k12.mt.us
  9541. k12.nc.us
  9542. // k12.nd.us Bug 1028347 - Removed at request of Travis Rosso <trossow@nd.gov>
  9543. k12.ne.us
  9544. k12.nh.us
  9545. k12.nj.us
  9546. k12.nm.us
  9547. k12.nv.us
  9548. k12.ny.us
  9549. k12.oh.us
  9550. k12.ok.us
  9551. k12.or.us
  9552. k12.pa.us
  9553. k12.pr.us
  9554. // k12.ri.us Removed at request of Kim Cournoyer <netsupport@staff.ri.net>
  9555. k12.sc.us
  9556. // k12.sd.us Bug 934131 - Removed at request of James Booze <James.Booze@k12.sd.us>
  9557. k12.tn.us
  9558. k12.tx.us
  9559. k12.ut.us
  9560. k12.vi.us
  9561. k12.vt.us
  9562. k12.va.us
  9563. k12.wa.us
  9564. k12.wi.us
  9565. // k12.wv.us Bug 947705 - Removed at request of Verne Britton <verne@wvnet.edu>
  9566. k12.wy.us
  9567. cc.ak.us
  9568. cc.al.us
  9569. cc.ar.us
  9570. cc.as.us
  9571. cc.az.us
  9572. cc.ca.us
  9573. cc.co.us
  9574. cc.ct.us
  9575. cc.dc.us
  9576. cc.de.us
  9577. cc.fl.us
  9578. cc.ga.us
  9579. cc.gu.us
  9580. cc.hi.us
  9581. cc.ia.us
  9582. cc.id.us
  9583. cc.il.us
  9584. cc.in.us
  9585. cc.ks.us
  9586. cc.ky.us
  9587. cc.la.us
  9588. cc.ma.us
  9589. cc.md.us
  9590. cc.me.us
  9591. cc.mi.us
  9592. cc.mn.us
  9593. cc.mo.us
  9594. cc.ms.us
  9595. cc.mt.us
  9596. cc.nc.us
  9597. cc.nd.us
  9598. cc.ne.us
  9599. cc.nh.us
  9600. cc.nj.us
  9601. cc.nm.us
  9602. cc.nv.us
  9603. cc.ny.us
  9604. cc.oh.us
  9605. cc.ok.us
  9606. cc.or.us
  9607. cc.pa.us
  9608. cc.pr.us
  9609. cc.ri.us
  9610. cc.sc.us
  9611. cc.sd.us
  9612. cc.tn.us
  9613. cc.tx.us
  9614. cc.ut.us
  9615. cc.vi.us
  9616. cc.vt.us
  9617. cc.va.us
  9618. cc.wa.us
  9619. cc.wi.us
  9620. cc.wv.us
  9621. cc.wy.us
  9622. lib.ak.us
  9623. lib.al.us
  9624. lib.ar.us
  9625. lib.as.us
  9626. lib.az.us
  9627. lib.ca.us
  9628. lib.co.us
  9629. lib.ct.us
  9630. lib.dc.us
  9631. // lib.de.us Issue #243 - Moved to Private section at request of Ed Moore <Ed.Moore@lib.de.us>
  9632. lib.fl.us
  9633. lib.ga.us
  9634. lib.gu.us
  9635. lib.hi.us
  9636. lib.ia.us
  9637. lib.id.us
  9638. lib.il.us
  9639. lib.in.us
  9640. lib.ks.us
  9641. lib.ky.us
  9642. lib.la.us
  9643. lib.ma.us
  9644. lib.md.us
  9645. lib.me.us
  9646. lib.mi.us
  9647. lib.mn.us
  9648. lib.mo.us
  9649. lib.ms.us
  9650. lib.mt.us
  9651. lib.nc.us
  9652. lib.nd.us
  9653. lib.ne.us
  9654. lib.nh.us
  9655. lib.nj.us
  9656. lib.nm.us
  9657. lib.nv.us
  9658. lib.ny.us
  9659. lib.oh.us
  9660. lib.ok.us
  9661. lib.or.us
  9662. lib.pa.us
  9663. lib.pr.us
  9664. lib.ri.us
  9665. lib.sc.us
  9666. lib.sd.us
  9667. lib.tn.us
  9668. lib.tx.us
  9669. lib.ut.us
  9670. lib.vi.us
  9671. lib.vt.us
  9672. lib.va.us
  9673. lib.wa.us
  9674. lib.wi.us
  9675. // lib.wv.us Bug 941670 - Removed at request of Larry W Arnold <arnold@wvlc.lib.wv.us>
  9676. lib.wy.us
  9677. // k12.ma.us contains school districts in Massachusetts. The 4LDs are
  9678. // managed independently except for private (PVT), charter (CHTR) and
  9679. // parochial (PAROCH) schools. Those are delegated directly to the
  9680. // 5LD operators. <k12-ma-hostmaster _ at _ rsuc.gweep.net>
  9681. pvt.k12.ma.us
  9682. chtr.k12.ma.us
  9683. paroch.k12.ma.us
  9684. // Merit Network, Inc. maintains the registry for =~ /(k12|cc|lib).mi.us/ and the following
  9685. // see also: http://domreg.merit.edu
  9686. // see also: whois -h whois.domreg.merit.edu help
  9687. ann-arbor.mi.us
  9688. cog.mi.us
  9689. dst.mi.us
  9690. eaton.mi.us
  9691. gen.mi.us
  9692. mus.mi.us
  9693. tec.mi.us
  9694. washtenaw.mi.us
  9695. // uy : http://www.nic.org.uy/
  9696. uy
  9697. com.uy
  9698. edu.uy
  9699. gub.uy
  9700. mil.uy
  9701. net.uy
  9702. org.uy
  9703. // uz : http://www.reg.uz/
  9704. uz
  9705. co.uz
  9706. com.uz
  9707. net.uz
  9708. org.uz
  9709. // va : https://en.wikipedia.org/wiki/.va
  9710. va
  9711. // vc : https://en.wikipedia.org/wiki/.vc
  9712. // Submitted by registry <kshah@ca.afilias.info>
  9713. vc
  9714. com.vc
  9715. net.vc
  9716. org.vc
  9717. gov.vc
  9718. mil.vc
  9719. edu.vc
  9720. // ve : https://registro.nic.ve/
  9721. // Submitted by registry nic@nic.ve and nicve@conatel.gob.ve
  9722. ve
  9723. arts.ve
  9724. bib.ve
  9725. co.ve
  9726. com.ve
  9727. e12.ve
  9728. edu.ve
  9729. firm.ve
  9730. gob.ve
  9731. gov.ve
  9732. info.ve
  9733. int.ve
  9734. mil.ve
  9735. net.ve
  9736. nom.ve
  9737. org.ve
  9738. rar.ve
  9739. rec.ve
  9740. store.ve
  9741. tec.ve
  9742. web.ve
  9743. // vg : https://en.wikipedia.org/wiki/.vg
  9744. vg
  9745. // vi : http://www.nic.vi/newdomainform.htm
  9746. // http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other
  9747. // TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they
  9748. // are available for registration (which they do not seem to be).
  9749. vi
  9750. co.vi
  9751. com.vi
  9752. k12.vi
  9753. net.vi
  9754. org.vi
  9755. // vn : https://www.vnnic.vn/en/domain/cctld-vn
  9756. // https://vnnic.vn/sites/default/files/tailieu/vn.cctld.domains.txt
  9757. vn
  9758. ac.vn
  9759. ai.vn
  9760. biz.vn
  9761. com.vn
  9762. edu.vn
  9763. gov.vn
  9764. health.vn
  9765. id.vn
  9766. info.vn
  9767. int.vn
  9768. io.vn
  9769. name.vn
  9770. net.vn
  9771. org.vn
  9772. pro.vn
  9773. // vn geographical names
  9774. angiang.vn
  9775. bacgiang.vn
  9776. backan.vn
  9777. baclieu.vn
  9778. bacninh.vn
  9779. baria-vungtau.vn
  9780. bentre.vn
  9781. binhdinh.vn
  9782. binhduong.vn
  9783. binhphuoc.vn
  9784. binhthuan.vn
  9785. camau.vn
  9786. cantho.vn
  9787. caobang.vn
  9788. daklak.vn
  9789. daknong.vn
  9790. danang.vn
  9791. dienbien.vn
  9792. dongnai.vn
  9793. dongthap.vn
  9794. gialai.vn
  9795. hagiang.vn
  9796. haiduong.vn
  9797. haiphong.vn
  9798. hanam.vn
  9799. hanoi.vn
  9800. hatinh.vn
  9801. haugiang.vn
  9802. hoabinh.vn
  9803. hungyen.vn
  9804. khanhhoa.vn
  9805. kiengiang.vn
  9806. kontum.vn
  9807. laichau.vn
  9808. lamdong.vn
  9809. langson.vn
  9810. laocai.vn
  9811. longan.vn
  9812. namdinh.vn
  9813. nghean.vn
  9814. ninhbinh.vn
  9815. ninhthuan.vn
  9816. phutho.vn
  9817. phuyen.vn
  9818. quangbinh.vn
  9819. quangnam.vn
  9820. quangngai.vn
  9821. quangninh.vn
  9822. quangtri.vn
  9823. soctrang.vn
  9824. sonla.vn
  9825. tayninh.vn
  9826. thaibinh.vn
  9827. thainguyen.vn
  9828. thanhhoa.vn
  9829. thanhphohochiminh.vn
  9830. thuathienhue.vn
  9831. tiengiang.vn
  9832. travinh.vn
  9833. tuyenquang.vn
  9834. vinhlong.vn
  9835. vinhphuc.vn
  9836. yenbai.vn
  9837. // vu : https://en.wikipedia.org/wiki/.vu
  9838. // http://www.vunic.vu/
  9839. vu
  9840. com.vu
  9841. edu.vu
  9842. net.vu
  9843. org.vu
  9844. // wf : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf
  9845. wf
  9846. // ws : https://en.wikipedia.org/wiki/.ws
  9847. // http://samoanic.ws/index.dhtml
  9848. ws
  9849. com.ws
  9850. net.ws
  9851. org.ws
  9852. gov.ws
  9853. edu.ws
  9854. // yt : https://www.afnic.fr/wp-media/uploads/2022/12/afnic-naming-policy-2023-01-01.pdf
  9855. yt
  9856. // IDN ccTLDs
  9857. // When submitting patches, please maintain a sort by ISO 3166 ccTLD, then
  9858. // U-label, and follow this format:
  9859. // // A-Label ("<Latin renderings>", <language name>[, variant info]) : <ISO 3166 ccTLD>
  9860. // // [sponsoring org]
  9861. // U-Label
  9862. // xn--mgbaam7a8h ("Emerat", Arabic) : AE
  9863. // http://nic.ae/english/arabicdomain/rules.jsp
  9864. امارات
  9865. // xn--y9a3aq ("hye", Armenian) : AM
  9866. // ISOC AM (operated by .am Registry)
  9867. հայ
  9868. // xn--54b7fta0cc ("Bangla", Bangla) : BD
  9869. বাংলা
  9870. // xn--90ae ("bg", Bulgarian) : BG
  9871. бг
  9872. // xn--mgbcpq6gpa1a ("albahrain", Arabic) : BH
  9873. البحرين
  9874. // xn--90ais ("bel", Belarusian/Russian Cyrillic) : BY
  9875. // Operated by .by registry
  9876. бел
  9877. // xn--fiqs8s ("Zhongguo/China", Chinese, Simplified) : CN
  9878. // CNNIC
  9879. // http://cnnic.cn/html/Dir/2005/10/11/3218.htm
  9880. 中国
  9881. // xn--fiqz9s ("Zhongguo/China", Chinese, Traditional) : CN
  9882. // CNNIC
  9883. // http://cnnic.cn/html/Dir/2005/10/11/3218.htm
  9884. 中國
  9885. // xn--lgbbat1ad8j ("Algeria/Al Jazair", Arabic) : DZ
  9886. الجزائر
  9887. // xn--wgbh1c ("Egypt/Masr", Arabic) : EG
  9888. // http://www.dotmasr.eg/
  9889. مصر
  9890. // xn--e1a4c ("eu", Cyrillic) : EU
  9891. // https://eurid.eu
  9892. ею
  9893. // xn--qxa6a ("eu", Greek) : EU
  9894. // https://eurid.eu
  9895. ευ
  9896. // xn--mgbah1a3hjkrd ("Mauritania", Arabic) : MR
  9897. موريتانيا
  9898. // xn--node ("ge", Georgian Mkhedruli) : GE
  9899. გე
  9900. // xn--qxam ("el", Greek) : GR
  9901. // Hellenic Ministry of Infrastructure, Transport, and Networks
  9902. ελ
  9903. // xn--j6w193g ("Hong Kong", Chinese) : HK
  9904. // https://www.hkirc.hk
  9905. // Submitted by registry <hk.tech@hkirc.hk>
  9906. // https://www.hkirc.hk/content.jsp?id=30#!/34
  9907. 香港
  9908. 公司.香港
  9909. 教育.香港
  9910. 政府.香港
  9911. 個人.香港
  9912. 網絡.香港
  9913. 組織.香港
  9914. // xn--2scrj9c ("Bharat", Kannada) : IN
  9915. // India
  9916. ಭಾರತ
  9917. // xn--3hcrj9c ("Bharat", Oriya) : IN
  9918. // India
  9919. ଭାରତ
  9920. // xn--45br5cyl ("Bharatam", Assamese) : IN
  9921. // India
  9922. ভাৰত
  9923. // xn--h2breg3eve ("Bharatam", Sanskrit) : IN
  9924. // India
  9925. भारतम्
  9926. // xn--h2brj9c8c ("Bharot", Santali) : IN
  9927. // India
  9928. भारोत
  9929. // xn--mgbgu82a ("Bharat", Sindhi) : IN
  9930. // India
  9931. ڀارت
  9932. // xn--rvc1e0am3e ("Bharatam", Malayalam) : IN
  9933. // India
  9934. ഭാരതം
  9935. // xn--h2brj9c ("Bharat", Devanagari) : IN
  9936. // India
  9937. भारत
  9938. // xn--mgbbh1a ("Bharat", Kashmiri) : IN
  9939. // India
  9940. بارت
  9941. // xn--mgbbh1a71e ("Bharat", Arabic) : IN
  9942. // India
  9943. بھارت
  9944. // xn--fpcrj9c3d ("Bharat", Telugu) : IN
  9945. // India
  9946. భారత్
  9947. // xn--gecrj9c ("Bharat", Gujarati) : IN
  9948. // India
  9949. ભારત
  9950. // xn--s9brj9c ("Bharat", Gurmukhi) : IN
  9951. // India
  9952. ਭਾਰਤ
  9953. // xn--45brj9c ("Bharat", Bengali) : IN
  9954. // India
  9955. ভারত
  9956. // xn--xkc2dl3a5ee0h ("India", Tamil) : IN
  9957. // India
  9958. இந்தியா
  9959. // xn--mgba3a4f16a ("Iran", Persian) : IR
  9960. ایران
  9961. // xn--mgba3a4fra ("Iran", Arabic) : IR
  9962. ايران
  9963. // xn--mgbtx2b ("Iraq", Arabic) : IQ
  9964. // Communications and Media Commission
  9965. عراق
  9966. // xn--mgbayh7gpa ("al-Ordon", Arabic) : JO
  9967. // National Information Technology Center (NITC)
  9968. // Royal Scientific Society, Al-Jubeiha
  9969. الاردن
  9970. // xn--3e0b707e ("Republic of Korea", Hangul) : KR
  9971. 한국
  9972. // xn--80ao21a ("Kaz", Kazakh) : KZ
  9973. қаз
  9974. // xn--q7ce6a ("Lao", Lao) : LA
  9975. ລາວ
  9976. // xn--fzc2c9e2c ("Lanka", Sinhalese-Sinhala) : LK
  9977. // https://nic.lk
  9978. ලංකා
  9979. // xn--xkc2al3hye2a ("Ilangai", Tamil) : LK
  9980. // https://nic.lk
  9981. இலங்கை
  9982. // xn--mgbc0a9azcg ("Morocco/al-Maghrib", Arabic) : MA
  9983. المغرب
  9984. // xn--d1alf ("mkd", Macedonian) : MK
  9985. // MARnet
  9986. мкд
  9987. // xn--l1acc ("mon", Mongolian) : MN
  9988. мон
  9989. // xn--mix891f ("Macao", Chinese, Traditional) : MO
  9990. // MONIC / HNET Asia (Registry Operator for .mo)
  9991. 澳門
  9992. // xn--mix082f ("Macao", Chinese, Simplified) : MO
  9993. 澳门
  9994. // xn--mgbx4cd0ab ("Malaysia", Malay) : MY
  9995. مليسيا
  9996. // xn--mgb9awbf ("Oman", Arabic) : OM
  9997. عمان
  9998. // xn--mgbai9azgqp6j ("Pakistan", Urdu/Arabic) : PK
  9999. پاکستان
  10000. // xn--mgbai9a5eva00b ("Pakistan", Urdu/Arabic, variant) : PK
  10001. پاكستان
  10002. // xn--ygbi2ammx ("Falasteen", Arabic) : PS
  10003. // The Palestinian National Internet Naming Authority (PNINA)
  10004. // http://www.pnina.ps
  10005. فلسطين
  10006. // xn--90a3ac ("srb", Cyrillic) : RS
  10007. // https://www.rnids.rs/en/domains/national-domains
  10008. срб
  10009. пр.срб
  10010. орг.срб
  10011. обр.срб
  10012. од.срб
  10013. упр.срб
  10014. ак.срб
  10015. // xn--p1ai ("rf", Russian-Cyrillic) : RU
  10016. // https://cctld.ru/files/pdf/docs/en/rules_ru-rf.pdf
  10017. // Submitted by George Georgievsky <gug@cctld.ru>
  10018. рф
  10019. // xn--wgbl6a ("Qatar", Arabic) : QA
  10020. // http://www.ict.gov.qa/
  10021. قطر
  10022. // xn--mgberp4a5d4ar ("AlSaudiah", Arabic) : SA
  10023. // http://www.nic.net.sa/
  10024. السعودية
  10025. // xn--mgberp4a5d4a87g ("AlSaudiah", Arabic, variant) : SA
  10026. السعودیة
  10027. // xn--mgbqly7c0a67fbc ("AlSaudiah", Arabic, variant) : SA
  10028. السعودیۃ
  10029. // xn--mgbqly7cvafr ("AlSaudiah", Arabic, variant) : SA
  10030. السعوديه
  10031. // xn--mgbpl2fh ("sudan", Arabic) : SD
  10032. // Operated by .sd registry
  10033. سودان
  10034. // xn--yfro4i67o Singapore ("Singapore", Chinese) : SG
  10035. 新加坡
  10036. // xn--clchc0ea0b2g2a9gcd ("Singapore", Tamil) : SG
  10037. சிங்கப்பூர்
  10038. // xn--ogbpf8fl ("Syria", Arabic) : SY
  10039. سورية
  10040. // xn--mgbtf8fl ("Syria", Arabic, variant) : SY
  10041. سوريا
  10042. // xn--o3cw4h ("Thai", Thai) : TH
  10043. // http://www.thnic.co.th
  10044. ไทย
  10045. ศึกษา.ไทย
  10046. ธุรกิจ.ไทย
  10047. รัฐบาล.ไทย
  10048. ทหาร.ไทย
  10049. เน็ต.ไทย
  10050. องค์กร.ไทย
  10051. // xn--pgbs0dh ("Tunisia", Arabic) : TN
  10052. // http://nic.tn
  10053. تونس
  10054. // xn--kpry57d ("Taiwan", Chinese, Traditional) : TW
  10055. // http://www.twnic.net/english/dn/dn_07a.htm
  10056. 台灣
  10057. // xn--kprw13d ("Taiwan", Chinese, Simplified) : TW
  10058. // http://www.twnic.net/english/dn/dn_07a.htm
  10059. 台湾
  10060. // xn--nnx388a ("Taiwan", Chinese, variant) : TW
  10061. 臺灣
  10062. // xn--j1amh ("ukr", Cyrillic) : UA
  10063. укр
  10064. // xn--mgb2ddes ("AlYemen", Arabic) : YE
  10065. اليمن
  10066. // xxx : http://icmregistry.com
  10067. xxx
  10068. // ye : http://www.y.net.ye/services/domain_name.htm
  10069. ye
  10070. com.ye
  10071. edu.ye
  10072. gov.ye
  10073. net.ye
  10074. mil.ye
  10075. org.ye
  10076. // za : https://www.zadna.org.za/content/page/domain-information/
  10077. ac.za
  10078. agric.za
  10079. alt.za
  10080. co.za
  10081. edu.za
  10082. gov.za
  10083. grondar.za
  10084. law.za
  10085. mil.za
  10086. net.za
  10087. ngo.za
  10088. nic.za
  10089. nis.za
  10090. nom.za
  10091. org.za
  10092. school.za
  10093. tm.za
  10094. web.za
  10095. // zm : https://zicta.zm/
  10096. // Submitted by registry <info@zicta.zm>
  10097. zm
  10098. ac.zm
  10099. biz.zm
  10100. co.zm
  10101. com.zm
  10102. edu.zm
  10103. gov.zm
  10104. info.zm
  10105. mil.zm
  10106. net.zm
  10107. org.zm
  10108. sch.zm
  10109. // zw : https://www.potraz.gov.zw/
  10110. // Confirmed by registry <bmtengwa@potraz.gov.zw> 2017-01-25
  10111. zw
  10112. ac.zw
  10113. co.zw
  10114. gov.zw
  10115. mil.zw
  10116. org.zw
  10117. // newGTLDs
  10118. // List of new gTLDs imported from https://www.icann.org/resources/registries/gtlds/v2/gtlds.json on 2023-10-20T15:11:50Z
  10119. // This list is auto-generated, don't edit it manually.
  10120. // aaa : American Automobile Association, Inc.
  10121. // https://www.iana.org/domains/root/db/aaa.html
  10122. aaa
  10123. // aarp : AARP
  10124. // https://www.iana.org/domains/root/db/aarp.html
  10125. aarp
  10126. // abb : ABB Ltd
  10127. // https://www.iana.org/domains/root/db/abb.html
  10128. abb
  10129. // abbott : Abbott Laboratories, Inc.
  10130. // https://www.iana.org/domains/root/db/abbott.html
  10131. abbott
  10132. // abbvie : AbbVie Inc.
  10133. // https://www.iana.org/domains/root/db/abbvie.html
  10134. abbvie
  10135. // abc : Disney Enterprises, Inc.
  10136. // https://www.iana.org/domains/root/db/abc.html
  10137. abc
  10138. // able : Able Inc.
  10139. // https://www.iana.org/domains/root/db/able.html
  10140. able
  10141. // abogado : Registry Services, LLC
  10142. // https://www.iana.org/domains/root/db/abogado.html
  10143. abogado
  10144. // abudhabi : Abu Dhabi Systems and Information Centre
  10145. // https://www.iana.org/domains/root/db/abudhabi.html
  10146. abudhabi
  10147. // academy : Binky Moon, LLC
  10148. // https://www.iana.org/domains/root/db/academy.html
  10149. academy
  10150. // accenture : Accenture plc
  10151. // https://www.iana.org/domains/root/db/accenture.html
  10152. accenture
  10153. // accountant : dot Accountant Limited
  10154. // https://www.iana.org/domains/root/db/accountant.html
  10155. accountant
  10156. // accountants : Binky Moon, LLC
  10157. // https://www.iana.org/domains/root/db/accountants.html
  10158. accountants
  10159. // aco : ACO Severin Ahlmann GmbH & Co. KG
  10160. // https://www.iana.org/domains/root/db/aco.html
  10161. aco
  10162. // actor : Dog Beach, LLC
  10163. // https://www.iana.org/domains/root/db/actor.html
  10164. actor
  10165. // ads : Charleston Road Registry Inc.
  10166. // https://www.iana.org/domains/root/db/ads.html
  10167. ads
  10168. // adult : ICM Registry AD LLC
  10169. // https://www.iana.org/domains/root/db/adult.html
  10170. adult
  10171. // aeg : Aktiebolaget Electrolux
  10172. // https://www.iana.org/domains/root/db/aeg.html
  10173. aeg
  10174. // aetna : Aetna Life Insurance Company
  10175. // https://www.iana.org/domains/root/db/aetna.html
  10176. aetna
  10177. // afl : Australian Football League
  10178. // https://www.iana.org/domains/root/db/afl.html
  10179. afl
  10180. // africa : ZA Central Registry NPC trading as Registry.Africa
  10181. // https://www.iana.org/domains/root/db/africa.html
  10182. africa
  10183. // agakhan : Fondation Aga Khan (Aga Khan Foundation)
  10184. // https://www.iana.org/domains/root/db/agakhan.html
  10185. agakhan
  10186. // agency : Binky Moon, LLC
  10187. // https://www.iana.org/domains/root/db/agency.html
  10188. agency
  10189. // aig : American International Group, Inc.
  10190. // https://www.iana.org/domains/root/db/aig.html
  10191. aig
  10192. // airbus : Airbus S.A.S.
  10193. // https://www.iana.org/domains/root/db/airbus.html
  10194. airbus
  10195. // airforce : Dog Beach, LLC
  10196. // https://www.iana.org/domains/root/db/airforce.html
  10197. airforce
  10198. // airtel : Bharti Airtel Limited
  10199. // https://www.iana.org/domains/root/db/airtel.html
  10200. airtel
  10201. // akdn : Fondation Aga Khan (Aga Khan Foundation)
  10202. // https://www.iana.org/domains/root/db/akdn.html
  10203. akdn
  10204. // alibaba : Alibaba Group Holding Limited
  10205. // https://www.iana.org/domains/root/db/alibaba.html
  10206. alibaba
  10207. // alipay : Alibaba Group Holding Limited
  10208. // https://www.iana.org/domains/root/db/alipay.html
  10209. alipay
  10210. // allfinanz : Allfinanz Deutsche Vermögensberatung Aktiengesellschaft
  10211. // https://www.iana.org/domains/root/db/allfinanz.html
  10212. allfinanz
  10213. // allstate : Allstate Fire and Casualty Insurance Company
  10214. // https://www.iana.org/domains/root/db/allstate.html
  10215. allstate
  10216. // ally : Ally Financial Inc.
  10217. // https://www.iana.org/domains/root/db/ally.html
  10218. ally
  10219. // alsace : Region Grand Est
  10220. // https://www.iana.org/domains/root/db/alsace.html
  10221. alsace
  10222. // alstom : ALSTOM
  10223. // https://www.iana.org/domains/root/db/alstom.html
  10224. alstom
  10225. // amazon : Amazon Registry Services, Inc.
  10226. // https://www.iana.org/domains/root/db/amazon.html
  10227. amazon
  10228. // americanexpress : American Express Travel Related Services Company, Inc.
  10229. // https://www.iana.org/domains/root/db/americanexpress.html
  10230. americanexpress
  10231. // americanfamily : AmFam, Inc.
  10232. // https://www.iana.org/domains/root/db/americanfamily.html
  10233. americanfamily
  10234. // amex : American Express Travel Related Services Company, Inc.
  10235. // https://www.iana.org/domains/root/db/amex.html
  10236. amex
  10237. // amfam : AmFam, Inc.
  10238. // https://www.iana.org/domains/root/db/amfam.html
  10239. amfam
  10240. // amica : Amica Mutual Insurance Company
  10241. // https://www.iana.org/domains/root/db/amica.html
  10242. amica
  10243. // amsterdam : Gemeente Amsterdam
  10244. // https://www.iana.org/domains/root/db/amsterdam.html
  10245. amsterdam
  10246. // analytics : Campus IP LLC
  10247. // https://www.iana.org/domains/root/db/analytics.html
  10248. analytics
  10249. // android : Charleston Road Registry Inc.
  10250. // https://www.iana.org/domains/root/db/android.html
  10251. android
  10252. // anquan : Beijing Qihu Keji Co., Ltd.
  10253. // https://www.iana.org/domains/root/db/anquan.html
  10254. anquan
  10255. // anz : Australia and New Zealand Banking Group Limited
  10256. // https://www.iana.org/domains/root/db/anz.html
  10257. anz
  10258. // aol : Oath Inc.
  10259. // https://www.iana.org/domains/root/db/aol.html
  10260. aol
  10261. // apartments : Binky Moon, LLC
  10262. // https://www.iana.org/domains/root/db/apartments.html
  10263. apartments
  10264. // app : Charleston Road Registry Inc.
  10265. // https://www.iana.org/domains/root/db/app.html
  10266. app
  10267. // apple : Apple Inc.
  10268. // https://www.iana.org/domains/root/db/apple.html
  10269. apple
  10270. // aquarelle : Aquarelle.com
  10271. // https://www.iana.org/domains/root/db/aquarelle.html
  10272. aquarelle
  10273. // arab : League of Arab States
  10274. // https://www.iana.org/domains/root/db/arab.html
  10275. arab
  10276. // aramco : Aramco Services Company
  10277. // https://www.iana.org/domains/root/db/aramco.html
  10278. aramco
  10279. // archi : Identity Digital Limited
  10280. // https://www.iana.org/domains/root/db/archi.html
  10281. archi
  10282. // army : Dog Beach, LLC
  10283. // https://www.iana.org/domains/root/db/army.html
  10284. army
  10285. // art : UK Creative Ideas Limited
  10286. // https://www.iana.org/domains/root/db/art.html
  10287. art
  10288. // arte : Association Relative à la Télévision Européenne G.E.I.E.
  10289. // https://www.iana.org/domains/root/db/arte.html
  10290. arte
  10291. // asda : Wal-Mart Stores, Inc.
  10292. // https://www.iana.org/domains/root/db/asda.html
  10293. asda
  10294. // associates : Binky Moon, LLC
  10295. // https://www.iana.org/domains/root/db/associates.html
  10296. associates
  10297. // athleta : The Gap, Inc.
  10298. // https://www.iana.org/domains/root/db/athleta.html
  10299. athleta
  10300. // attorney : Dog Beach, LLC
  10301. // https://www.iana.org/domains/root/db/attorney.html
  10302. attorney
  10303. // auction : Dog Beach, LLC
  10304. // https://www.iana.org/domains/root/db/auction.html
  10305. auction
  10306. // audi : AUDI Aktiengesellschaft
  10307. // https://www.iana.org/domains/root/db/audi.html
  10308. audi
  10309. // audible : Amazon Registry Services, Inc.
  10310. // https://www.iana.org/domains/root/db/audible.html
  10311. audible
  10312. // audio : XYZ.COM LLC
  10313. // https://www.iana.org/domains/root/db/audio.html
  10314. audio
  10315. // auspost : Australian Postal Corporation
  10316. // https://www.iana.org/domains/root/db/auspost.html
  10317. auspost
  10318. // author : Amazon Registry Services, Inc.
  10319. // https://www.iana.org/domains/root/db/author.html
  10320. author
  10321. // auto : XYZ.COM LLC
  10322. // https://www.iana.org/domains/root/db/auto.html
  10323. auto
  10324. // autos : XYZ.COM LLC
  10325. // https://www.iana.org/domains/root/db/autos.html
  10326. autos
  10327. // avianca : Avianca Inc.
  10328. // https://www.iana.org/domains/root/db/avianca.html
  10329. avianca
  10330. // aws : AWS Registry LLC
  10331. // https://www.iana.org/domains/root/db/aws.html
  10332. aws
  10333. // axa : AXA Group Operations SAS
  10334. // https://www.iana.org/domains/root/db/axa.html
  10335. axa
  10336. // azure : Microsoft Corporation
  10337. // https://www.iana.org/domains/root/db/azure.html
  10338. azure
  10339. // baby : XYZ.COM LLC
  10340. // https://www.iana.org/domains/root/db/baby.html
  10341. baby
  10342. // baidu : Baidu, Inc.
  10343. // https://www.iana.org/domains/root/db/baidu.html
  10344. baidu
  10345. // banamex : Citigroup Inc.
  10346. // https://www.iana.org/domains/root/db/banamex.html
  10347. banamex
  10348. // bananarepublic : The Gap, Inc.
  10349. // https://www.iana.org/domains/root/db/bananarepublic.html
  10350. bananarepublic
  10351. // band : Dog Beach, LLC
  10352. // https://www.iana.org/domains/root/db/band.html
  10353. band
  10354. // bank : fTLD Registry Services LLC
  10355. // https://www.iana.org/domains/root/db/bank.html
  10356. bank
  10357. // bar : Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable
  10358. // https://www.iana.org/domains/root/db/bar.html
  10359. bar
  10360. // barcelona : Municipi de Barcelona
  10361. // https://www.iana.org/domains/root/db/barcelona.html
  10362. barcelona
  10363. // barclaycard : Barclays Bank PLC
  10364. // https://www.iana.org/domains/root/db/barclaycard.html
  10365. barclaycard
  10366. // barclays : Barclays Bank PLC
  10367. // https://www.iana.org/domains/root/db/barclays.html
  10368. barclays
  10369. // barefoot : Gallo Vineyards, Inc.
  10370. // https://www.iana.org/domains/root/db/barefoot.html
  10371. barefoot
  10372. // bargains : Binky Moon, LLC
  10373. // https://www.iana.org/domains/root/db/bargains.html
  10374. bargains
  10375. // baseball : MLB Advanced Media DH, LLC
  10376. // https://www.iana.org/domains/root/db/baseball.html
  10377. baseball
  10378. // basketball : Fédération Internationale de Basketball (FIBA)
  10379. // https://www.iana.org/domains/root/db/basketball.html
  10380. basketball
  10381. // bauhaus : Werkhaus GmbH
  10382. // https://www.iana.org/domains/root/db/bauhaus.html
  10383. bauhaus
  10384. // bayern : Bayern Connect GmbH
  10385. // https://www.iana.org/domains/root/db/bayern.html
  10386. bayern
  10387. // bbc : British Broadcasting Corporation
  10388. // https://www.iana.org/domains/root/db/bbc.html
  10389. bbc
  10390. // bbt : BB&T Corporation
  10391. // https://www.iana.org/domains/root/db/bbt.html
  10392. bbt
  10393. // bbva : BANCO BILBAO VIZCAYA ARGENTARIA, S.A.
  10394. // https://www.iana.org/domains/root/db/bbva.html
  10395. bbva
  10396. // bcg : The Boston Consulting Group, Inc.
  10397. // https://www.iana.org/domains/root/db/bcg.html
  10398. bcg
  10399. // bcn : Municipi de Barcelona
  10400. // https://www.iana.org/domains/root/db/bcn.html
  10401. bcn
  10402. // beats : Beats Electronics, LLC
  10403. // https://www.iana.org/domains/root/db/beats.html
  10404. beats
  10405. // beauty : XYZ.COM LLC
  10406. // https://www.iana.org/domains/root/db/beauty.html
  10407. beauty
  10408. // beer : Registry Services, LLC
  10409. // https://www.iana.org/domains/root/db/beer.html
  10410. beer
  10411. // bentley : Bentley Motors Limited
  10412. // https://www.iana.org/domains/root/db/bentley.html
  10413. bentley
  10414. // berlin : dotBERLIN GmbH & Co. KG
  10415. // https://www.iana.org/domains/root/db/berlin.html
  10416. berlin
  10417. // best : BestTLD Pty Ltd
  10418. // https://www.iana.org/domains/root/db/best.html
  10419. best
  10420. // bestbuy : BBY Solutions, Inc.
  10421. // https://www.iana.org/domains/root/db/bestbuy.html
  10422. bestbuy
  10423. // bet : Identity Digital Limited
  10424. // https://www.iana.org/domains/root/db/bet.html
  10425. bet
  10426. // bharti : Bharti Enterprises (Holding) Private Limited
  10427. // https://www.iana.org/domains/root/db/bharti.html
  10428. bharti
  10429. // bible : American Bible Society
  10430. // https://www.iana.org/domains/root/db/bible.html
  10431. bible
  10432. // bid : dot Bid Limited
  10433. // https://www.iana.org/domains/root/db/bid.html
  10434. bid
  10435. // bike : Binky Moon, LLC
  10436. // https://www.iana.org/domains/root/db/bike.html
  10437. bike
  10438. // bing : Microsoft Corporation
  10439. // https://www.iana.org/domains/root/db/bing.html
  10440. bing
  10441. // bingo : Binky Moon, LLC
  10442. // https://www.iana.org/domains/root/db/bingo.html
  10443. bingo
  10444. // bio : Identity Digital Limited
  10445. // https://www.iana.org/domains/root/db/bio.html
  10446. bio
  10447. // black : Identity Digital Limited
  10448. // https://www.iana.org/domains/root/db/black.html
  10449. black
  10450. // blackfriday : Registry Services, LLC
  10451. // https://www.iana.org/domains/root/db/blackfriday.html
  10452. blackfriday
  10453. // blockbuster : Dish DBS Corporation
  10454. // https://www.iana.org/domains/root/db/blockbuster.html
  10455. blockbuster
  10456. // blog : Knock Knock WHOIS There, LLC
  10457. // https://www.iana.org/domains/root/db/blog.html
  10458. blog
  10459. // bloomberg : Bloomberg IP Holdings LLC
  10460. // https://www.iana.org/domains/root/db/bloomberg.html
  10461. bloomberg
  10462. // blue : Identity Digital Limited
  10463. // https://www.iana.org/domains/root/db/blue.html
  10464. blue
  10465. // bms : Bristol-Myers Squibb Company
  10466. // https://www.iana.org/domains/root/db/bms.html
  10467. bms
  10468. // bmw : Bayerische Motoren Werke Aktiengesellschaft
  10469. // https://www.iana.org/domains/root/db/bmw.html
  10470. bmw
  10471. // bnpparibas : BNP Paribas
  10472. // https://www.iana.org/domains/root/db/bnpparibas.html
  10473. bnpparibas
  10474. // boats : XYZ.COM LLC
  10475. // https://www.iana.org/domains/root/db/boats.html
  10476. boats
  10477. // boehringer : Boehringer Ingelheim International GmbH
  10478. // https://www.iana.org/domains/root/db/boehringer.html
  10479. boehringer
  10480. // bofa : Bank of America Corporation
  10481. // https://www.iana.org/domains/root/db/bofa.html
  10482. bofa
  10483. // bom : Núcleo de Informação e Coordenação do Ponto BR - NIC.br
  10484. // https://www.iana.org/domains/root/db/bom.html
  10485. bom
  10486. // bond : ShortDot SA
  10487. // https://www.iana.org/domains/root/db/bond.html
  10488. bond
  10489. // boo : Charleston Road Registry Inc.
  10490. // https://www.iana.org/domains/root/db/boo.html
  10491. boo
  10492. // book : Amazon Registry Services, Inc.
  10493. // https://www.iana.org/domains/root/db/book.html
  10494. book
  10495. // booking : Booking.com B.V.
  10496. // https://www.iana.org/domains/root/db/booking.html
  10497. booking
  10498. // bosch : Robert Bosch GMBH
  10499. // https://www.iana.org/domains/root/db/bosch.html
  10500. bosch
  10501. // bostik : Bostik SA
  10502. // https://www.iana.org/domains/root/db/bostik.html
  10503. bostik
  10504. // boston : Registry Services, LLC
  10505. // https://www.iana.org/domains/root/db/boston.html
  10506. boston
  10507. // bot : Amazon Registry Services, Inc.
  10508. // https://www.iana.org/domains/root/db/bot.html
  10509. bot
  10510. // boutique : Binky Moon, LLC
  10511. // https://www.iana.org/domains/root/db/boutique.html
  10512. boutique
  10513. // box : Intercap Registry Inc.
  10514. // https://www.iana.org/domains/root/db/box.html
  10515. box
  10516. // bradesco : Banco Bradesco S.A.
  10517. // https://www.iana.org/domains/root/db/bradesco.html
  10518. bradesco
  10519. // bridgestone : Bridgestone Corporation
  10520. // https://www.iana.org/domains/root/db/bridgestone.html
  10521. bridgestone
  10522. // broadway : Celebrate Broadway, Inc.
  10523. // https://www.iana.org/domains/root/db/broadway.html
  10524. broadway
  10525. // broker : Dog Beach, LLC
  10526. // https://www.iana.org/domains/root/db/broker.html
  10527. broker
  10528. // brother : Brother Industries, Ltd.
  10529. // https://www.iana.org/domains/root/db/brother.html
  10530. brother
  10531. // brussels : DNS.be vzw
  10532. // https://www.iana.org/domains/root/db/brussels.html
  10533. brussels
  10534. // build : Plan Bee LLC
  10535. // https://www.iana.org/domains/root/db/build.html
  10536. build
  10537. // builders : Binky Moon, LLC
  10538. // https://www.iana.org/domains/root/db/builders.html
  10539. builders
  10540. // business : Binky Moon, LLC
  10541. // https://www.iana.org/domains/root/db/business.html
  10542. business
  10543. // buy : Amazon Registry Services, Inc.
  10544. // https://www.iana.org/domains/root/db/buy.html
  10545. buy
  10546. // buzz : DOTSTRATEGY CO.
  10547. // https://www.iana.org/domains/root/db/buzz.html
  10548. buzz
  10549. // bzh : Association www.bzh
  10550. // https://www.iana.org/domains/root/db/bzh.html
  10551. bzh
  10552. // cab : Binky Moon, LLC
  10553. // https://www.iana.org/domains/root/db/cab.html
  10554. cab
  10555. // cafe : Binky Moon, LLC
  10556. // https://www.iana.org/domains/root/db/cafe.html
  10557. cafe
  10558. // cal : Charleston Road Registry Inc.
  10559. // https://www.iana.org/domains/root/db/cal.html
  10560. cal
  10561. // call : Amazon Registry Services, Inc.
  10562. // https://www.iana.org/domains/root/db/call.html
  10563. call
  10564. // calvinklein : PVH gTLD Holdings LLC
  10565. // https://www.iana.org/domains/root/db/calvinklein.html
  10566. calvinklein
  10567. // cam : Cam Connecting SARL
  10568. // https://www.iana.org/domains/root/db/cam.html
  10569. cam
  10570. // camera : Binky Moon, LLC
  10571. // https://www.iana.org/domains/root/db/camera.html
  10572. camera
  10573. // camp : Binky Moon, LLC
  10574. // https://www.iana.org/domains/root/db/camp.html
  10575. camp
  10576. // canon : Canon Inc.
  10577. // https://www.iana.org/domains/root/db/canon.html
  10578. canon
  10579. // capetown : ZA Central Registry NPC trading as ZA Central Registry
  10580. // https://www.iana.org/domains/root/db/capetown.html
  10581. capetown
  10582. // capital : Binky Moon, LLC
  10583. // https://www.iana.org/domains/root/db/capital.html
  10584. capital
  10585. // capitalone : Capital One Financial Corporation
  10586. // https://www.iana.org/domains/root/db/capitalone.html
  10587. capitalone
  10588. // car : XYZ.COM LLC
  10589. // https://www.iana.org/domains/root/db/car.html
  10590. car
  10591. // caravan : Caravan International, Inc.
  10592. // https://www.iana.org/domains/root/db/caravan.html
  10593. caravan
  10594. // cards : Binky Moon, LLC
  10595. // https://www.iana.org/domains/root/db/cards.html
  10596. cards
  10597. // care : Binky Moon, LLC
  10598. // https://www.iana.org/domains/root/db/care.html
  10599. care
  10600. // career : dotCareer LLC
  10601. // https://www.iana.org/domains/root/db/career.html
  10602. career
  10603. // careers : Binky Moon, LLC
  10604. // https://www.iana.org/domains/root/db/careers.html
  10605. careers
  10606. // cars : XYZ.COM LLC
  10607. // https://www.iana.org/domains/root/db/cars.html
  10608. cars
  10609. // casa : Registry Services, LLC
  10610. // https://www.iana.org/domains/root/db/casa.html
  10611. casa
  10612. // case : Digity, LLC
  10613. // https://www.iana.org/domains/root/db/case.html
  10614. case
  10615. // cash : Binky Moon, LLC
  10616. // https://www.iana.org/domains/root/db/cash.html
  10617. cash
  10618. // casino : Binky Moon, LLC
  10619. // https://www.iana.org/domains/root/db/casino.html
  10620. casino
  10621. // catering : Binky Moon, LLC
  10622. // https://www.iana.org/domains/root/db/catering.html
  10623. catering
  10624. // catholic : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)
  10625. // https://www.iana.org/domains/root/db/catholic.html
  10626. catholic
  10627. // cba : COMMONWEALTH BANK OF AUSTRALIA
  10628. // https://www.iana.org/domains/root/db/cba.html
  10629. cba
  10630. // cbn : The Christian Broadcasting Network, Inc.
  10631. // https://www.iana.org/domains/root/db/cbn.html
  10632. cbn
  10633. // cbre : CBRE, Inc.
  10634. // https://www.iana.org/domains/root/db/cbre.html
  10635. cbre
  10636. // cbs : CBS Domains Inc.
  10637. // https://www.iana.org/domains/root/db/cbs.html
  10638. cbs
  10639. // center : Binky Moon, LLC
  10640. // https://www.iana.org/domains/root/db/center.html
  10641. center
  10642. // ceo : XYZ.COM LLC
  10643. // https://www.iana.org/domains/root/db/ceo.html
  10644. ceo
  10645. // cern : European Organization for Nuclear Research ("CERN")
  10646. // https://www.iana.org/domains/root/db/cern.html
  10647. cern
  10648. // cfa : CFA Institute
  10649. // https://www.iana.org/domains/root/db/cfa.html
  10650. cfa
  10651. // cfd : ShortDot SA
  10652. // https://www.iana.org/domains/root/db/cfd.html
  10653. cfd
  10654. // chanel : Chanel International B.V.
  10655. // https://www.iana.org/domains/root/db/chanel.html
  10656. chanel
  10657. // channel : Charleston Road Registry Inc.
  10658. // https://www.iana.org/domains/root/db/channel.html
  10659. channel
  10660. // charity : Public Interest Registry
  10661. // https://www.iana.org/domains/root/db/charity.html
  10662. charity
  10663. // chase : JPMorgan Chase Bank, National Association
  10664. // https://www.iana.org/domains/root/db/chase.html
  10665. chase
  10666. // chat : Binky Moon, LLC
  10667. // https://www.iana.org/domains/root/db/chat.html
  10668. chat
  10669. // cheap : Binky Moon, LLC
  10670. // https://www.iana.org/domains/root/db/cheap.html
  10671. cheap
  10672. // chintai : CHINTAI Corporation
  10673. // https://www.iana.org/domains/root/db/chintai.html
  10674. chintai
  10675. // christmas : XYZ.COM LLC
  10676. // https://www.iana.org/domains/root/db/christmas.html
  10677. christmas
  10678. // chrome : Charleston Road Registry Inc.
  10679. // https://www.iana.org/domains/root/db/chrome.html
  10680. chrome
  10681. // church : Binky Moon, LLC
  10682. // https://www.iana.org/domains/root/db/church.html
  10683. church
  10684. // cipriani : Hotel Cipriani Srl
  10685. // https://www.iana.org/domains/root/db/cipriani.html
  10686. cipriani
  10687. // circle : Amazon Registry Services, Inc.
  10688. // https://www.iana.org/domains/root/db/circle.html
  10689. circle
  10690. // cisco : Cisco Technology, Inc.
  10691. // https://www.iana.org/domains/root/db/cisco.html
  10692. cisco
  10693. // citadel : Citadel Domain LLC
  10694. // https://www.iana.org/domains/root/db/citadel.html
  10695. citadel
  10696. // citi : Citigroup Inc.
  10697. // https://www.iana.org/domains/root/db/citi.html
  10698. citi
  10699. // citic : CITIC Group Corporation
  10700. // https://www.iana.org/domains/root/db/citic.html
  10701. citic
  10702. // city : Binky Moon, LLC
  10703. // https://www.iana.org/domains/root/db/city.html
  10704. city
  10705. // claims : Binky Moon, LLC
  10706. // https://www.iana.org/domains/root/db/claims.html
  10707. claims
  10708. // cleaning : Binky Moon, LLC
  10709. // https://www.iana.org/domains/root/db/cleaning.html
  10710. cleaning
  10711. // click : Internet Naming Company LLC
  10712. // https://www.iana.org/domains/root/db/click.html
  10713. click
  10714. // clinic : Binky Moon, LLC
  10715. // https://www.iana.org/domains/root/db/clinic.html
  10716. clinic
  10717. // clinique : The Estée Lauder Companies Inc.
  10718. // https://www.iana.org/domains/root/db/clinique.html
  10719. clinique
  10720. // clothing : Binky Moon, LLC
  10721. // https://www.iana.org/domains/root/db/clothing.html
  10722. clothing
  10723. // cloud : Aruba PEC S.p.A.
  10724. // https://www.iana.org/domains/root/db/cloud.html
  10725. cloud
  10726. // club : Registry Services, LLC
  10727. // https://www.iana.org/domains/root/db/club.html
  10728. club
  10729. // clubmed : Club Méditerranée S.A.
  10730. // https://www.iana.org/domains/root/db/clubmed.html
  10731. clubmed
  10732. // coach : Binky Moon, LLC
  10733. // https://www.iana.org/domains/root/db/coach.html
  10734. coach
  10735. // codes : Binky Moon, LLC
  10736. // https://www.iana.org/domains/root/db/codes.html
  10737. codes
  10738. // coffee : Binky Moon, LLC
  10739. // https://www.iana.org/domains/root/db/coffee.html
  10740. coffee
  10741. // college : XYZ.COM LLC
  10742. // https://www.iana.org/domains/root/db/college.html
  10743. college
  10744. // cologne : dotKoeln GmbH
  10745. // https://www.iana.org/domains/root/db/cologne.html
  10746. cologne
  10747. // comcast : Comcast IP Holdings I, LLC
  10748. // https://www.iana.org/domains/root/db/comcast.html
  10749. comcast
  10750. // commbank : COMMONWEALTH BANK OF AUSTRALIA
  10751. // https://www.iana.org/domains/root/db/commbank.html
  10752. commbank
  10753. // community : Binky Moon, LLC
  10754. // https://www.iana.org/domains/root/db/community.html
  10755. community
  10756. // company : Binky Moon, LLC
  10757. // https://www.iana.org/domains/root/db/company.html
  10758. company
  10759. // compare : Registry Services, LLC
  10760. // https://www.iana.org/domains/root/db/compare.html
  10761. compare
  10762. // computer : Binky Moon, LLC
  10763. // https://www.iana.org/domains/root/db/computer.html
  10764. computer
  10765. // comsec : VeriSign, Inc.
  10766. // https://www.iana.org/domains/root/db/comsec.html
  10767. comsec
  10768. // condos : Binky Moon, LLC
  10769. // https://www.iana.org/domains/root/db/condos.html
  10770. condos
  10771. // construction : Binky Moon, LLC
  10772. // https://www.iana.org/domains/root/db/construction.html
  10773. construction
  10774. // consulting : Dog Beach, LLC
  10775. // https://www.iana.org/domains/root/db/consulting.html
  10776. consulting
  10777. // contact : Dog Beach, LLC
  10778. // https://www.iana.org/domains/root/db/contact.html
  10779. contact
  10780. // contractors : Binky Moon, LLC
  10781. // https://www.iana.org/domains/root/db/contractors.html
  10782. contractors
  10783. // cooking : Registry Services, LLC
  10784. // https://www.iana.org/domains/root/db/cooking.html
  10785. cooking
  10786. // cool : Binky Moon, LLC
  10787. // https://www.iana.org/domains/root/db/cool.html
  10788. cool
  10789. // corsica : Collectivité de Corse
  10790. // https://www.iana.org/domains/root/db/corsica.html
  10791. corsica
  10792. // country : Internet Naming Company LLC
  10793. // https://www.iana.org/domains/root/db/country.html
  10794. country
  10795. // coupon : Amazon Registry Services, Inc.
  10796. // https://www.iana.org/domains/root/db/coupon.html
  10797. coupon
  10798. // coupons : Binky Moon, LLC
  10799. // https://www.iana.org/domains/root/db/coupons.html
  10800. coupons
  10801. // courses : Registry Services, LLC
  10802. // https://www.iana.org/domains/root/db/courses.html
  10803. courses
  10804. // cpa : American Institute of Certified Public Accountants
  10805. // https://www.iana.org/domains/root/db/cpa.html
  10806. cpa
  10807. // credit : Binky Moon, LLC
  10808. // https://www.iana.org/domains/root/db/credit.html
  10809. credit
  10810. // creditcard : Binky Moon, LLC
  10811. // https://www.iana.org/domains/root/db/creditcard.html
  10812. creditcard
  10813. // creditunion : DotCooperation LLC
  10814. // https://www.iana.org/domains/root/db/creditunion.html
  10815. creditunion
  10816. // cricket : dot Cricket Limited
  10817. // https://www.iana.org/domains/root/db/cricket.html
  10818. cricket
  10819. // crown : Crown Equipment Corporation
  10820. // https://www.iana.org/domains/root/db/crown.html
  10821. crown
  10822. // crs : Federated Co-operatives Limited
  10823. // https://www.iana.org/domains/root/db/crs.html
  10824. crs
  10825. // cruise : Viking River Cruises (Bermuda) Ltd.
  10826. // https://www.iana.org/domains/root/db/cruise.html
  10827. cruise
  10828. // cruises : Binky Moon, LLC
  10829. // https://www.iana.org/domains/root/db/cruises.html
  10830. cruises
  10831. // cuisinella : SCHMIDT GROUPE S.A.S.
  10832. // https://www.iana.org/domains/root/db/cuisinella.html
  10833. cuisinella
  10834. // cymru : Nominet UK
  10835. // https://www.iana.org/domains/root/db/cymru.html
  10836. cymru
  10837. // cyou : ShortDot SA
  10838. // https://www.iana.org/domains/root/db/cyou.html
  10839. cyou
  10840. // dabur : Dabur India Limited
  10841. // https://www.iana.org/domains/root/db/dabur.html
  10842. dabur
  10843. // dad : Charleston Road Registry Inc.
  10844. // https://www.iana.org/domains/root/db/dad.html
  10845. dad
  10846. // dance : Dog Beach, LLC
  10847. // https://www.iana.org/domains/root/db/dance.html
  10848. dance
  10849. // data : Dish DBS Corporation
  10850. // https://www.iana.org/domains/root/db/data.html
  10851. data
  10852. // date : dot Date Limited
  10853. // https://www.iana.org/domains/root/db/date.html
  10854. date
  10855. // dating : Binky Moon, LLC
  10856. // https://www.iana.org/domains/root/db/dating.html
  10857. dating
  10858. // datsun : NISSAN MOTOR CO., LTD.
  10859. // https://www.iana.org/domains/root/db/datsun.html
  10860. datsun
  10861. // day : Charleston Road Registry Inc.
  10862. // https://www.iana.org/domains/root/db/day.html
  10863. day
  10864. // dclk : Charleston Road Registry Inc.
  10865. // https://www.iana.org/domains/root/db/dclk.html
  10866. dclk
  10867. // dds : Registry Services, LLC
  10868. // https://www.iana.org/domains/root/db/dds.html
  10869. dds
  10870. // deal : Amazon Registry Services, Inc.
  10871. // https://www.iana.org/domains/root/db/deal.html
  10872. deal
  10873. // dealer : Intercap Registry Inc.
  10874. // https://www.iana.org/domains/root/db/dealer.html
  10875. dealer
  10876. // deals : Binky Moon, LLC
  10877. // https://www.iana.org/domains/root/db/deals.html
  10878. deals
  10879. // degree : Dog Beach, LLC
  10880. // https://www.iana.org/domains/root/db/degree.html
  10881. degree
  10882. // delivery : Binky Moon, LLC
  10883. // https://www.iana.org/domains/root/db/delivery.html
  10884. delivery
  10885. // dell : Dell Inc.
  10886. // https://www.iana.org/domains/root/db/dell.html
  10887. dell
  10888. // deloitte : Deloitte Touche Tohmatsu
  10889. // https://www.iana.org/domains/root/db/deloitte.html
  10890. deloitte
  10891. // delta : Delta Air Lines, Inc.
  10892. // https://www.iana.org/domains/root/db/delta.html
  10893. delta
  10894. // democrat : Dog Beach, LLC
  10895. // https://www.iana.org/domains/root/db/democrat.html
  10896. democrat
  10897. // dental : Binky Moon, LLC
  10898. // https://www.iana.org/domains/root/db/dental.html
  10899. dental
  10900. // dentist : Dog Beach, LLC
  10901. // https://www.iana.org/domains/root/db/dentist.html
  10902. dentist
  10903. // desi : Desi Networks LLC
  10904. // https://www.iana.org/domains/root/db/desi.html
  10905. desi
  10906. // design : Registry Services, LLC
  10907. // https://www.iana.org/domains/root/db/design.html
  10908. design
  10909. // dev : Charleston Road Registry Inc.
  10910. // https://www.iana.org/domains/root/db/dev.html
  10911. dev
  10912. // dhl : Deutsche Post AG
  10913. // https://www.iana.org/domains/root/db/dhl.html
  10914. dhl
  10915. // diamonds : Binky Moon, LLC
  10916. // https://www.iana.org/domains/root/db/diamonds.html
  10917. diamonds
  10918. // diet : XYZ.COM LLC
  10919. // https://www.iana.org/domains/root/db/diet.html
  10920. diet
  10921. // digital : Binky Moon, LLC
  10922. // https://www.iana.org/domains/root/db/digital.html
  10923. digital
  10924. // direct : Binky Moon, LLC
  10925. // https://www.iana.org/domains/root/db/direct.html
  10926. direct
  10927. // directory : Binky Moon, LLC
  10928. // https://www.iana.org/domains/root/db/directory.html
  10929. directory
  10930. // discount : Binky Moon, LLC
  10931. // https://www.iana.org/domains/root/db/discount.html
  10932. discount
  10933. // discover : Discover Financial Services
  10934. // https://www.iana.org/domains/root/db/discover.html
  10935. discover
  10936. // dish : Dish DBS Corporation
  10937. // https://www.iana.org/domains/root/db/dish.html
  10938. dish
  10939. // diy : Lifestyle Domain Holdings, Inc.
  10940. // https://www.iana.org/domains/root/db/diy.html
  10941. diy
  10942. // dnp : Dai Nippon Printing Co., Ltd.
  10943. // https://www.iana.org/domains/root/db/dnp.html
  10944. dnp
  10945. // docs : Charleston Road Registry Inc.
  10946. // https://www.iana.org/domains/root/db/docs.html
  10947. docs
  10948. // doctor : Binky Moon, LLC
  10949. // https://www.iana.org/domains/root/db/doctor.html
  10950. doctor
  10951. // dog : Binky Moon, LLC
  10952. // https://www.iana.org/domains/root/db/dog.html
  10953. dog
  10954. // domains : Binky Moon, LLC
  10955. // https://www.iana.org/domains/root/db/domains.html
  10956. domains
  10957. // dot : Dish DBS Corporation
  10958. // https://www.iana.org/domains/root/db/dot.html
  10959. dot
  10960. // download : dot Support Limited
  10961. // https://www.iana.org/domains/root/db/download.html
  10962. download
  10963. // drive : Charleston Road Registry Inc.
  10964. // https://www.iana.org/domains/root/db/drive.html
  10965. drive
  10966. // dtv : Dish DBS Corporation
  10967. // https://www.iana.org/domains/root/db/dtv.html
  10968. dtv
  10969. // dubai : Dubai Smart Government Department
  10970. // https://www.iana.org/domains/root/db/dubai.html
  10971. dubai
  10972. // dunlop : The Goodyear Tire & Rubber Company
  10973. // https://www.iana.org/domains/root/db/dunlop.html
  10974. dunlop
  10975. // dupont : DuPont Specialty Products USA, LLC
  10976. // https://www.iana.org/domains/root/db/dupont.html
  10977. dupont
  10978. // durban : ZA Central Registry NPC trading as ZA Central Registry
  10979. // https://www.iana.org/domains/root/db/durban.html
  10980. durban
  10981. // dvag : Deutsche Vermögensberatung Aktiengesellschaft DVAG
  10982. // https://www.iana.org/domains/root/db/dvag.html
  10983. dvag
  10984. // dvr : DISH Technologies L.L.C.
  10985. // https://www.iana.org/domains/root/db/dvr.html
  10986. dvr
  10987. // earth : Interlink Systems Innovation Institute K.K.
  10988. // https://www.iana.org/domains/root/db/earth.html
  10989. earth
  10990. // eat : Charleston Road Registry Inc.
  10991. // https://www.iana.org/domains/root/db/eat.html
  10992. eat
  10993. // eco : Big Room Inc.
  10994. // https://www.iana.org/domains/root/db/eco.html
  10995. eco
  10996. // edeka : EDEKA Verband kaufmännischer Genossenschaften e.V.
  10997. // https://www.iana.org/domains/root/db/edeka.html
  10998. edeka
  10999. // education : Binky Moon, LLC
  11000. // https://www.iana.org/domains/root/db/education.html
  11001. education
  11002. // email : Binky Moon, LLC
  11003. // https://www.iana.org/domains/root/db/email.html
  11004. email
  11005. // emerck : Merck KGaA
  11006. // https://www.iana.org/domains/root/db/emerck.html
  11007. emerck
  11008. // energy : Binky Moon, LLC
  11009. // https://www.iana.org/domains/root/db/energy.html
  11010. energy
  11011. // engineer : Dog Beach, LLC
  11012. // https://www.iana.org/domains/root/db/engineer.html
  11013. engineer
  11014. // engineering : Binky Moon, LLC
  11015. // https://www.iana.org/domains/root/db/engineering.html
  11016. engineering
  11017. // enterprises : Binky Moon, LLC
  11018. // https://www.iana.org/domains/root/db/enterprises.html
  11019. enterprises
  11020. // epson : Seiko Epson Corporation
  11021. // https://www.iana.org/domains/root/db/epson.html
  11022. epson
  11023. // equipment : Binky Moon, LLC
  11024. // https://www.iana.org/domains/root/db/equipment.html
  11025. equipment
  11026. // ericsson : Telefonaktiebolaget L M Ericsson
  11027. // https://www.iana.org/domains/root/db/ericsson.html
  11028. ericsson
  11029. // erni : ERNI Group Holding AG
  11030. // https://www.iana.org/domains/root/db/erni.html
  11031. erni
  11032. // esq : Charleston Road Registry Inc.
  11033. // https://www.iana.org/domains/root/db/esq.html
  11034. esq
  11035. // estate : Binky Moon, LLC
  11036. // https://www.iana.org/domains/root/db/estate.html
  11037. estate
  11038. // etisalat : Emirates Telecommunications Corporation (trading as Etisalat)
  11039. // https://www.iana.org/domains/root/db/etisalat.html
  11040. etisalat
  11041. // eurovision : European Broadcasting Union (EBU)
  11042. // https://www.iana.org/domains/root/db/eurovision.html
  11043. eurovision
  11044. // eus : Puntueus Fundazioa
  11045. // https://www.iana.org/domains/root/db/eus.html
  11046. eus
  11047. // events : Binky Moon, LLC
  11048. // https://www.iana.org/domains/root/db/events.html
  11049. events
  11050. // exchange : Binky Moon, LLC
  11051. // https://www.iana.org/domains/root/db/exchange.html
  11052. exchange
  11053. // expert : Binky Moon, LLC
  11054. // https://www.iana.org/domains/root/db/expert.html
  11055. expert
  11056. // exposed : Binky Moon, LLC
  11057. // https://www.iana.org/domains/root/db/exposed.html
  11058. exposed
  11059. // express : Binky Moon, LLC
  11060. // https://www.iana.org/domains/root/db/express.html
  11061. express
  11062. // extraspace : Extra Space Storage LLC
  11063. // https://www.iana.org/domains/root/db/extraspace.html
  11064. extraspace
  11065. // fage : Fage International S.A.
  11066. // https://www.iana.org/domains/root/db/fage.html
  11067. fage
  11068. // fail : Binky Moon, LLC
  11069. // https://www.iana.org/domains/root/db/fail.html
  11070. fail
  11071. // fairwinds : FairWinds Partners, LLC
  11072. // https://www.iana.org/domains/root/db/fairwinds.html
  11073. fairwinds
  11074. // faith : dot Faith Limited
  11075. // https://www.iana.org/domains/root/db/faith.html
  11076. faith
  11077. // family : Dog Beach, LLC
  11078. // https://www.iana.org/domains/root/db/family.html
  11079. family
  11080. // fan : Dog Beach, LLC
  11081. // https://www.iana.org/domains/root/db/fan.html
  11082. fan
  11083. // fans : ZDNS International Limited
  11084. // https://www.iana.org/domains/root/db/fans.html
  11085. fans
  11086. // farm : Binky Moon, LLC
  11087. // https://www.iana.org/domains/root/db/farm.html
  11088. farm
  11089. // farmers : Farmers Insurance Exchange
  11090. // https://www.iana.org/domains/root/db/farmers.html
  11091. farmers
  11092. // fashion : Registry Services, LLC
  11093. // https://www.iana.org/domains/root/db/fashion.html
  11094. fashion
  11095. // fast : Amazon Registry Services, Inc.
  11096. // https://www.iana.org/domains/root/db/fast.html
  11097. fast
  11098. // fedex : Federal Express Corporation
  11099. // https://www.iana.org/domains/root/db/fedex.html
  11100. fedex
  11101. // feedback : Top Level Spectrum, Inc.
  11102. // https://www.iana.org/domains/root/db/feedback.html
  11103. feedback
  11104. // ferrari : Fiat Chrysler Automobiles N.V.
  11105. // https://www.iana.org/domains/root/db/ferrari.html
  11106. ferrari
  11107. // ferrero : Ferrero Trading Lux S.A.
  11108. // https://www.iana.org/domains/root/db/ferrero.html
  11109. ferrero
  11110. // fidelity : Fidelity Brokerage Services LLC
  11111. // https://www.iana.org/domains/root/db/fidelity.html
  11112. fidelity
  11113. // fido : Rogers Communications Canada Inc.
  11114. // https://www.iana.org/domains/root/db/fido.html
  11115. fido
  11116. // film : Motion Picture Domain Registry Pty Ltd
  11117. // https://www.iana.org/domains/root/db/film.html
  11118. film
  11119. // final : Núcleo de Informação e Coordenação do Ponto BR - NIC.br
  11120. // https://www.iana.org/domains/root/db/final.html
  11121. final
  11122. // finance : Binky Moon, LLC
  11123. // https://www.iana.org/domains/root/db/finance.html
  11124. finance
  11125. // financial : Binky Moon, LLC
  11126. // https://www.iana.org/domains/root/db/financial.html
  11127. financial
  11128. // fire : Amazon Registry Services, Inc.
  11129. // https://www.iana.org/domains/root/db/fire.html
  11130. fire
  11131. // firestone : Bridgestone Licensing Services, Inc
  11132. // https://www.iana.org/domains/root/db/firestone.html
  11133. firestone
  11134. // firmdale : Firmdale Holdings Limited
  11135. // https://www.iana.org/domains/root/db/firmdale.html
  11136. firmdale
  11137. // fish : Binky Moon, LLC
  11138. // https://www.iana.org/domains/root/db/fish.html
  11139. fish
  11140. // fishing : Registry Services, LLC
  11141. // https://www.iana.org/domains/root/db/fishing.html
  11142. fishing
  11143. // fit : Registry Services, LLC
  11144. // https://www.iana.org/domains/root/db/fit.html
  11145. fit
  11146. // fitness : Binky Moon, LLC
  11147. // https://www.iana.org/domains/root/db/fitness.html
  11148. fitness
  11149. // flickr : Flickr, Inc.
  11150. // https://www.iana.org/domains/root/db/flickr.html
  11151. flickr
  11152. // flights : Binky Moon, LLC
  11153. // https://www.iana.org/domains/root/db/flights.html
  11154. flights
  11155. // flir : FLIR Systems, Inc.
  11156. // https://www.iana.org/domains/root/db/flir.html
  11157. flir
  11158. // florist : Binky Moon, LLC
  11159. // https://www.iana.org/domains/root/db/florist.html
  11160. florist
  11161. // flowers : XYZ.COM LLC
  11162. // https://www.iana.org/domains/root/db/flowers.html
  11163. flowers
  11164. // fly : Charleston Road Registry Inc.
  11165. // https://www.iana.org/domains/root/db/fly.html
  11166. fly
  11167. // foo : Charleston Road Registry Inc.
  11168. // https://www.iana.org/domains/root/db/foo.html
  11169. foo
  11170. // food : Lifestyle Domain Holdings, Inc.
  11171. // https://www.iana.org/domains/root/db/food.html
  11172. food
  11173. // football : Binky Moon, LLC
  11174. // https://www.iana.org/domains/root/db/football.html
  11175. football
  11176. // ford : Ford Motor Company
  11177. // https://www.iana.org/domains/root/db/ford.html
  11178. ford
  11179. // forex : Dog Beach, LLC
  11180. // https://www.iana.org/domains/root/db/forex.html
  11181. forex
  11182. // forsale : Dog Beach, LLC
  11183. // https://www.iana.org/domains/root/db/forsale.html
  11184. forsale
  11185. // forum : Fegistry, LLC
  11186. // https://www.iana.org/domains/root/db/forum.html
  11187. forum
  11188. // foundation : Public Interest Registry
  11189. // https://www.iana.org/domains/root/db/foundation.html
  11190. foundation
  11191. // fox : FOX Registry, LLC
  11192. // https://www.iana.org/domains/root/db/fox.html
  11193. fox
  11194. // free : Amazon Registry Services, Inc.
  11195. // https://www.iana.org/domains/root/db/free.html
  11196. free
  11197. // fresenius : Fresenius Immobilien-Verwaltungs-GmbH
  11198. // https://www.iana.org/domains/root/db/fresenius.html
  11199. fresenius
  11200. // frl : FRLregistry B.V.
  11201. // https://www.iana.org/domains/root/db/frl.html
  11202. frl
  11203. // frogans : OP3FT
  11204. // https://www.iana.org/domains/root/db/frogans.html
  11205. frogans
  11206. // frontier : Frontier Communications Corporation
  11207. // https://www.iana.org/domains/root/db/frontier.html
  11208. frontier
  11209. // ftr : Frontier Communications Corporation
  11210. // https://www.iana.org/domains/root/db/ftr.html
  11211. ftr
  11212. // fujitsu : Fujitsu Limited
  11213. // https://www.iana.org/domains/root/db/fujitsu.html
  11214. fujitsu
  11215. // fun : Radix FZC DMCC
  11216. // https://www.iana.org/domains/root/db/fun.html
  11217. fun
  11218. // fund : Binky Moon, LLC
  11219. // https://www.iana.org/domains/root/db/fund.html
  11220. fund
  11221. // furniture : Binky Moon, LLC
  11222. // https://www.iana.org/domains/root/db/furniture.html
  11223. furniture
  11224. // futbol : Dog Beach, LLC
  11225. // https://www.iana.org/domains/root/db/futbol.html
  11226. futbol
  11227. // fyi : Binky Moon, LLC
  11228. // https://www.iana.org/domains/root/db/fyi.html
  11229. fyi
  11230. // gal : Asociación puntoGAL
  11231. // https://www.iana.org/domains/root/db/gal.html
  11232. gal
  11233. // gallery : Binky Moon, LLC
  11234. // https://www.iana.org/domains/root/db/gallery.html
  11235. gallery
  11236. // gallo : Gallo Vineyards, Inc.
  11237. // https://www.iana.org/domains/root/db/gallo.html
  11238. gallo
  11239. // gallup : Gallup, Inc.
  11240. // https://www.iana.org/domains/root/db/gallup.html
  11241. gallup
  11242. // game : XYZ.COM LLC
  11243. // https://www.iana.org/domains/root/db/game.html
  11244. game
  11245. // games : Dog Beach, LLC
  11246. // https://www.iana.org/domains/root/db/games.html
  11247. games
  11248. // gap : The Gap, Inc.
  11249. // https://www.iana.org/domains/root/db/gap.html
  11250. gap
  11251. // garden : Registry Services, LLC
  11252. // https://www.iana.org/domains/root/db/garden.html
  11253. garden
  11254. // gay : Registry Services, LLC
  11255. // https://www.iana.org/domains/root/db/gay.html
  11256. gay
  11257. // gbiz : Charleston Road Registry Inc.
  11258. // https://www.iana.org/domains/root/db/gbiz.html
  11259. gbiz
  11260. // gdn : Joint Stock Company "Navigation-information systems"
  11261. // https://www.iana.org/domains/root/db/gdn.html
  11262. gdn
  11263. // gea : GEA Group Aktiengesellschaft
  11264. // https://www.iana.org/domains/root/db/gea.html
  11265. gea
  11266. // gent : Easyhost BV
  11267. // https://www.iana.org/domains/root/db/gent.html
  11268. gent
  11269. // genting : Resorts World Inc Pte. Ltd.
  11270. // https://www.iana.org/domains/root/db/genting.html
  11271. genting
  11272. // george : Wal-Mart Stores, Inc.
  11273. // https://www.iana.org/domains/root/db/george.html
  11274. george
  11275. // ggee : GMO Internet, Inc.
  11276. // https://www.iana.org/domains/root/db/ggee.html
  11277. ggee
  11278. // gift : DotGift, LLC
  11279. // https://www.iana.org/domains/root/db/gift.html
  11280. gift
  11281. // gifts : Binky Moon, LLC
  11282. // https://www.iana.org/domains/root/db/gifts.html
  11283. gifts
  11284. // gives : Public Interest Registry
  11285. // https://www.iana.org/domains/root/db/gives.html
  11286. gives
  11287. // giving : Public Interest Registry
  11288. // https://www.iana.org/domains/root/db/giving.html
  11289. giving
  11290. // glass : Binky Moon, LLC
  11291. // https://www.iana.org/domains/root/db/glass.html
  11292. glass
  11293. // gle : Charleston Road Registry Inc.
  11294. // https://www.iana.org/domains/root/db/gle.html
  11295. gle
  11296. // global : Identity Digital Limited
  11297. // https://www.iana.org/domains/root/db/global.html
  11298. global
  11299. // globo : Globo Comunicação e Participações S.A
  11300. // https://www.iana.org/domains/root/db/globo.html
  11301. globo
  11302. // gmail : Charleston Road Registry Inc.
  11303. // https://www.iana.org/domains/root/db/gmail.html
  11304. gmail
  11305. // gmbh : Binky Moon, LLC
  11306. // https://www.iana.org/domains/root/db/gmbh.html
  11307. gmbh
  11308. // gmo : GMO Internet, Inc.
  11309. // https://www.iana.org/domains/root/db/gmo.html
  11310. gmo
  11311. // gmx : 1&1 Mail & Media GmbH
  11312. // https://www.iana.org/domains/root/db/gmx.html
  11313. gmx
  11314. // godaddy : Go Daddy East, LLC
  11315. // https://www.iana.org/domains/root/db/godaddy.html
  11316. godaddy
  11317. // gold : Binky Moon, LLC
  11318. // https://www.iana.org/domains/root/db/gold.html
  11319. gold
  11320. // goldpoint : YODOBASHI CAMERA CO.,LTD.
  11321. // https://www.iana.org/domains/root/db/goldpoint.html
  11322. goldpoint
  11323. // golf : Binky Moon, LLC
  11324. // https://www.iana.org/domains/root/db/golf.html
  11325. golf
  11326. // goo : NTT Resonant Inc.
  11327. // https://www.iana.org/domains/root/db/goo.html
  11328. goo
  11329. // goodyear : The Goodyear Tire & Rubber Company
  11330. // https://www.iana.org/domains/root/db/goodyear.html
  11331. goodyear
  11332. // goog : Charleston Road Registry Inc.
  11333. // https://www.iana.org/domains/root/db/goog.html
  11334. goog
  11335. // google : Charleston Road Registry Inc.
  11336. // https://www.iana.org/domains/root/db/google.html
  11337. google
  11338. // gop : Republican State Leadership Committee, Inc.
  11339. // https://www.iana.org/domains/root/db/gop.html
  11340. gop
  11341. // got : Amazon Registry Services, Inc.
  11342. // https://www.iana.org/domains/root/db/got.html
  11343. got
  11344. // grainger : Grainger Registry Services, LLC
  11345. // https://www.iana.org/domains/root/db/grainger.html
  11346. grainger
  11347. // graphics : Binky Moon, LLC
  11348. // https://www.iana.org/domains/root/db/graphics.html
  11349. graphics
  11350. // gratis : Binky Moon, LLC
  11351. // https://www.iana.org/domains/root/db/gratis.html
  11352. gratis
  11353. // green : Identity Digital Limited
  11354. // https://www.iana.org/domains/root/db/green.html
  11355. green
  11356. // gripe : Binky Moon, LLC
  11357. // https://www.iana.org/domains/root/db/gripe.html
  11358. gripe
  11359. // grocery : Wal-Mart Stores, Inc.
  11360. // https://www.iana.org/domains/root/db/grocery.html
  11361. grocery
  11362. // group : Binky Moon, LLC
  11363. // https://www.iana.org/domains/root/db/group.html
  11364. group
  11365. // guardian : The Guardian Life Insurance Company of America
  11366. // https://www.iana.org/domains/root/db/guardian.html
  11367. guardian
  11368. // gucci : Guccio Gucci S.p.a.
  11369. // https://www.iana.org/domains/root/db/gucci.html
  11370. gucci
  11371. // guge : Charleston Road Registry Inc.
  11372. // https://www.iana.org/domains/root/db/guge.html
  11373. guge
  11374. // guide : Binky Moon, LLC
  11375. // https://www.iana.org/domains/root/db/guide.html
  11376. guide
  11377. // guitars : XYZ.COM LLC
  11378. // https://www.iana.org/domains/root/db/guitars.html
  11379. guitars
  11380. // guru : Binky Moon, LLC
  11381. // https://www.iana.org/domains/root/db/guru.html
  11382. guru
  11383. // hair : XYZ.COM LLC
  11384. // https://www.iana.org/domains/root/db/hair.html
  11385. hair
  11386. // hamburg : Hamburg Top-Level-Domain GmbH
  11387. // https://www.iana.org/domains/root/db/hamburg.html
  11388. hamburg
  11389. // hangout : Charleston Road Registry Inc.
  11390. // https://www.iana.org/domains/root/db/hangout.html
  11391. hangout
  11392. // haus : Dog Beach, LLC
  11393. // https://www.iana.org/domains/root/db/haus.html
  11394. haus
  11395. // hbo : HBO Registry Services, Inc.
  11396. // https://www.iana.org/domains/root/db/hbo.html
  11397. hbo
  11398. // hdfc : HOUSING DEVELOPMENT FINANCE CORPORATION LIMITED
  11399. // https://www.iana.org/domains/root/db/hdfc.html
  11400. hdfc
  11401. // hdfcbank : HDFC Bank Limited
  11402. // https://www.iana.org/domains/root/db/hdfcbank.html
  11403. hdfcbank
  11404. // health : Registry Services, LLC
  11405. // https://www.iana.org/domains/root/db/health.html
  11406. health
  11407. // healthcare : Binky Moon, LLC
  11408. // https://www.iana.org/domains/root/db/healthcare.html
  11409. healthcare
  11410. // help : Innovation service Limited
  11411. // https://www.iana.org/domains/root/db/help.html
  11412. help
  11413. // helsinki : City of Helsinki
  11414. // https://www.iana.org/domains/root/db/helsinki.html
  11415. helsinki
  11416. // here : Charleston Road Registry Inc.
  11417. // https://www.iana.org/domains/root/db/here.html
  11418. here
  11419. // hermes : HERMES INTERNATIONAL
  11420. // https://www.iana.org/domains/root/db/hermes.html
  11421. hermes
  11422. // hiphop : Dot Hip Hop, LLC
  11423. // https://www.iana.org/domains/root/db/hiphop.html
  11424. hiphop
  11425. // hisamitsu : Hisamitsu Pharmaceutical Co.,Inc.
  11426. // https://www.iana.org/domains/root/db/hisamitsu.html
  11427. hisamitsu
  11428. // hitachi : Hitachi, Ltd.
  11429. // https://www.iana.org/domains/root/db/hitachi.html
  11430. hitachi
  11431. // hiv : Internet Naming Company LLC
  11432. // https://www.iana.org/domains/root/db/hiv.html
  11433. hiv
  11434. // hkt : PCCW-HKT DataCom Services Limited
  11435. // https://www.iana.org/domains/root/db/hkt.html
  11436. hkt
  11437. // hockey : Binky Moon, LLC
  11438. // https://www.iana.org/domains/root/db/hockey.html
  11439. hockey
  11440. // holdings : Binky Moon, LLC
  11441. // https://www.iana.org/domains/root/db/holdings.html
  11442. holdings
  11443. // holiday : Binky Moon, LLC
  11444. // https://www.iana.org/domains/root/db/holiday.html
  11445. holiday
  11446. // homedepot : Home Depot Product Authority, LLC
  11447. // https://www.iana.org/domains/root/db/homedepot.html
  11448. homedepot
  11449. // homegoods : The TJX Companies, Inc.
  11450. // https://www.iana.org/domains/root/db/homegoods.html
  11451. homegoods
  11452. // homes : XYZ.COM LLC
  11453. // https://www.iana.org/domains/root/db/homes.html
  11454. homes
  11455. // homesense : The TJX Companies, Inc.
  11456. // https://www.iana.org/domains/root/db/homesense.html
  11457. homesense
  11458. // honda : Honda Motor Co., Ltd.
  11459. // https://www.iana.org/domains/root/db/honda.html
  11460. honda
  11461. // horse : Registry Services, LLC
  11462. // https://www.iana.org/domains/root/db/horse.html
  11463. horse
  11464. // hospital : Binky Moon, LLC
  11465. // https://www.iana.org/domains/root/db/hospital.html
  11466. hospital
  11467. // host : Radix FZC DMCC
  11468. // https://www.iana.org/domains/root/db/host.html
  11469. host
  11470. // hosting : XYZ.COM LLC
  11471. // https://www.iana.org/domains/root/db/hosting.html
  11472. hosting
  11473. // hot : Amazon Registry Services, Inc.
  11474. // https://www.iana.org/domains/root/db/hot.html
  11475. hot
  11476. // hotels : Booking.com B.V.
  11477. // https://www.iana.org/domains/root/db/hotels.html
  11478. hotels
  11479. // hotmail : Microsoft Corporation
  11480. // https://www.iana.org/domains/root/db/hotmail.html
  11481. hotmail
  11482. // house : Binky Moon, LLC
  11483. // https://www.iana.org/domains/root/db/house.html
  11484. house
  11485. // how : Charleston Road Registry Inc.
  11486. // https://www.iana.org/domains/root/db/how.html
  11487. how
  11488. // hsbc : HSBC Global Services (UK) Limited
  11489. // https://www.iana.org/domains/root/db/hsbc.html
  11490. hsbc
  11491. // hughes : Hughes Satellite Systems Corporation
  11492. // https://www.iana.org/domains/root/db/hughes.html
  11493. hughes
  11494. // hyatt : Hyatt GTLD, L.L.C.
  11495. // https://www.iana.org/domains/root/db/hyatt.html
  11496. hyatt
  11497. // hyundai : Hyundai Motor Company
  11498. // https://www.iana.org/domains/root/db/hyundai.html
  11499. hyundai
  11500. // ibm : International Business Machines Corporation
  11501. // https://www.iana.org/domains/root/db/ibm.html
  11502. ibm
  11503. // icbc : Industrial and Commercial Bank of China Limited
  11504. // https://www.iana.org/domains/root/db/icbc.html
  11505. icbc
  11506. // ice : IntercontinentalExchange, Inc.
  11507. // https://www.iana.org/domains/root/db/ice.html
  11508. ice
  11509. // icu : ShortDot SA
  11510. // https://www.iana.org/domains/root/db/icu.html
  11511. icu
  11512. // ieee : IEEE Global LLC
  11513. // https://www.iana.org/domains/root/db/ieee.html
  11514. ieee
  11515. // ifm : ifm electronic gmbh
  11516. // https://www.iana.org/domains/root/db/ifm.html
  11517. ifm
  11518. // ikano : Ikano S.A.
  11519. // https://www.iana.org/domains/root/db/ikano.html
  11520. ikano
  11521. // imamat : Fondation Aga Khan (Aga Khan Foundation)
  11522. // https://www.iana.org/domains/root/db/imamat.html
  11523. imamat
  11524. // imdb : Amazon Registry Services, Inc.
  11525. // https://www.iana.org/domains/root/db/imdb.html
  11526. imdb
  11527. // immo : Binky Moon, LLC
  11528. // https://www.iana.org/domains/root/db/immo.html
  11529. immo
  11530. // immobilien : Dog Beach, LLC
  11531. // https://www.iana.org/domains/root/db/immobilien.html
  11532. immobilien
  11533. // inc : Intercap Registry Inc.
  11534. // https://www.iana.org/domains/root/db/inc.html
  11535. inc
  11536. // industries : Binky Moon, LLC
  11537. // https://www.iana.org/domains/root/db/industries.html
  11538. industries
  11539. // infiniti : NISSAN MOTOR CO., LTD.
  11540. // https://www.iana.org/domains/root/db/infiniti.html
  11541. infiniti
  11542. // ing : Charleston Road Registry Inc.
  11543. // https://www.iana.org/domains/root/db/ing.html
  11544. ing
  11545. // ink : Registry Services, LLC
  11546. // https://www.iana.org/domains/root/db/ink.html
  11547. ink
  11548. // institute : Binky Moon, LLC
  11549. // https://www.iana.org/domains/root/db/institute.html
  11550. institute
  11551. // insurance : fTLD Registry Services LLC
  11552. // https://www.iana.org/domains/root/db/insurance.html
  11553. insurance
  11554. // insure : Binky Moon, LLC
  11555. // https://www.iana.org/domains/root/db/insure.html
  11556. insure
  11557. // international : Binky Moon, LLC
  11558. // https://www.iana.org/domains/root/db/international.html
  11559. international
  11560. // intuit : Intuit Administrative Services, Inc.
  11561. // https://www.iana.org/domains/root/db/intuit.html
  11562. intuit
  11563. // investments : Binky Moon, LLC
  11564. // https://www.iana.org/domains/root/db/investments.html
  11565. investments
  11566. // ipiranga : Ipiranga Produtos de Petroleo S.A.
  11567. // https://www.iana.org/domains/root/db/ipiranga.html
  11568. ipiranga
  11569. // irish : Binky Moon, LLC
  11570. // https://www.iana.org/domains/root/db/irish.html
  11571. irish
  11572. // ismaili : Fondation Aga Khan (Aga Khan Foundation)
  11573. // https://www.iana.org/domains/root/db/ismaili.html
  11574. ismaili
  11575. // ist : Istanbul Metropolitan Municipality
  11576. // https://www.iana.org/domains/root/db/ist.html
  11577. ist
  11578. // istanbul : Istanbul Metropolitan Municipality
  11579. // https://www.iana.org/domains/root/db/istanbul.html
  11580. istanbul
  11581. // itau : Itau Unibanco Holding S.A.
  11582. // https://www.iana.org/domains/root/db/itau.html
  11583. itau
  11584. // itv : ITV Services Limited
  11585. // https://www.iana.org/domains/root/db/itv.html
  11586. itv
  11587. // jaguar : Jaguar Land Rover Ltd
  11588. // https://www.iana.org/domains/root/db/jaguar.html
  11589. jaguar
  11590. // java : Oracle Corporation
  11591. // https://www.iana.org/domains/root/db/java.html
  11592. java
  11593. // jcb : JCB Co., Ltd.
  11594. // https://www.iana.org/domains/root/db/jcb.html
  11595. jcb
  11596. // jeep : FCA US LLC.
  11597. // https://www.iana.org/domains/root/db/jeep.html
  11598. jeep
  11599. // jetzt : Binky Moon, LLC
  11600. // https://www.iana.org/domains/root/db/jetzt.html
  11601. jetzt
  11602. // jewelry : Binky Moon, LLC
  11603. // https://www.iana.org/domains/root/db/jewelry.html
  11604. jewelry
  11605. // jio : Reliance Industries Limited
  11606. // https://www.iana.org/domains/root/db/jio.html
  11607. jio
  11608. // jll : Jones Lang LaSalle Incorporated
  11609. // https://www.iana.org/domains/root/db/jll.html
  11610. jll
  11611. // jmp : Matrix IP LLC
  11612. // https://www.iana.org/domains/root/db/jmp.html
  11613. jmp
  11614. // jnj : Johnson & Johnson Services, Inc.
  11615. // https://www.iana.org/domains/root/db/jnj.html
  11616. jnj
  11617. // joburg : ZA Central Registry NPC trading as ZA Central Registry
  11618. // https://www.iana.org/domains/root/db/joburg.html
  11619. joburg
  11620. // jot : Amazon Registry Services, Inc.
  11621. // https://www.iana.org/domains/root/db/jot.html
  11622. jot
  11623. // joy : Amazon Registry Services, Inc.
  11624. // https://www.iana.org/domains/root/db/joy.html
  11625. joy
  11626. // jpmorgan : JPMorgan Chase Bank, National Association
  11627. // https://www.iana.org/domains/root/db/jpmorgan.html
  11628. jpmorgan
  11629. // jprs : Japan Registry Services Co., Ltd.
  11630. // https://www.iana.org/domains/root/db/jprs.html
  11631. jprs
  11632. // juegos : Internet Naming Company LLC
  11633. // https://www.iana.org/domains/root/db/juegos.html
  11634. juegos
  11635. // juniper : JUNIPER NETWORKS, INC.
  11636. // https://www.iana.org/domains/root/db/juniper.html
  11637. juniper
  11638. // kaufen : Dog Beach, LLC
  11639. // https://www.iana.org/domains/root/db/kaufen.html
  11640. kaufen
  11641. // kddi : KDDI CORPORATION
  11642. // https://www.iana.org/domains/root/db/kddi.html
  11643. kddi
  11644. // kerryhotels : Kerry Trading Co. Limited
  11645. // https://www.iana.org/domains/root/db/kerryhotels.html
  11646. kerryhotels
  11647. // kerrylogistics : Kerry Trading Co. Limited
  11648. // https://www.iana.org/domains/root/db/kerrylogistics.html
  11649. kerrylogistics
  11650. // kerryproperties : Kerry Trading Co. Limited
  11651. // https://www.iana.org/domains/root/db/kerryproperties.html
  11652. kerryproperties
  11653. // kfh : Kuwait Finance House
  11654. // https://www.iana.org/domains/root/db/kfh.html
  11655. kfh
  11656. // kia : KIA MOTORS CORPORATION
  11657. // https://www.iana.org/domains/root/db/kia.html
  11658. kia
  11659. // kids : DotKids Foundation Limited
  11660. // https://www.iana.org/domains/root/db/kids.html
  11661. kids
  11662. // kim : Identity Digital Limited
  11663. // https://www.iana.org/domains/root/db/kim.html
  11664. kim
  11665. // kinder : Ferrero Trading Lux S.A.
  11666. // https://www.iana.org/domains/root/db/kinder.html
  11667. kinder
  11668. // kindle : Amazon Registry Services, Inc.
  11669. // https://www.iana.org/domains/root/db/kindle.html
  11670. kindle
  11671. // kitchen : Binky Moon, LLC
  11672. // https://www.iana.org/domains/root/db/kitchen.html
  11673. kitchen
  11674. // kiwi : DOT KIWI LIMITED
  11675. // https://www.iana.org/domains/root/db/kiwi.html
  11676. kiwi
  11677. // koeln : dotKoeln GmbH
  11678. // https://www.iana.org/domains/root/db/koeln.html
  11679. koeln
  11680. // komatsu : Komatsu Ltd.
  11681. // https://www.iana.org/domains/root/db/komatsu.html
  11682. komatsu
  11683. // kosher : Kosher Marketing Assets LLC
  11684. // https://www.iana.org/domains/root/db/kosher.html
  11685. kosher
  11686. // kpmg : KPMG International Cooperative (KPMG International Genossenschaft)
  11687. // https://www.iana.org/domains/root/db/kpmg.html
  11688. kpmg
  11689. // kpn : Koninklijke KPN N.V.
  11690. // https://www.iana.org/domains/root/db/kpn.html
  11691. kpn
  11692. // krd : KRG Department of Information Technology
  11693. // https://www.iana.org/domains/root/db/krd.html
  11694. krd
  11695. // kred : KredTLD Pty Ltd
  11696. // https://www.iana.org/domains/root/db/kred.html
  11697. kred
  11698. // kuokgroup : Kerry Trading Co. Limited
  11699. // https://www.iana.org/domains/root/db/kuokgroup.html
  11700. kuokgroup
  11701. // kyoto : Academic Institution: Kyoto Jyoho Gakuen
  11702. // https://www.iana.org/domains/root/db/kyoto.html
  11703. kyoto
  11704. // lacaixa : Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa”
  11705. // https://www.iana.org/domains/root/db/lacaixa.html
  11706. lacaixa
  11707. // lamborghini : Automobili Lamborghini S.p.A.
  11708. // https://www.iana.org/domains/root/db/lamborghini.html
  11709. lamborghini
  11710. // lamer : The Estée Lauder Companies Inc.
  11711. // https://www.iana.org/domains/root/db/lamer.html
  11712. lamer
  11713. // lancaster : LANCASTER
  11714. // https://www.iana.org/domains/root/db/lancaster.html
  11715. lancaster
  11716. // land : Binky Moon, LLC
  11717. // https://www.iana.org/domains/root/db/land.html
  11718. land
  11719. // landrover : Jaguar Land Rover Ltd
  11720. // https://www.iana.org/domains/root/db/landrover.html
  11721. landrover
  11722. // lanxess : LANXESS Corporation
  11723. // https://www.iana.org/domains/root/db/lanxess.html
  11724. lanxess
  11725. // lasalle : Jones Lang LaSalle Incorporated
  11726. // https://www.iana.org/domains/root/db/lasalle.html
  11727. lasalle
  11728. // lat : XYZ.COM LLC
  11729. // https://www.iana.org/domains/root/db/lat.html
  11730. lat
  11731. // latino : Dish DBS Corporation
  11732. // https://www.iana.org/domains/root/db/latino.html
  11733. latino
  11734. // latrobe : La Trobe University
  11735. // https://www.iana.org/domains/root/db/latrobe.html
  11736. latrobe
  11737. // law : Registry Services, LLC
  11738. // https://www.iana.org/domains/root/db/law.html
  11739. law
  11740. // lawyer : Dog Beach, LLC
  11741. // https://www.iana.org/domains/root/db/lawyer.html
  11742. lawyer
  11743. // lds : IRI Domain Management, LLC
  11744. // https://www.iana.org/domains/root/db/lds.html
  11745. lds
  11746. // lease : Binky Moon, LLC
  11747. // https://www.iana.org/domains/root/db/lease.html
  11748. lease
  11749. // leclerc : A.C.D. LEC Association des Centres Distributeurs Edouard Leclerc
  11750. // https://www.iana.org/domains/root/db/leclerc.html
  11751. leclerc
  11752. // lefrak : LeFrak Organization, Inc.
  11753. // https://www.iana.org/domains/root/db/lefrak.html
  11754. lefrak
  11755. // legal : Binky Moon, LLC
  11756. // https://www.iana.org/domains/root/db/legal.html
  11757. legal
  11758. // lego : LEGO Juris A/S
  11759. // https://www.iana.org/domains/root/db/lego.html
  11760. lego
  11761. // lexus : TOYOTA MOTOR CORPORATION
  11762. // https://www.iana.org/domains/root/db/lexus.html
  11763. lexus
  11764. // lgbt : Identity Digital Limited
  11765. // https://www.iana.org/domains/root/db/lgbt.html
  11766. lgbt
  11767. // lidl : Schwarz Domains und Services GmbH & Co. KG
  11768. // https://www.iana.org/domains/root/db/lidl.html
  11769. lidl
  11770. // life : Binky Moon, LLC
  11771. // https://www.iana.org/domains/root/db/life.html
  11772. life
  11773. // lifeinsurance : American Council of Life Insurers
  11774. // https://www.iana.org/domains/root/db/lifeinsurance.html
  11775. lifeinsurance
  11776. // lifestyle : Lifestyle Domain Holdings, Inc.
  11777. // https://www.iana.org/domains/root/db/lifestyle.html
  11778. lifestyle
  11779. // lighting : Binky Moon, LLC
  11780. // https://www.iana.org/domains/root/db/lighting.html
  11781. lighting
  11782. // like : Amazon Registry Services, Inc.
  11783. // https://www.iana.org/domains/root/db/like.html
  11784. like
  11785. // lilly : Eli Lilly and Company
  11786. // https://www.iana.org/domains/root/db/lilly.html
  11787. lilly
  11788. // limited : Binky Moon, LLC
  11789. // https://www.iana.org/domains/root/db/limited.html
  11790. limited
  11791. // limo : Binky Moon, LLC
  11792. // https://www.iana.org/domains/root/db/limo.html
  11793. limo
  11794. // lincoln : Ford Motor Company
  11795. // https://www.iana.org/domains/root/db/lincoln.html
  11796. lincoln
  11797. // link : Nova Registry Ltd
  11798. // https://www.iana.org/domains/root/db/link.html
  11799. link
  11800. // lipsy : Lipsy Ltd
  11801. // https://www.iana.org/domains/root/db/lipsy.html
  11802. lipsy
  11803. // live : Dog Beach, LLC
  11804. // https://www.iana.org/domains/root/db/live.html
  11805. live
  11806. // living : Lifestyle Domain Holdings, Inc.
  11807. // https://www.iana.org/domains/root/db/living.html
  11808. living
  11809. // llc : Identity Digital Limited
  11810. // https://www.iana.org/domains/root/db/llc.html
  11811. llc
  11812. // llp : Intercap Registry Inc.
  11813. // https://www.iana.org/domains/root/db/llp.html
  11814. llp
  11815. // loan : dot Loan Limited
  11816. // https://www.iana.org/domains/root/db/loan.html
  11817. loan
  11818. // loans : Binky Moon, LLC
  11819. // https://www.iana.org/domains/root/db/loans.html
  11820. loans
  11821. // locker : Orange Domains LLC
  11822. // https://www.iana.org/domains/root/db/locker.html
  11823. locker
  11824. // locus : Locus Analytics LLC
  11825. // https://www.iana.org/domains/root/db/locus.html
  11826. locus
  11827. // lol : XYZ.COM LLC
  11828. // https://www.iana.org/domains/root/db/lol.html
  11829. lol
  11830. // london : Dot London Domains Limited
  11831. // https://www.iana.org/domains/root/db/london.html
  11832. london
  11833. // lotte : Lotte Holdings Co., Ltd.
  11834. // https://www.iana.org/domains/root/db/lotte.html
  11835. lotte
  11836. // lotto : Identity Digital Limited
  11837. // https://www.iana.org/domains/root/db/lotto.html
  11838. lotto
  11839. // love : Merchant Law Group LLP
  11840. // https://www.iana.org/domains/root/db/love.html
  11841. love
  11842. // lpl : LPL Holdings, Inc.
  11843. // https://www.iana.org/domains/root/db/lpl.html
  11844. lpl
  11845. // lplfinancial : LPL Holdings, Inc.
  11846. // https://www.iana.org/domains/root/db/lplfinancial.html
  11847. lplfinancial
  11848. // ltd : Binky Moon, LLC
  11849. // https://www.iana.org/domains/root/db/ltd.html
  11850. ltd
  11851. // ltda : InterNetX, Corp
  11852. // https://www.iana.org/domains/root/db/ltda.html
  11853. ltda
  11854. // lundbeck : H. Lundbeck A/S
  11855. // https://www.iana.org/domains/root/db/lundbeck.html
  11856. lundbeck
  11857. // luxe : Registry Services, LLC
  11858. // https://www.iana.org/domains/root/db/luxe.html
  11859. luxe
  11860. // luxury : Luxury Partners, LLC
  11861. // https://www.iana.org/domains/root/db/luxury.html
  11862. luxury
  11863. // madrid : Comunidad de Madrid
  11864. // https://www.iana.org/domains/root/db/madrid.html
  11865. madrid
  11866. // maif : Mutuelle Assurance Instituteur France (MAIF)
  11867. // https://www.iana.org/domains/root/db/maif.html
  11868. maif
  11869. // maison : Binky Moon, LLC
  11870. // https://www.iana.org/domains/root/db/maison.html
  11871. maison
  11872. // makeup : XYZ.COM LLC
  11873. // https://www.iana.org/domains/root/db/makeup.html
  11874. makeup
  11875. // man : MAN SE
  11876. // https://www.iana.org/domains/root/db/man.html
  11877. man
  11878. // management : Binky Moon, LLC
  11879. // https://www.iana.org/domains/root/db/management.html
  11880. management
  11881. // mango : PUNTO FA S.L.
  11882. // https://www.iana.org/domains/root/db/mango.html
  11883. mango
  11884. // map : Charleston Road Registry Inc.
  11885. // https://www.iana.org/domains/root/db/map.html
  11886. map
  11887. // market : Dog Beach, LLC
  11888. // https://www.iana.org/domains/root/db/market.html
  11889. market
  11890. // marketing : Binky Moon, LLC
  11891. // https://www.iana.org/domains/root/db/marketing.html
  11892. marketing
  11893. // markets : Dog Beach, LLC
  11894. // https://www.iana.org/domains/root/db/markets.html
  11895. markets
  11896. // marriott : Marriott Worldwide Corporation
  11897. // https://www.iana.org/domains/root/db/marriott.html
  11898. marriott
  11899. // marshalls : The TJX Companies, Inc.
  11900. // https://www.iana.org/domains/root/db/marshalls.html
  11901. marshalls
  11902. // mattel : Mattel Sites, Inc.
  11903. // https://www.iana.org/domains/root/db/mattel.html
  11904. mattel
  11905. // mba : Binky Moon, LLC
  11906. // https://www.iana.org/domains/root/db/mba.html
  11907. mba
  11908. // mckinsey : McKinsey Holdings, Inc.
  11909. // https://www.iana.org/domains/root/db/mckinsey.html
  11910. mckinsey
  11911. // med : Medistry LLC
  11912. // https://www.iana.org/domains/root/db/med.html
  11913. med
  11914. // media : Binky Moon, LLC
  11915. // https://www.iana.org/domains/root/db/media.html
  11916. media
  11917. // meet : Charleston Road Registry Inc.
  11918. // https://www.iana.org/domains/root/db/meet.html
  11919. meet
  11920. // melbourne : The Crown in right of the State of Victoria, represented by its Department of State Development, Business and Innovation
  11921. // https://www.iana.org/domains/root/db/melbourne.html
  11922. melbourne
  11923. // meme : Charleston Road Registry Inc.
  11924. // https://www.iana.org/domains/root/db/meme.html
  11925. meme
  11926. // memorial : Dog Beach, LLC
  11927. // https://www.iana.org/domains/root/db/memorial.html
  11928. memorial
  11929. // men : Exclusive Registry Limited
  11930. // https://www.iana.org/domains/root/db/men.html
  11931. men
  11932. // menu : Dot Menu Registry, LLC
  11933. // https://www.iana.org/domains/root/db/menu.html
  11934. menu
  11935. // merckmsd : MSD Registry Holdings, Inc.
  11936. // https://www.iana.org/domains/root/db/merckmsd.html
  11937. merckmsd
  11938. // miami : Registry Services, LLC
  11939. // https://www.iana.org/domains/root/db/miami.html
  11940. miami
  11941. // microsoft : Microsoft Corporation
  11942. // https://www.iana.org/domains/root/db/microsoft.html
  11943. microsoft
  11944. // mini : Bayerische Motoren Werke Aktiengesellschaft
  11945. // https://www.iana.org/domains/root/db/mini.html
  11946. mini
  11947. // mint : Intuit Administrative Services, Inc.
  11948. // https://www.iana.org/domains/root/db/mint.html
  11949. mint
  11950. // mit : Massachusetts Institute of Technology
  11951. // https://www.iana.org/domains/root/db/mit.html
  11952. mit
  11953. // mitsubishi : Mitsubishi Corporation
  11954. // https://www.iana.org/domains/root/db/mitsubishi.html
  11955. mitsubishi
  11956. // mlb : MLB Advanced Media DH, LLC
  11957. // https://www.iana.org/domains/root/db/mlb.html
  11958. mlb
  11959. // mls : The Canadian Real Estate Association
  11960. // https://www.iana.org/domains/root/db/mls.html
  11961. mls
  11962. // mma : MMA IARD
  11963. // https://www.iana.org/domains/root/db/mma.html
  11964. mma
  11965. // mobile : Dish DBS Corporation
  11966. // https://www.iana.org/domains/root/db/mobile.html
  11967. mobile
  11968. // moda : Dog Beach, LLC
  11969. // https://www.iana.org/domains/root/db/moda.html
  11970. moda
  11971. // moe : Interlink Systems Innovation Institute K.K.
  11972. // https://www.iana.org/domains/root/db/moe.html
  11973. moe
  11974. // moi : Amazon Registry Services, Inc.
  11975. // https://www.iana.org/domains/root/db/moi.html
  11976. moi
  11977. // mom : XYZ.COM LLC
  11978. // https://www.iana.org/domains/root/db/mom.html
  11979. mom
  11980. // monash : Monash University
  11981. // https://www.iana.org/domains/root/db/monash.html
  11982. monash
  11983. // money : Binky Moon, LLC
  11984. // https://www.iana.org/domains/root/db/money.html
  11985. money
  11986. // monster : XYZ.COM LLC
  11987. // https://www.iana.org/domains/root/db/monster.html
  11988. monster
  11989. // mormon : IRI Domain Management, LLC
  11990. // https://www.iana.org/domains/root/db/mormon.html
  11991. mormon
  11992. // mortgage : Dog Beach, LLC
  11993. // https://www.iana.org/domains/root/db/mortgage.html
  11994. mortgage
  11995. // moscow : Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)
  11996. // https://www.iana.org/domains/root/db/moscow.html
  11997. moscow
  11998. // moto : Motorola Trademark Holdings, LLC
  11999. // https://www.iana.org/domains/root/db/moto.html
  12000. moto
  12001. // motorcycles : XYZ.COM LLC
  12002. // https://www.iana.org/domains/root/db/motorcycles.html
  12003. motorcycles
  12004. // mov : Charleston Road Registry Inc.
  12005. // https://www.iana.org/domains/root/db/mov.html
  12006. mov
  12007. // movie : Binky Moon, LLC
  12008. // https://www.iana.org/domains/root/db/movie.html
  12009. movie
  12010. // msd : MSD Registry Holdings, Inc.
  12011. // https://www.iana.org/domains/root/db/msd.html
  12012. msd
  12013. // mtn : MTN Dubai Limited
  12014. // https://www.iana.org/domains/root/db/mtn.html
  12015. mtn
  12016. // mtr : MTR Corporation Limited
  12017. // https://www.iana.org/domains/root/db/mtr.html
  12018. mtr
  12019. // music : DotMusic Limited
  12020. // https://www.iana.org/domains/root/db/music.html
  12021. music
  12022. // nab : National Australia Bank Limited
  12023. // https://www.iana.org/domains/root/db/nab.html
  12024. nab
  12025. // nagoya : GMO Registry, Inc.
  12026. // https://www.iana.org/domains/root/db/nagoya.html
  12027. nagoya
  12028. // natura : NATURA COSMÉTICOS S.A.
  12029. // https://www.iana.org/domains/root/db/natura.html
  12030. natura
  12031. // navy : Dog Beach, LLC
  12032. // https://www.iana.org/domains/root/db/navy.html
  12033. navy
  12034. // nba : NBA REGISTRY, LLC
  12035. // https://www.iana.org/domains/root/db/nba.html
  12036. nba
  12037. // nec : NEC Corporation
  12038. // https://www.iana.org/domains/root/db/nec.html
  12039. nec
  12040. // netbank : COMMONWEALTH BANK OF AUSTRALIA
  12041. // https://www.iana.org/domains/root/db/netbank.html
  12042. netbank
  12043. // netflix : Netflix, Inc.
  12044. // https://www.iana.org/domains/root/db/netflix.html
  12045. netflix
  12046. // network : Binky Moon, LLC
  12047. // https://www.iana.org/domains/root/db/network.html
  12048. network
  12049. // neustar : NeuStar, Inc.
  12050. // https://www.iana.org/domains/root/db/neustar.html
  12051. neustar
  12052. // new : Charleston Road Registry Inc.
  12053. // https://www.iana.org/domains/root/db/new.html
  12054. new
  12055. // news : Dog Beach, LLC
  12056. // https://www.iana.org/domains/root/db/news.html
  12057. news
  12058. // next : Next plc
  12059. // https://www.iana.org/domains/root/db/next.html
  12060. next
  12061. // nextdirect : Next plc
  12062. // https://www.iana.org/domains/root/db/nextdirect.html
  12063. nextdirect
  12064. // nexus : Charleston Road Registry Inc.
  12065. // https://www.iana.org/domains/root/db/nexus.html
  12066. nexus
  12067. // nfl : NFL Reg Ops LLC
  12068. // https://www.iana.org/domains/root/db/nfl.html
  12069. nfl
  12070. // ngo : Public Interest Registry
  12071. // https://www.iana.org/domains/root/db/ngo.html
  12072. ngo
  12073. // nhk : Japan Broadcasting Corporation (NHK)
  12074. // https://www.iana.org/domains/root/db/nhk.html
  12075. nhk
  12076. // nico : DWANGO Co., Ltd.
  12077. // https://www.iana.org/domains/root/db/nico.html
  12078. nico
  12079. // nike : NIKE, Inc.
  12080. // https://www.iana.org/domains/root/db/nike.html
  12081. nike
  12082. // nikon : NIKON CORPORATION
  12083. // https://www.iana.org/domains/root/db/nikon.html
  12084. nikon
  12085. // ninja : Dog Beach, LLC
  12086. // https://www.iana.org/domains/root/db/ninja.html
  12087. ninja
  12088. // nissan : NISSAN MOTOR CO., LTD.
  12089. // https://www.iana.org/domains/root/db/nissan.html
  12090. nissan
  12091. // nissay : Nippon Life Insurance Company
  12092. // https://www.iana.org/domains/root/db/nissay.html
  12093. nissay
  12094. // nokia : Nokia Corporation
  12095. // https://www.iana.org/domains/root/db/nokia.html
  12096. nokia
  12097. // norton : NortonLifeLock Inc.
  12098. // https://www.iana.org/domains/root/db/norton.html
  12099. norton
  12100. // now : Amazon Registry Services, Inc.
  12101. // https://www.iana.org/domains/root/db/now.html
  12102. now
  12103. // nowruz : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
  12104. // https://www.iana.org/domains/root/db/nowruz.html
  12105. nowruz
  12106. // nowtv : Starbucks (HK) Limited
  12107. // https://www.iana.org/domains/root/db/nowtv.html
  12108. nowtv
  12109. // nra : NRA Holdings Company, INC.
  12110. // https://www.iana.org/domains/root/db/nra.html
  12111. nra
  12112. // nrw : Minds + Machines GmbH
  12113. // https://www.iana.org/domains/root/db/nrw.html
  12114. nrw
  12115. // ntt : NIPPON TELEGRAPH AND TELEPHONE CORPORATION
  12116. // https://www.iana.org/domains/root/db/ntt.html
  12117. ntt
  12118. // nyc : The City of New York by and through the New York City Department of Information Technology & Telecommunications
  12119. // https://www.iana.org/domains/root/db/nyc.html
  12120. nyc
  12121. // obi : OBI Group Holding SE & Co. KGaA
  12122. // https://www.iana.org/domains/root/db/obi.html
  12123. obi
  12124. // observer : Fegistry, LLC
  12125. // https://www.iana.org/domains/root/db/observer.html
  12126. observer
  12127. // office : Microsoft Corporation
  12128. // https://www.iana.org/domains/root/db/office.html
  12129. office
  12130. // okinawa : BRregistry, Inc.
  12131. // https://www.iana.org/domains/root/db/okinawa.html
  12132. okinawa
  12133. // olayan : Competrol (Luxembourg) Sarl
  12134. // https://www.iana.org/domains/root/db/olayan.html
  12135. olayan
  12136. // olayangroup : Competrol (Luxembourg) Sarl
  12137. // https://www.iana.org/domains/root/db/olayangroup.html
  12138. olayangroup
  12139. // oldnavy : The Gap, Inc.
  12140. // https://www.iana.org/domains/root/db/oldnavy.html
  12141. oldnavy
  12142. // ollo : Dish DBS Corporation
  12143. // https://www.iana.org/domains/root/db/ollo.html
  12144. ollo
  12145. // omega : The Swatch Group Ltd
  12146. // https://www.iana.org/domains/root/db/omega.html
  12147. omega
  12148. // one : One.com A/S
  12149. // https://www.iana.org/domains/root/db/one.html
  12150. one
  12151. // ong : Public Interest Registry
  12152. // https://www.iana.org/domains/root/db/ong.html
  12153. ong
  12154. // onl : iRegistry GmbH
  12155. // https://www.iana.org/domains/root/db/onl.html
  12156. onl
  12157. // online : Radix FZC DMCC
  12158. // https://www.iana.org/domains/root/db/online.html
  12159. online
  12160. // ooo : INFIBEAM AVENUES LIMITED
  12161. // https://www.iana.org/domains/root/db/ooo.html
  12162. ooo
  12163. // open : American Express Travel Related Services Company, Inc.
  12164. // https://www.iana.org/domains/root/db/open.html
  12165. open
  12166. // oracle : Oracle Corporation
  12167. // https://www.iana.org/domains/root/db/oracle.html
  12168. oracle
  12169. // orange : Orange Brand Services Limited
  12170. // https://www.iana.org/domains/root/db/orange.html
  12171. orange
  12172. // organic : Identity Digital Limited
  12173. // https://www.iana.org/domains/root/db/organic.html
  12174. organic
  12175. // origins : The Estée Lauder Companies Inc.
  12176. // https://www.iana.org/domains/root/db/origins.html
  12177. origins
  12178. // osaka : Osaka Registry Co., Ltd.
  12179. // https://www.iana.org/domains/root/db/osaka.html
  12180. osaka
  12181. // otsuka : Otsuka Holdings Co., Ltd.
  12182. // https://www.iana.org/domains/root/db/otsuka.html
  12183. otsuka
  12184. // ott : Dish DBS Corporation
  12185. // https://www.iana.org/domains/root/db/ott.html
  12186. ott
  12187. // ovh : MédiaBC
  12188. // https://www.iana.org/domains/root/db/ovh.html
  12189. ovh
  12190. // page : Charleston Road Registry Inc.
  12191. // https://www.iana.org/domains/root/db/page.html
  12192. page
  12193. // panasonic : Panasonic Holdings Corporation
  12194. // https://www.iana.org/domains/root/db/panasonic.html
  12195. panasonic
  12196. // paris : City of Paris
  12197. // https://www.iana.org/domains/root/db/paris.html
  12198. paris
  12199. // pars : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
  12200. // https://www.iana.org/domains/root/db/pars.html
  12201. pars
  12202. // partners : Binky Moon, LLC
  12203. // https://www.iana.org/domains/root/db/partners.html
  12204. partners
  12205. // parts : Binky Moon, LLC
  12206. // https://www.iana.org/domains/root/db/parts.html
  12207. parts
  12208. // party : Blue Sky Registry Limited
  12209. // https://www.iana.org/domains/root/db/party.html
  12210. party
  12211. // pay : Amazon Registry Services, Inc.
  12212. // https://www.iana.org/domains/root/db/pay.html
  12213. pay
  12214. // pccw : PCCW Enterprises Limited
  12215. // https://www.iana.org/domains/root/db/pccw.html
  12216. pccw
  12217. // pet : Identity Digital Limited
  12218. // https://www.iana.org/domains/root/db/pet.html
  12219. pet
  12220. // pfizer : Pfizer Inc.
  12221. // https://www.iana.org/domains/root/db/pfizer.html
  12222. pfizer
  12223. // pharmacy : National Association of Boards of Pharmacy
  12224. // https://www.iana.org/domains/root/db/pharmacy.html
  12225. pharmacy
  12226. // phd : Charleston Road Registry Inc.
  12227. // https://www.iana.org/domains/root/db/phd.html
  12228. phd
  12229. // philips : Koninklijke Philips N.V.
  12230. // https://www.iana.org/domains/root/db/philips.html
  12231. philips
  12232. // phone : Dish DBS Corporation
  12233. // https://www.iana.org/domains/root/db/phone.html
  12234. phone
  12235. // photo : Registry Services, LLC
  12236. // https://www.iana.org/domains/root/db/photo.html
  12237. photo
  12238. // photography : Binky Moon, LLC
  12239. // https://www.iana.org/domains/root/db/photography.html
  12240. photography
  12241. // photos : Binky Moon, LLC
  12242. // https://www.iana.org/domains/root/db/photos.html
  12243. photos
  12244. // physio : PhysBiz Pty Ltd
  12245. // https://www.iana.org/domains/root/db/physio.html
  12246. physio
  12247. // pics : XYZ.COM LLC
  12248. // https://www.iana.org/domains/root/db/pics.html
  12249. pics
  12250. // pictet : Pictet Europe S.A.
  12251. // https://www.iana.org/domains/root/db/pictet.html
  12252. pictet
  12253. // pictures : Binky Moon, LLC
  12254. // https://www.iana.org/domains/root/db/pictures.html
  12255. pictures
  12256. // pid : Top Level Spectrum, Inc.
  12257. // https://www.iana.org/domains/root/db/pid.html
  12258. pid
  12259. // pin : Amazon Registry Services, Inc.
  12260. // https://www.iana.org/domains/root/db/pin.html
  12261. pin
  12262. // ping : Ping Registry Provider, Inc.
  12263. // https://www.iana.org/domains/root/db/ping.html
  12264. ping
  12265. // pink : Identity Digital Limited
  12266. // https://www.iana.org/domains/root/db/pink.html
  12267. pink
  12268. // pioneer : Pioneer Corporation
  12269. // https://www.iana.org/domains/root/db/pioneer.html
  12270. pioneer
  12271. // pizza : Binky Moon, LLC
  12272. // https://www.iana.org/domains/root/db/pizza.html
  12273. pizza
  12274. // place : Binky Moon, LLC
  12275. // https://www.iana.org/domains/root/db/place.html
  12276. place
  12277. // play : Charleston Road Registry Inc.
  12278. // https://www.iana.org/domains/root/db/play.html
  12279. play
  12280. // playstation : Sony Interactive Entertainment Inc.
  12281. // https://www.iana.org/domains/root/db/playstation.html
  12282. playstation
  12283. // plumbing : Binky Moon, LLC
  12284. // https://www.iana.org/domains/root/db/plumbing.html
  12285. plumbing
  12286. // plus : Binky Moon, LLC
  12287. // https://www.iana.org/domains/root/db/plus.html
  12288. plus
  12289. // pnc : PNC Domain Co., LLC
  12290. // https://www.iana.org/domains/root/db/pnc.html
  12291. pnc
  12292. // pohl : Deutsche Vermögensberatung Aktiengesellschaft DVAG
  12293. // https://www.iana.org/domains/root/db/pohl.html
  12294. pohl
  12295. // poker : Identity Digital Limited
  12296. // https://www.iana.org/domains/root/db/poker.html
  12297. poker
  12298. // politie : Politie Nederland
  12299. // https://www.iana.org/domains/root/db/politie.html
  12300. politie
  12301. // porn : ICM Registry PN LLC
  12302. // https://www.iana.org/domains/root/db/porn.html
  12303. porn
  12304. // pramerica : Prudential Financial, Inc.
  12305. // https://www.iana.org/domains/root/db/pramerica.html
  12306. pramerica
  12307. // praxi : Praxi S.p.A.
  12308. // https://www.iana.org/domains/root/db/praxi.html
  12309. praxi
  12310. // press : Radix FZC DMCC
  12311. // https://www.iana.org/domains/root/db/press.html
  12312. press
  12313. // prime : Amazon Registry Services, Inc.
  12314. // https://www.iana.org/domains/root/db/prime.html
  12315. prime
  12316. // prod : Charleston Road Registry Inc.
  12317. // https://www.iana.org/domains/root/db/prod.html
  12318. prod
  12319. // productions : Binky Moon, LLC
  12320. // https://www.iana.org/domains/root/db/productions.html
  12321. productions
  12322. // prof : Charleston Road Registry Inc.
  12323. // https://www.iana.org/domains/root/db/prof.html
  12324. prof
  12325. // progressive : Progressive Casualty Insurance Company
  12326. // https://www.iana.org/domains/root/db/progressive.html
  12327. progressive
  12328. // promo : Identity Digital Limited
  12329. // https://www.iana.org/domains/root/db/promo.html
  12330. promo
  12331. // properties : Binky Moon, LLC
  12332. // https://www.iana.org/domains/root/db/properties.html
  12333. properties
  12334. // property : Digital Property Infrastructure Limited
  12335. // https://www.iana.org/domains/root/db/property.html
  12336. property
  12337. // protection : XYZ.COM LLC
  12338. // https://www.iana.org/domains/root/db/protection.html
  12339. protection
  12340. // pru : Prudential Financial, Inc.
  12341. // https://www.iana.org/domains/root/db/pru.html
  12342. pru
  12343. // prudential : Prudential Financial, Inc.
  12344. // https://www.iana.org/domains/root/db/prudential.html
  12345. prudential
  12346. // pub : Dog Beach, LLC
  12347. // https://www.iana.org/domains/root/db/pub.html
  12348. pub
  12349. // pwc : PricewaterhouseCoopers LLP
  12350. // https://www.iana.org/domains/root/db/pwc.html
  12351. pwc
  12352. // qpon : dotQPON LLC
  12353. // https://www.iana.org/domains/root/db/qpon.html
  12354. qpon
  12355. // quebec : PointQuébec Inc
  12356. // https://www.iana.org/domains/root/db/quebec.html
  12357. quebec
  12358. // quest : XYZ.COM LLC
  12359. // https://www.iana.org/domains/root/db/quest.html
  12360. quest
  12361. // racing : Premier Registry Limited
  12362. // https://www.iana.org/domains/root/db/racing.html
  12363. racing
  12364. // radio : European Broadcasting Union (EBU)
  12365. // https://www.iana.org/domains/root/db/radio.html
  12366. radio
  12367. // read : Amazon Registry Services, Inc.
  12368. // https://www.iana.org/domains/root/db/read.html
  12369. read
  12370. // realestate : dotRealEstate LLC
  12371. // https://www.iana.org/domains/root/db/realestate.html
  12372. realestate
  12373. // realtor : Real Estate Domains LLC
  12374. // https://www.iana.org/domains/root/db/realtor.html
  12375. realtor
  12376. // realty : Internet Naming Company LLC
  12377. // https://www.iana.org/domains/root/db/realty.html
  12378. realty
  12379. // recipes : Binky Moon, LLC
  12380. // https://www.iana.org/domains/root/db/recipes.html
  12381. recipes
  12382. // red : Identity Digital Limited
  12383. // https://www.iana.org/domains/root/db/red.html
  12384. red
  12385. // redstone : Redstone Haute Couture Co., Ltd.
  12386. // https://www.iana.org/domains/root/db/redstone.html
  12387. redstone
  12388. // redumbrella : Travelers TLD, LLC
  12389. // https://www.iana.org/domains/root/db/redumbrella.html
  12390. redumbrella
  12391. // rehab : Dog Beach, LLC
  12392. // https://www.iana.org/domains/root/db/rehab.html
  12393. rehab
  12394. // reise : Binky Moon, LLC
  12395. // https://www.iana.org/domains/root/db/reise.html
  12396. reise
  12397. // reisen : Binky Moon, LLC
  12398. // https://www.iana.org/domains/root/db/reisen.html
  12399. reisen
  12400. // reit : National Association of Real Estate Investment Trusts, Inc.
  12401. // https://www.iana.org/domains/root/db/reit.html
  12402. reit
  12403. // reliance : Reliance Industries Limited
  12404. // https://www.iana.org/domains/root/db/reliance.html
  12405. reliance
  12406. // ren : ZDNS International Limited
  12407. // https://www.iana.org/domains/root/db/ren.html
  12408. ren
  12409. // rent : XYZ.COM LLC
  12410. // https://www.iana.org/domains/root/db/rent.html
  12411. rent
  12412. // rentals : Binky Moon, LLC
  12413. // https://www.iana.org/domains/root/db/rentals.html
  12414. rentals
  12415. // repair : Binky Moon, LLC
  12416. // https://www.iana.org/domains/root/db/repair.html
  12417. repair
  12418. // report : Binky Moon, LLC
  12419. // https://www.iana.org/domains/root/db/report.html
  12420. report
  12421. // republican : Dog Beach, LLC
  12422. // https://www.iana.org/domains/root/db/republican.html
  12423. republican
  12424. // rest : Punto 2012 Sociedad Anonima Promotora de Inversion de Capital Variable
  12425. // https://www.iana.org/domains/root/db/rest.html
  12426. rest
  12427. // restaurant : Binky Moon, LLC
  12428. // https://www.iana.org/domains/root/db/restaurant.html
  12429. restaurant
  12430. // review : dot Review Limited
  12431. // https://www.iana.org/domains/root/db/review.html
  12432. review
  12433. // reviews : Dog Beach, LLC
  12434. // https://www.iana.org/domains/root/db/reviews.html
  12435. reviews
  12436. // rexroth : Robert Bosch GMBH
  12437. // https://www.iana.org/domains/root/db/rexroth.html
  12438. rexroth
  12439. // rich : iRegistry GmbH
  12440. // https://www.iana.org/domains/root/db/rich.html
  12441. rich
  12442. // richardli : Pacific Century Asset Management (HK) Limited
  12443. // https://www.iana.org/domains/root/db/richardli.html
  12444. richardli
  12445. // ricoh : Ricoh Company, Ltd.
  12446. // https://www.iana.org/domains/root/db/ricoh.html
  12447. ricoh
  12448. // ril : Reliance Industries Limited
  12449. // https://www.iana.org/domains/root/db/ril.html
  12450. ril
  12451. // rio : Empresa Municipal de Informática SA - IPLANRIO
  12452. // https://www.iana.org/domains/root/db/rio.html
  12453. rio
  12454. // rip : Dog Beach, LLC
  12455. // https://www.iana.org/domains/root/db/rip.html
  12456. rip
  12457. // rocher : Ferrero Trading Lux S.A.
  12458. // https://www.iana.org/domains/root/db/rocher.html
  12459. rocher
  12460. // rocks : Dog Beach, LLC
  12461. // https://www.iana.org/domains/root/db/rocks.html
  12462. rocks
  12463. // rodeo : Registry Services, LLC
  12464. // https://www.iana.org/domains/root/db/rodeo.html
  12465. rodeo
  12466. // rogers : Rogers Communications Canada Inc.
  12467. // https://www.iana.org/domains/root/db/rogers.html
  12468. rogers
  12469. // room : Amazon Registry Services, Inc.
  12470. // https://www.iana.org/domains/root/db/room.html
  12471. room
  12472. // rsvp : Charleston Road Registry Inc.
  12473. // https://www.iana.org/domains/root/db/rsvp.html
  12474. rsvp
  12475. // rugby : World Rugby Strategic Developments Limited
  12476. // https://www.iana.org/domains/root/db/rugby.html
  12477. rugby
  12478. // ruhr : dotSaarland GmbH
  12479. // https://www.iana.org/domains/root/db/ruhr.html
  12480. ruhr
  12481. // run : Binky Moon, LLC
  12482. // https://www.iana.org/domains/root/db/run.html
  12483. run
  12484. // rwe : RWE AG
  12485. // https://www.iana.org/domains/root/db/rwe.html
  12486. rwe
  12487. // ryukyu : BRregistry, Inc.
  12488. // https://www.iana.org/domains/root/db/ryukyu.html
  12489. ryukyu
  12490. // saarland : dotSaarland GmbH
  12491. // https://www.iana.org/domains/root/db/saarland.html
  12492. saarland
  12493. // safe : Amazon Registry Services, Inc.
  12494. // https://www.iana.org/domains/root/db/safe.html
  12495. safe
  12496. // safety : Safety Registry Services, LLC.
  12497. // https://www.iana.org/domains/root/db/safety.html
  12498. safety
  12499. // sakura : SAKURA Internet Inc.
  12500. // https://www.iana.org/domains/root/db/sakura.html
  12501. sakura
  12502. // sale : Dog Beach, LLC
  12503. // https://www.iana.org/domains/root/db/sale.html
  12504. sale
  12505. // salon : Binky Moon, LLC
  12506. // https://www.iana.org/domains/root/db/salon.html
  12507. salon
  12508. // samsclub : Wal-Mart Stores, Inc.
  12509. // https://www.iana.org/domains/root/db/samsclub.html
  12510. samsclub
  12511. // samsung : SAMSUNG SDS CO., LTD
  12512. // https://www.iana.org/domains/root/db/samsung.html
  12513. samsung
  12514. // sandvik : Sandvik AB
  12515. // https://www.iana.org/domains/root/db/sandvik.html
  12516. sandvik
  12517. // sandvikcoromant : Sandvik AB
  12518. // https://www.iana.org/domains/root/db/sandvikcoromant.html
  12519. sandvikcoromant
  12520. // sanofi : Sanofi
  12521. // https://www.iana.org/domains/root/db/sanofi.html
  12522. sanofi
  12523. // sap : SAP AG
  12524. // https://www.iana.org/domains/root/db/sap.html
  12525. sap
  12526. // sarl : Binky Moon, LLC
  12527. // https://www.iana.org/domains/root/db/sarl.html
  12528. sarl
  12529. // sas : Research IP LLC
  12530. // https://www.iana.org/domains/root/db/sas.html
  12531. sas
  12532. // save : Amazon Registry Services, Inc.
  12533. // https://www.iana.org/domains/root/db/save.html
  12534. save
  12535. // saxo : Saxo Bank A/S
  12536. // https://www.iana.org/domains/root/db/saxo.html
  12537. saxo
  12538. // sbi : STATE BANK OF INDIA
  12539. // https://www.iana.org/domains/root/db/sbi.html
  12540. sbi
  12541. // sbs : ShortDot SA
  12542. // https://www.iana.org/domains/root/db/sbs.html
  12543. sbs
  12544. // sca : SVENSKA CELLULOSA AKTIEBOLAGET SCA (publ)
  12545. // https://www.iana.org/domains/root/db/sca.html
  12546. sca
  12547. // scb : The Siam Commercial Bank Public Company Limited ("SCB")
  12548. // https://www.iana.org/domains/root/db/scb.html
  12549. scb
  12550. // schaeffler : Schaeffler Technologies AG & Co. KG
  12551. // https://www.iana.org/domains/root/db/schaeffler.html
  12552. schaeffler
  12553. // schmidt : SCHMIDT GROUPE S.A.S.
  12554. // https://www.iana.org/domains/root/db/schmidt.html
  12555. schmidt
  12556. // scholarships : Scholarships.com, LLC
  12557. // https://www.iana.org/domains/root/db/scholarships.html
  12558. scholarships
  12559. // school : Binky Moon, LLC
  12560. // https://www.iana.org/domains/root/db/school.html
  12561. school
  12562. // schule : Binky Moon, LLC
  12563. // https://www.iana.org/domains/root/db/schule.html
  12564. schule
  12565. // schwarz : Schwarz Domains und Services GmbH & Co. KG
  12566. // https://www.iana.org/domains/root/db/schwarz.html
  12567. schwarz
  12568. // science : dot Science Limited
  12569. // https://www.iana.org/domains/root/db/science.html
  12570. science
  12571. // scot : Dot Scot Registry Limited
  12572. // https://www.iana.org/domains/root/db/scot.html
  12573. scot
  12574. // search : Charleston Road Registry Inc.
  12575. // https://www.iana.org/domains/root/db/search.html
  12576. search
  12577. // seat : SEAT, S.A. (Sociedad Unipersonal)
  12578. // https://www.iana.org/domains/root/db/seat.html
  12579. seat
  12580. // secure : Amazon Registry Services, Inc.
  12581. // https://www.iana.org/domains/root/db/secure.html
  12582. secure
  12583. // security : XYZ.COM LLC
  12584. // https://www.iana.org/domains/root/db/security.html
  12585. security
  12586. // seek : Seek Limited
  12587. // https://www.iana.org/domains/root/db/seek.html
  12588. seek
  12589. // select : Registry Services, LLC
  12590. // https://www.iana.org/domains/root/db/select.html
  12591. select
  12592. // sener : Sener Ingeniería y Sistemas, S.A.
  12593. // https://www.iana.org/domains/root/db/sener.html
  12594. sener
  12595. // services : Binky Moon, LLC
  12596. // https://www.iana.org/domains/root/db/services.html
  12597. services
  12598. // seven : Seven West Media Ltd
  12599. // https://www.iana.org/domains/root/db/seven.html
  12600. seven
  12601. // sew : SEW-EURODRIVE GmbH & Co KG
  12602. // https://www.iana.org/domains/root/db/sew.html
  12603. sew
  12604. // sex : ICM Registry SX LLC
  12605. // https://www.iana.org/domains/root/db/sex.html
  12606. sex
  12607. // sexy : Internet Naming Company LLC
  12608. // https://www.iana.org/domains/root/db/sexy.html
  12609. sexy
  12610. // sfr : Societe Francaise du Radiotelephone - SFR
  12611. // https://www.iana.org/domains/root/db/sfr.html
  12612. sfr
  12613. // shangrila : Shangri‐La International Hotel Management Limited
  12614. // https://www.iana.org/domains/root/db/shangrila.html
  12615. shangrila
  12616. // sharp : Sharp Corporation
  12617. // https://www.iana.org/domains/root/db/sharp.html
  12618. sharp
  12619. // shaw : Shaw Cablesystems G.P.
  12620. // https://www.iana.org/domains/root/db/shaw.html
  12621. shaw
  12622. // shell : Shell Information Technology International Inc
  12623. // https://www.iana.org/domains/root/db/shell.html
  12624. shell
  12625. // shia : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
  12626. // https://www.iana.org/domains/root/db/shia.html
  12627. shia
  12628. // shiksha : Identity Digital Limited
  12629. // https://www.iana.org/domains/root/db/shiksha.html
  12630. shiksha
  12631. // shoes : Binky Moon, LLC
  12632. // https://www.iana.org/domains/root/db/shoes.html
  12633. shoes
  12634. // shop : GMO Registry, Inc.
  12635. // https://www.iana.org/domains/root/db/shop.html
  12636. shop
  12637. // shopping : Binky Moon, LLC
  12638. // https://www.iana.org/domains/root/db/shopping.html
  12639. shopping
  12640. // shouji : Beijing Qihu Keji Co., Ltd.
  12641. // https://www.iana.org/domains/root/db/shouji.html
  12642. shouji
  12643. // show : Binky Moon, LLC
  12644. // https://www.iana.org/domains/root/db/show.html
  12645. show
  12646. // showtime : CBS Domains Inc.
  12647. // https://www.iana.org/domains/root/db/showtime.html
  12648. showtime
  12649. // silk : Amazon Registry Services, Inc.
  12650. // https://www.iana.org/domains/root/db/silk.html
  12651. silk
  12652. // sina : Sina Corporation
  12653. // https://www.iana.org/domains/root/db/sina.html
  12654. sina
  12655. // singles : Binky Moon, LLC
  12656. // https://www.iana.org/domains/root/db/singles.html
  12657. singles
  12658. // site : Radix FZC DMCC
  12659. // https://www.iana.org/domains/root/db/site.html
  12660. site
  12661. // ski : Identity Digital Limited
  12662. // https://www.iana.org/domains/root/db/ski.html
  12663. ski
  12664. // skin : XYZ.COM LLC
  12665. // https://www.iana.org/domains/root/db/skin.html
  12666. skin
  12667. // sky : Sky International AG
  12668. // https://www.iana.org/domains/root/db/sky.html
  12669. sky
  12670. // skype : Microsoft Corporation
  12671. // https://www.iana.org/domains/root/db/skype.html
  12672. skype
  12673. // sling : DISH Technologies L.L.C.
  12674. // https://www.iana.org/domains/root/db/sling.html
  12675. sling
  12676. // smart : Smart Communications, Inc. (SMART)
  12677. // https://www.iana.org/domains/root/db/smart.html
  12678. smart
  12679. // smile : Amazon Registry Services, Inc.
  12680. // https://www.iana.org/domains/root/db/smile.html
  12681. smile
  12682. // sncf : Société Nationale SNCF
  12683. // https://www.iana.org/domains/root/db/sncf.html
  12684. sncf
  12685. // soccer : Binky Moon, LLC
  12686. // https://www.iana.org/domains/root/db/soccer.html
  12687. soccer
  12688. // social : Dog Beach, LLC
  12689. // https://www.iana.org/domains/root/db/social.html
  12690. social
  12691. // softbank : SoftBank Group Corp.
  12692. // https://www.iana.org/domains/root/db/softbank.html
  12693. softbank
  12694. // software : Dog Beach, LLC
  12695. // https://www.iana.org/domains/root/db/software.html
  12696. software
  12697. // sohu : Sohu.com Limited
  12698. // https://www.iana.org/domains/root/db/sohu.html
  12699. sohu
  12700. // solar : Binky Moon, LLC
  12701. // https://www.iana.org/domains/root/db/solar.html
  12702. solar
  12703. // solutions : Binky Moon, LLC
  12704. // https://www.iana.org/domains/root/db/solutions.html
  12705. solutions
  12706. // song : Amazon Registry Services, Inc.
  12707. // https://www.iana.org/domains/root/db/song.html
  12708. song
  12709. // sony : Sony Corporation
  12710. // https://www.iana.org/domains/root/db/sony.html
  12711. sony
  12712. // soy : Charleston Road Registry Inc.
  12713. // https://www.iana.org/domains/root/db/soy.html
  12714. soy
  12715. // spa : Asia Spa and Wellness Promotion Council Limited
  12716. // https://www.iana.org/domains/root/db/spa.html
  12717. spa
  12718. // space : Radix FZC DMCC
  12719. // https://www.iana.org/domains/root/db/space.html
  12720. space
  12721. // sport : SportAccord
  12722. // https://www.iana.org/domains/root/db/sport.html
  12723. sport
  12724. // spot : Amazon Registry Services, Inc.
  12725. // https://www.iana.org/domains/root/db/spot.html
  12726. spot
  12727. // srl : InterNetX, Corp
  12728. // https://www.iana.org/domains/root/db/srl.html
  12729. srl
  12730. // stada : STADA Arzneimittel AG
  12731. // https://www.iana.org/domains/root/db/stada.html
  12732. stada
  12733. // staples : Staples, Inc.
  12734. // https://www.iana.org/domains/root/db/staples.html
  12735. staples
  12736. // star : Star India Private Limited
  12737. // https://www.iana.org/domains/root/db/star.html
  12738. star
  12739. // statebank : STATE BANK OF INDIA
  12740. // https://www.iana.org/domains/root/db/statebank.html
  12741. statebank
  12742. // statefarm : State Farm Mutual Automobile Insurance Company
  12743. // https://www.iana.org/domains/root/db/statefarm.html
  12744. statefarm
  12745. // stc : Saudi Telecom Company
  12746. // https://www.iana.org/domains/root/db/stc.html
  12747. stc
  12748. // stcgroup : Saudi Telecom Company
  12749. // https://www.iana.org/domains/root/db/stcgroup.html
  12750. stcgroup
  12751. // stockholm : Stockholms kommun
  12752. // https://www.iana.org/domains/root/db/stockholm.html
  12753. stockholm
  12754. // storage : XYZ.COM LLC
  12755. // https://www.iana.org/domains/root/db/storage.html
  12756. storage
  12757. // store : Radix FZC DMCC
  12758. // https://www.iana.org/domains/root/db/store.html
  12759. store
  12760. // stream : dot Stream Limited
  12761. // https://www.iana.org/domains/root/db/stream.html
  12762. stream
  12763. // studio : Dog Beach, LLC
  12764. // https://www.iana.org/domains/root/db/studio.html
  12765. studio
  12766. // study : Registry Services, LLC
  12767. // https://www.iana.org/domains/root/db/study.html
  12768. study
  12769. // style : Binky Moon, LLC
  12770. // https://www.iana.org/domains/root/db/style.html
  12771. style
  12772. // sucks : Vox Populi Registry Ltd.
  12773. // https://www.iana.org/domains/root/db/sucks.html
  12774. sucks
  12775. // supplies : Binky Moon, LLC
  12776. // https://www.iana.org/domains/root/db/supplies.html
  12777. supplies
  12778. // supply : Binky Moon, LLC
  12779. // https://www.iana.org/domains/root/db/supply.html
  12780. supply
  12781. // support : Binky Moon, LLC
  12782. // https://www.iana.org/domains/root/db/support.html
  12783. support
  12784. // surf : Registry Services, LLC
  12785. // https://www.iana.org/domains/root/db/surf.html
  12786. surf
  12787. // surgery : Binky Moon, LLC
  12788. // https://www.iana.org/domains/root/db/surgery.html
  12789. surgery
  12790. // suzuki : SUZUKI MOTOR CORPORATION
  12791. // https://www.iana.org/domains/root/db/suzuki.html
  12792. suzuki
  12793. // swatch : The Swatch Group Ltd
  12794. // https://www.iana.org/domains/root/db/swatch.html
  12795. swatch
  12796. // swiss : Swiss Confederation
  12797. // https://www.iana.org/domains/root/db/swiss.html
  12798. swiss
  12799. // sydney : State of New South Wales, Department of Premier and Cabinet
  12800. // https://www.iana.org/domains/root/db/sydney.html
  12801. sydney
  12802. // systems : Binky Moon, LLC
  12803. // https://www.iana.org/domains/root/db/systems.html
  12804. systems
  12805. // tab : Tabcorp Holdings Limited
  12806. // https://www.iana.org/domains/root/db/tab.html
  12807. tab
  12808. // taipei : Taipei City Government
  12809. // https://www.iana.org/domains/root/db/taipei.html
  12810. taipei
  12811. // talk : Amazon Registry Services, Inc.
  12812. // https://www.iana.org/domains/root/db/talk.html
  12813. talk
  12814. // taobao : Alibaba Group Holding Limited
  12815. // https://www.iana.org/domains/root/db/taobao.html
  12816. taobao
  12817. // target : Target Domain Holdings, LLC
  12818. // https://www.iana.org/domains/root/db/target.html
  12819. target
  12820. // tatamotors : Tata Motors Ltd
  12821. // https://www.iana.org/domains/root/db/tatamotors.html
  12822. tatamotors
  12823. // tatar : Limited Liability Company "Coordination Center of Regional Domain of Tatarstan Republic"
  12824. // https://www.iana.org/domains/root/db/tatar.html
  12825. tatar
  12826. // tattoo : Registry Services, LLC
  12827. // https://www.iana.org/domains/root/db/tattoo.html
  12828. tattoo
  12829. // tax : Binky Moon, LLC
  12830. // https://www.iana.org/domains/root/db/tax.html
  12831. tax
  12832. // taxi : Binky Moon, LLC
  12833. // https://www.iana.org/domains/root/db/taxi.html
  12834. taxi
  12835. // tci : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
  12836. // https://www.iana.org/domains/root/db/tci.html
  12837. tci
  12838. // tdk : TDK Corporation
  12839. // https://www.iana.org/domains/root/db/tdk.html
  12840. tdk
  12841. // team : Binky Moon, LLC
  12842. // https://www.iana.org/domains/root/db/team.html
  12843. team
  12844. // tech : Radix FZC DMCC
  12845. // https://www.iana.org/domains/root/db/tech.html
  12846. tech
  12847. // technology : Binky Moon, LLC
  12848. // https://www.iana.org/domains/root/db/technology.html
  12849. technology
  12850. // temasek : Temasek Holdings (Private) Limited
  12851. // https://www.iana.org/domains/root/db/temasek.html
  12852. temasek
  12853. // tennis : Binky Moon, LLC
  12854. // https://www.iana.org/domains/root/db/tennis.html
  12855. tennis
  12856. // teva : Teva Pharmaceutical Industries Limited
  12857. // https://www.iana.org/domains/root/db/teva.html
  12858. teva
  12859. // thd : Home Depot Product Authority, LLC
  12860. // https://www.iana.org/domains/root/db/thd.html
  12861. thd
  12862. // theater : Binky Moon, LLC
  12863. // https://www.iana.org/domains/root/db/theater.html
  12864. theater
  12865. // theatre : XYZ.COM LLC
  12866. // https://www.iana.org/domains/root/db/theatre.html
  12867. theatre
  12868. // tiaa : Teachers Insurance and Annuity Association of America
  12869. // https://www.iana.org/domains/root/db/tiaa.html
  12870. tiaa
  12871. // tickets : XYZ.COM LLC
  12872. // https://www.iana.org/domains/root/db/tickets.html
  12873. tickets
  12874. // tienda : Binky Moon, LLC
  12875. // https://www.iana.org/domains/root/db/tienda.html
  12876. tienda
  12877. // tips : Binky Moon, LLC
  12878. // https://www.iana.org/domains/root/db/tips.html
  12879. tips
  12880. // tires : Binky Moon, LLC
  12881. // https://www.iana.org/domains/root/db/tires.html
  12882. tires
  12883. // tirol : punkt Tirol GmbH
  12884. // https://www.iana.org/domains/root/db/tirol.html
  12885. tirol
  12886. // tjmaxx : The TJX Companies, Inc.
  12887. // https://www.iana.org/domains/root/db/tjmaxx.html
  12888. tjmaxx
  12889. // tjx : The TJX Companies, Inc.
  12890. // https://www.iana.org/domains/root/db/tjx.html
  12891. tjx
  12892. // tkmaxx : The TJX Companies, Inc.
  12893. // https://www.iana.org/domains/root/db/tkmaxx.html
  12894. tkmaxx
  12895. // tmall : Alibaba Group Holding Limited
  12896. // https://www.iana.org/domains/root/db/tmall.html
  12897. tmall
  12898. // today : Binky Moon, LLC
  12899. // https://www.iana.org/domains/root/db/today.html
  12900. today
  12901. // tokyo : GMO Registry, Inc.
  12902. // https://www.iana.org/domains/root/db/tokyo.html
  12903. tokyo
  12904. // tools : Binky Moon, LLC
  12905. // https://www.iana.org/domains/root/db/tools.html
  12906. tools
  12907. // top : .TOP Registry
  12908. // https://www.iana.org/domains/root/db/top.html
  12909. top
  12910. // toray : Toray Industries, Inc.
  12911. // https://www.iana.org/domains/root/db/toray.html
  12912. toray
  12913. // toshiba : TOSHIBA Corporation
  12914. // https://www.iana.org/domains/root/db/toshiba.html
  12915. toshiba
  12916. // total : TotalEnergies SE
  12917. // https://www.iana.org/domains/root/db/total.html
  12918. total
  12919. // tours : Binky Moon, LLC
  12920. // https://www.iana.org/domains/root/db/tours.html
  12921. tours
  12922. // town : Binky Moon, LLC
  12923. // https://www.iana.org/domains/root/db/town.html
  12924. town
  12925. // toyota : TOYOTA MOTOR CORPORATION
  12926. // https://www.iana.org/domains/root/db/toyota.html
  12927. toyota
  12928. // toys : Binky Moon, LLC
  12929. // https://www.iana.org/domains/root/db/toys.html
  12930. toys
  12931. // trade : Elite Registry Limited
  12932. // https://www.iana.org/domains/root/db/trade.html
  12933. trade
  12934. // trading : Dog Beach, LLC
  12935. // https://www.iana.org/domains/root/db/trading.html
  12936. trading
  12937. // training : Binky Moon, LLC
  12938. // https://www.iana.org/domains/root/db/training.html
  12939. training
  12940. // travel : Dog Beach, LLC
  12941. // https://www.iana.org/domains/root/db/travel.html
  12942. travel
  12943. // travelers : Travelers TLD, LLC
  12944. // https://www.iana.org/domains/root/db/travelers.html
  12945. travelers
  12946. // travelersinsurance : Travelers TLD, LLC
  12947. // https://www.iana.org/domains/root/db/travelersinsurance.html
  12948. travelersinsurance
  12949. // trust : Internet Naming Company LLC
  12950. // https://www.iana.org/domains/root/db/trust.html
  12951. trust
  12952. // trv : Travelers TLD, LLC
  12953. // https://www.iana.org/domains/root/db/trv.html
  12954. trv
  12955. // tube : Latin American Telecom LLC
  12956. // https://www.iana.org/domains/root/db/tube.html
  12957. tube
  12958. // tui : TUI AG
  12959. // https://www.iana.org/domains/root/db/tui.html
  12960. tui
  12961. // tunes : Amazon Registry Services, Inc.
  12962. // https://www.iana.org/domains/root/db/tunes.html
  12963. tunes
  12964. // tushu : Amazon Registry Services, Inc.
  12965. // https://www.iana.org/domains/root/db/tushu.html
  12966. tushu
  12967. // tvs : T V SUNDRAM IYENGAR & SONS LIMITED
  12968. // https://www.iana.org/domains/root/db/tvs.html
  12969. tvs
  12970. // ubank : National Australia Bank Limited
  12971. // https://www.iana.org/domains/root/db/ubank.html
  12972. ubank
  12973. // ubs : UBS AG
  12974. // https://www.iana.org/domains/root/db/ubs.html
  12975. ubs
  12976. // unicom : China United Network Communications Corporation Limited
  12977. // https://www.iana.org/domains/root/db/unicom.html
  12978. unicom
  12979. // university : Binky Moon, LLC
  12980. // https://www.iana.org/domains/root/db/university.html
  12981. university
  12982. // uno : Radix FZC DMCC
  12983. // https://www.iana.org/domains/root/db/uno.html
  12984. uno
  12985. // uol : UBN INTERNET LTDA.
  12986. // https://www.iana.org/domains/root/db/uol.html
  12987. uol
  12988. // ups : UPS Market Driver, Inc.
  12989. // https://www.iana.org/domains/root/db/ups.html
  12990. ups
  12991. // vacations : Binky Moon, LLC
  12992. // https://www.iana.org/domains/root/db/vacations.html
  12993. vacations
  12994. // vana : Lifestyle Domain Holdings, Inc.
  12995. // https://www.iana.org/domains/root/db/vana.html
  12996. vana
  12997. // vanguard : The Vanguard Group, Inc.
  12998. // https://www.iana.org/domains/root/db/vanguard.html
  12999. vanguard
  13000. // vegas : Dot Vegas, Inc.
  13001. // https://www.iana.org/domains/root/db/vegas.html
  13002. vegas
  13003. // ventures : Binky Moon, LLC
  13004. // https://www.iana.org/domains/root/db/ventures.html
  13005. ventures
  13006. // verisign : VeriSign, Inc.
  13007. // https://www.iana.org/domains/root/db/verisign.html
  13008. verisign
  13009. // versicherung : tldbox GmbH
  13010. // https://www.iana.org/domains/root/db/versicherung.html
  13011. versicherung
  13012. // vet : Dog Beach, LLC
  13013. // https://www.iana.org/domains/root/db/vet.html
  13014. vet
  13015. // viajes : Binky Moon, LLC
  13016. // https://www.iana.org/domains/root/db/viajes.html
  13017. viajes
  13018. // video : Dog Beach, LLC
  13019. // https://www.iana.org/domains/root/db/video.html
  13020. video
  13021. // vig : VIENNA INSURANCE GROUP AG Wiener Versicherung Gruppe
  13022. // https://www.iana.org/domains/root/db/vig.html
  13023. vig
  13024. // viking : Viking River Cruises (Bermuda) Ltd.
  13025. // https://www.iana.org/domains/root/db/viking.html
  13026. viking
  13027. // villas : Binky Moon, LLC
  13028. // https://www.iana.org/domains/root/db/villas.html
  13029. villas
  13030. // vin : Binky Moon, LLC
  13031. // https://www.iana.org/domains/root/db/vin.html
  13032. vin
  13033. // vip : Registry Services, LLC
  13034. // https://www.iana.org/domains/root/db/vip.html
  13035. vip
  13036. // virgin : Virgin Enterprises Limited
  13037. // https://www.iana.org/domains/root/db/virgin.html
  13038. virgin
  13039. // visa : Visa Worldwide Pte. Limited
  13040. // https://www.iana.org/domains/root/db/visa.html
  13041. visa
  13042. // vision : Binky Moon, LLC
  13043. // https://www.iana.org/domains/root/db/vision.html
  13044. vision
  13045. // viva : Saudi Telecom Company
  13046. // https://www.iana.org/domains/root/db/viva.html
  13047. viva
  13048. // vivo : Telefonica Brasil S.A.
  13049. // https://www.iana.org/domains/root/db/vivo.html
  13050. vivo
  13051. // vlaanderen : DNS.be vzw
  13052. // https://www.iana.org/domains/root/db/vlaanderen.html
  13053. vlaanderen
  13054. // vodka : Registry Services, LLC
  13055. // https://www.iana.org/domains/root/db/vodka.html
  13056. vodka
  13057. // volkswagen : Volkswagen Group of America Inc.
  13058. // https://www.iana.org/domains/root/db/volkswagen.html
  13059. volkswagen
  13060. // volvo : Volvo Holding Sverige Aktiebolag
  13061. // https://www.iana.org/domains/root/db/volvo.html
  13062. volvo
  13063. // vote : Monolith Registry LLC
  13064. // https://www.iana.org/domains/root/db/vote.html
  13065. vote
  13066. // voting : Valuetainment Corp.
  13067. // https://www.iana.org/domains/root/db/voting.html
  13068. voting
  13069. // voto : Monolith Registry LLC
  13070. // https://www.iana.org/domains/root/db/voto.html
  13071. voto
  13072. // voyage : Binky Moon, LLC
  13073. // https://www.iana.org/domains/root/db/voyage.html
  13074. voyage
  13075. // wales : Nominet UK
  13076. // https://www.iana.org/domains/root/db/wales.html
  13077. wales
  13078. // walmart : Wal-Mart Stores, Inc.
  13079. // https://www.iana.org/domains/root/db/walmart.html
  13080. walmart
  13081. // walter : Sandvik AB
  13082. // https://www.iana.org/domains/root/db/walter.html
  13083. walter
  13084. // wang : Zodiac Wang Limited
  13085. // https://www.iana.org/domains/root/db/wang.html
  13086. wang
  13087. // wanggou : Amazon Registry Services, Inc.
  13088. // https://www.iana.org/domains/root/db/wanggou.html
  13089. wanggou
  13090. // watch : Binky Moon, LLC
  13091. // https://www.iana.org/domains/root/db/watch.html
  13092. watch
  13093. // watches : Identity Digital Limited
  13094. // https://www.iana.org/domains/root/db/watches.html
  13095. watches
  13096. // weather : International Business Machines Corporation
  13097. // https://www.iana.org/domains/root/db/weather.html
  13098. weather
  13099. // weatherchannel : International Business Machines Corporation
  13100. // https://www.iana.org/domains/root/db/weatherchannel.html
  13101. weatherchannel
  13102. // webcam : dot Webcam Limited
  13103. // https://www.iana.org/domains/root/db/webcam.html
  13104. webcam
  13105. // weber : Saint-Gobain Weber SA
  13106. // https://www.iana.org/domains/root/db/weber.html
  13107. weber
  13108. // website : Radix FZC DMCC
  13109. // https://www.iana.org/domains/root/db/website.html
  13110. website
  13111. // wedding : Registry Services, LLC
  13112. // https://www.iana.org/domains/root/db/wedding.html
  13113. wedding
  13114. // weibo : Sina Corporation
  13115. // https://www.iana.org/domains/root/db/weibo.html
  13116. weibo
  13117. // weir : Weir Group IP Limited
  13118. // https://www.iana.org/domains/root/db/weir.html
  13119. weir
  13120. // whoswho : Who's Who Registry
  13121. // https://www.iana.org/domains/root/db/whoswho.html
  13122. whoswho
  13123. // wien : punkt.wien GmbH
  13124. // https://www.iana.org/domains/root/db/wien.html
  13125. wien
  13126. // wiki : Registry Services, LLC
  13127. // https://www.iana.org/domains/root/db/wiki.html
  13128. wiki
  13129. // williamhill : William Hill Organization Limited
  13130. // https://www.iana.org/domains/root/db/williamhill.html
  13131. williamhill
  13132. // win : First Registry Limited
  13133. // https://www.iana.org/domains/root/db/win.html
  13134. win
  13135. // windows : Microsoft Corporation
  13136. // https://www.iana.org/domains/root/db/windows.html
  13137. windows
  13138. // wine : Binky Moon, LLC
  13139. // https://www.iana.org/domains/root/db/wine.html
  13140. wine
  13141. // winners : The TJX Companies, Inc.
  13142. // https://www.iana.org/domains/root/db/winners.html
  13143. winners
  13144. // wme : William Morris Endeavor Entertainment, LLC
  13145. // https://www.iana.org/domains/root/db/wme.html
  13146. wme
  13147. // wolterskluwer : Wolters Kluwer N.V.
  13148. // https://www.iana.org/domains/root/db/wolterskluwer.html
  13149. wolterskluwer
  13150. // woodside : Woodside Petroleum Limited
  13151. // https://www.iana.org/domains/root/db/woodside.html
  13152. woodside
  13153. // work : Registry Services, LLC
  13154. // https://www.iana.org/domains/root/db/work.html
  13155. work
  13156. // works : Binky Moon, LLC
  13157. // https://www.iana.org/domains/root/db/works.html
  13158. works
  13159. // world : Binky Moon, LLC
  13160. // https://www.iana.org/domains/root/db/world.html
  13161. world
  13162. // wow : Amazon Registry Services, Inc.
  13163. // https://www.iana.org/domains/root/db/wow.html
  13164. wow
  13165. // wtc : World Trade Centers Association, Inc.
  13166. // https://www.iana.org/domains/root/db/wtc.html
  13167. wtc
  13168. // wtf : Binky Moon, LLC
  13169. // https://www.iana.org/domains/root/db/wtf.html
  13170. wtf
  13171. // xbox : Microsoft Corporation
  13172. // https://www.iana.org/domains/root/db/xbox.html
  13173. xbox
  13174. // xerox : Xerox DNHC LLC
  13175. // https://www.iana.org/domains/root/db/xerox.html
  13176. xerox
  13177. // xfinity : Comcast IP Holdings I, LLC
  13178. // https://www.iana.org/domains/root/db/xfinity.html
  13179. xfinity
  13180. // xihuan : Beijing Qihu Keji Co., Ltd.
  13181. // https://www.iana.org/domains/root/db/xihuan.html
  13182. xihuan
  13183. // xin : Elegant Leader Limited
  13184. // https://www.iana.org/domains/root/db/xin.html
  13185. xin
  13186. // xn--11b4c3d : VeriSign Sarl
  13187. // https://www.iana.org/domains/root/db/xn--11b4c3d.html
  13188. कॉम
  13189. // xn--1ck2e1b : Amazon Registry Services, Inc.
  13190. // https://www.iana.org/domains/root/db/xn--1ck2e1b.html
  13191. セール
  13192. // xn--1qqw23a : Guangzhou YU Wei Information Technology Co., Ltd.
  13193. // https://www.iana.org/domains/root/db/xn--1qqw23a.html
  13194. 佛山
  13195. // xn--30rr7y : Excellent First Limited
  13196. // https://www.iana.org/domains/root/db/xn--30rr7y.html
  13197. 慈善
  13198. // xn--3bst00m : Eagle Horizon Limited
  13199. // https://www.iana.org/domains/root/db/xn--3bst00m.html
  13200. 集团
  13201. // xn--3ds443g : TLD REGISTRY LIMITED OY
  13202. // https://www.iana.org/domains/root/db/xn--3ds443g.html
  13203. 在线
  13204. // xn--3pxu8k : VeriSign Sarl
  13205. // https://www.iana.org/domains/root/db/xn--3pxu8k.html
  13206. 点看
  13207. // xn--42c2d9a : VeriSign Sarl
  13208. // https://www.iana.org/domains/root/db/xn--42c2d9a.html
  13209. คอม
  13210. // xn--45q11c : Zodiac Gemini Ltd
  13211. // https://www.iana.org/domains/root/db/xn--45q11c.html
  13212. 八卦
  13213. // xn--4gbrim : Helium TLDs Ltd
  13214. // https://www.iana.org/domains/root/db/xn--4gbrim.html
  13215. موقع
  13216. // xn--55qw42g : China Organizational Name Administration Center
  13217. // https://www.iana.org/domains/root/db/xn--55qw42g.html
  13218. 公益
  13219. // xn--55qx5d : China Internet Network Information Center (CNNIC)
  13220. // https://www.iana.org/domains/root/db/xn--55qx5d.html
  13221. 公司
  13222. // xn--5su34j936bgsg : Shangri‐La International Hotel Management Limited
  13223. // https://www.iana.org/domains/root/db/xn--5su34j936bgsg.html
  13224. 香格里拉
  13225. // xn--5tzm5g : Global Website TLD Asia Limited
  13226. // https://www.iana.org/domains/root/db/xn--5tzm5g.html
  13227. 网站
  13228. // xn--6frz82g : Identity Digital Limited
  13229. // https://www.iana.org/domains/root/db/xn--6frz82g.html
  13230. 移动
  13231. // xn--6qq986b3xl : Tycoon Treasure Limited
  13232. // https://www.iana.org/domains/root/db/xn--6qq986b3xl.html
  13233. 我爱你
  13234. // xn--80adxhks : Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID)
  13235. // https://www.iana.org/domains/root/db/xn--80adxhks.html
  13236. москва
  13237. // xn--80aqecdr1a : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)
  13238. // https://www.iana.org/domains/root/db/xn--80aqecdr1a.html
  13239. католик
  13240. // xn--80asehdb : CORE Association
  13241. // https://www.iana.org/domains/root/db/xn--80asehdb.html
  13242. онлайн
  13243. // xn--80aswg : CORE Association
  13244. // https://www.iana.org/domains/root/db/xn--80aswg.html
  13245. сайт
  13246. // xn--8y0a063a : China United Network Communications Corporation Limited
  13247. // https://www.iana.org/domains/root/db/xn--8y0a063a.html
  13248. 联通
  13249. // xn--9dbq2a : VeriSign Sarl
  13250. // https://www.iana.org/domains/root/db/xn--9dbq2a.html
  13251. קום
  13252. // xn--9et52u : RISE VICTORY LIMITED
  13253. // https://www.iana.org/domains/root/db/xn--9et52u.html
  13254. 时尚
  13255. // xn--9krt00a : Sina Corporation
  13256. // https://www.iana.org/domains/root/db/xn--9krt00a.html
  13257. 微博
  13258. // xn--b4w605ferd : Temasek Holdings (Private) Limited
  13259. // https://www.iana.org/domains/root/db/xn--b4w605ferd.html
  13260. 淡马锡
  13261. // xn--bck1b9a5dre4c : Amazon Registry Services, Inc.
  13262. // https://www.iana.org/domains/root/db/xn--bck1b9a5dre4c.html
  13263. ファッション
  13264. // xn--c1avg : Public Interest Registry
  13265. // https://www.iana.org/domains/root/db/xn--c1avg.html
  13266. орг
  13267. // xn--c2br7g : VeriSign Sarl
  13268. // https://www.iana.org/domains/root/db/xn--c2br7g.html
  13269. नेट
  13270. // xn--cck2b3b : Amazon Registry Services, Inc.
  13271. // https://www.iana.org/domains/root/db/xn--cck2b3b.html
  13272. ストア
  13273. // xn--cckwcxetd : Amazon Registry Services, Inc.
  13274. // https://www.iana.org/domains/root/db/xn--cckwcxetd.html
  13275. アマゾン
  13276. // xn--cg4bki : SAMSUNG SDS CO., LTD
  13277. // https://www.iana.org/domains/root/db/xn--cg4bki.html
  13278. 삼성
  13279. // xn--czr694b : Internet DotTrademark Organisation Limited
  13280. // https://www.iana.org/domains/root/db/xn--czr694b.html
  13281. 商标
  13282. // xn--czrs0t : Binky Moon, LLC
  13283. // https://www.iana.org/domains/root/db/xn--czrs0t.html
  13284. 商店
  13285. // xn--czru2d : Zodiac Aquarius Limited
  13286. // https://www.iana.org/domains/root/db/xn--czru2d.html
  13287. 商城
  13288. // xn--d1acj3b : The Foundation for Network Initiatives “The Smart Internet”
  13289. // https://www.iana.org/domains/root/db/xn--d1acj3b.html
  13290. дети
  13291. // xn--eckvdtc9d : Amazon Registry Services, Inc.
  13292. // https://www.iana.org/domains/root/db/xn--eckvdtc9d.html
  13293. ポイント
  13294. // xn--efvy88h : Guangzhou YU Wei Information Technology Co., Ltd.
  13295. // https://www.iana.org/domains/root/db/xn--efvy88h.html
  13296. 新闻
  13297. // xn--fct429k : Amazon Registry Services, Inc.
  13298. // https://www.iana.org/domains/root/db/xn--fct429k.html
  13299. 家電
  13300. // xn--fhbei : VeriSign Sarl
  13301. // https://www.iana.org/domains/root/db/xn--fhbei.html
  13302. كوم
  13303. // xn--fiq228c5hs : TLD REGISTRY LIMITED OY
  13304. // https://www.iana.org/domains/root/db/xn--fiq228c5hs.html
  13305. 中文网
  13306. // xn--fiq64b : CITIC Group Corporation
  13307. // https://www.iana.org/domains/root/db/xn--fiq64b.html
  13308. 中信
  13309. // xn--fjq720a : Binky Moon, LLC
  13310. // https://www.iana.org/domains/root/db/xn--fjq720a.html
  13311. 娱乐
  13312. // xn--flw351e : Charleston Road Registry Inc.
  13313. // https://www.iana.org/domains/root/db/xn--flw351e.html
  13314. 谷歌
  13315. // xn--fzys8d69uvgm : PCCW Enterprises Limited
  13316. // https://www.iana.org/domains/root/db/xn--fzys8d69uvgm.html
  13317. 電訊盈科
  13318. // xn--g2xx48c : Nawang Heli(Xiamen) Network Service Co., LTD.
  13319. // https://www.iana.org/domains/root/db/xn--g2xx48c.html
  13320. 购物
  13321. // xn--gckr3f0f : Amazon Registry Services, Inc.
  13322. // https://www.iana.org/domains/root/db/xn--gckr3f0f.html
  13323. クラウド
  13324. // xn--gk3at1e : Amazon Registry Services, Inc.
  13325. // https://www.iana.org/domains/root/db/xn--gk3at1e.html
  13326. 通販
  13327. // xn--hxt814e : Zodiac Taurus Limited
  13328. // https://www.iana.org/domains/root/db/xn--hxt814e.html
  13329. 网店
  13330. // xn--i1b6b1a6a2e : Public Interest Registry
  13331. // https://www.iana.org/domains/root/db/xn--i1b6b1a6a2e.html
  13332. संगठन
  13333. // xn--imr513n : Internet DotTrademark Organisation Limited
  13334. // https://www.iana.org/domains/root/db/xn--imr513n.html
  13335. 餐厅
  13336. // xn--io0a7i : China Internet Network Information Center (CNNIC)
  13337. // https://www.iana.org/domains/root/db/xn--io0a7i.html
  13338. 网络
  13339. // xn--j1aef : VeriSign Sarl
  13340. // https://www.iana.org/domains/root/db/xn--j1aef.html
  13341. ком
  13342. // xn--jlq480n2rg : Amazon Registry Services, Inc.
  13343. // https://www.iana.org/domains/root/db/xn--jlq480n2rg.html
  13344. 亚马逊
  13345. // xn--jvr189m : Amazon Registry Services, Inc.
  13346. // https://www.iana.org/domains/root/db/xn--jvr189m.html
  13347. 食品
  13348. // xn--kcrx77d1x4a : Koninklijke Philips N.V.
  13349. // https://www.iana.org/domains/root/db/xn--kcrx77d1x4a.html
  13350. 飞利浦
  13351. // xn--kput3i : Beijing RITT-Net Technology Development Co., Ltd
  13352. // https://www.iana.org/domains/root/db/xn--kput3i.html
  13353. 手机
  13354. // xn--mgba3a3ejt : Aramco Services Company
  13355. // https://www.iana.org/domains/root/db/xn--mgba3a3ejt.html
  13356. ارامكو
  13357. // xn--mgba7c0bbn0a : Competrol (Luxembourg) Sarl
  13358. // https://www.iana.org/domains/root/db/xn--mgba7c0bbn0a.html
  13359. العليان
  13360. // xn--mgbaakc7dvf : Emirates Telecommunications Corporation (trading as Etisalat)
  13361. // https://www.iana.org/domains/root/db/xn--mgbaakc7dvf.html
  13362. اتصالات
  13363. // xn--mgbab2bd : CORE Association
  13364. // https://www.iana.org/domains/root/db/xn--mgbab2bd.html
  13365. بازار
  13366. // xn--mgbca7dzdo : Abu Dhabi Systems and Information Centre
  13367. // https://www.iana.org/domains/root/db/xn--mgbca7dzdo.html
  13368. ابوظبي
  13369. // xn--mgbi4ecexp : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)
  13370. // https://www.iana.org/domains/root/db/xn--mgbi4ecexp.html
  13371. كاثوليك
  13372. // xn--mgbt3dhd : Asia Green IT System Bilgisayar San. ve Tic. Ltd. Sti.
  13373. // https://www.iana.org/domains/root/db/xn--mgbt3dhd.html
  13374. همراه
  13375. // xn--mk1bu44c : VeriSign Sarl
  13376. // https://www.iana.org/domains/root/db/xn--mk1bu44c.html
  13377. 닷컴
  13378. // xn--mxtq1m : Net-Chinese Co., Ltd.
  13379. // https://www.iana.org/domains/root/db/xn--mxtq1m.html
  13380. 政府
  13381. // xn--ngbc5azd : International Domain Registry Pty. Ltd.
  13382. // https://www.iana.org/domains/root/db/xn--ngbc5azd.html
  13383. شبكة
  13384. // xn--ngbe9e0a : Kuwait Finance House
  13385. // https://www.iana.org/domains/root/db/xn--ngbe9e0a.html
  13386. بيتك
  13387. // xn--ngbrx : League of Arab States
  13388. // https://www.iana.org/domains/root/db/xn--ngbrx.html
  13389. عرب
  13390. // xn--nqv7f : Public Interest Registry
  13391. // https://www.iana.org/domains/root/db/xn--nqv7f.html
  13392. 机构
  13393. // xn--nqv7fs00ema : Public Interest Registry
  13394. // https://www.iana.org/domains/root/db/xn--nqv7fs00ema.html
  13395. 组织机构
  13396. // xn--nyqy26a : Stable Tone Limited
  13397. // https://www.iana.org/domains/root/db/xn--nyqy26a.html
  13398. 健康
  13399. // xn--otu796d : Jiang Yu Liang Cai Technology Company Limited
  13400. // https://www.iana.org/domains/root/db/xn--otu796d.html
  13401. 招聘
  13402. // xn--p1acf : Rusnames Limited
  13403. // https://www.iana.org/domains/root/db/xn--p1acf.html
  13404. рус
  13405. // xn--pssy2u : VeriSign Sarl
  13406. // https://www.iana.org/domains/root/db/xn--pssy2u.html
  13407. 大拿
  13408. // xn--q9jyb4c : Charleston Road Registry Inc.
  13409. // https://www.iana.org/domains/root/db/xn--q9jyb4c.html
  13410. みんな
  13411. // xn--qcka1pmc : Charleston Road Registry Inc.
  13412. // https://www.iana.org/domains/root/db/xn--qcka1pmc.html
  13413. グーグル
  13414. // xn--rhqv96g : Stable Tone Limited
  13415. // https://www.iana.org/domains/root/db/xn--rhqv96g.html
  13416. 世界
  13417. // xn--rovu88b : Amazon Registry Services, Inc.
  13418. // https://www.iana.org/domains/root/db/xn--rovu88b.html
  13419. 書籍
  13420. // xn--ses554g : KNET Co., Ltd.
  13421. // https://www.iana.org/domains/root/db/xn--ses554g.html
  13422. 网址
  13423. // xn--t60b56a : VeriSign Sarl
  13424. // https://www.iana.org/domains/root/db/xn--t60b56a.html
  13425. 닷넷
  13426. // xn--tckwe : VeriSign Sarl
  13427. // https://www.iana.org/domains/root/db/xn--tckwe.html
  13428. コム
  13429. // xn--tiq49xqyj : Pontificium Consilium de Comunicationibus Socialibus (PCCS) (Pontifical Council for Social Communication)
  13430. // https://www.iana.org/domains/root/db/xn--tiq49xqyj.html
  13431. 天主教
  13432. // xn--unup4y : Binky Moon, LLC
  13433. // https://www.iana.org/domains/root/db/xn--unup4y.html
  13434. 游戏
  13435. // xn--vermgensberater-ctb : Deutsche Vermögensberatung Aktiengesellschaft DVAG
  13436. // https://www.iana.org/domains/root/db/xn--vermgensberater-ctb.html
  13437. vermögensberater
  13438. // xn--vermgensberatung-pwb : Deutsche Vermögensberatung Aktiengesellschaft DVAG
  13439. // https://www.iana.org/domains/root/db/xn--vermgensberatung-pwb.html
  13440. vermögensberatung
  13441. // xn--vhquv : Binky Moon, LLC
  13442. // https://www.iana.org/domains/root/db/xn--vhquv.html
  13443. 企业
  13444. // xn--vuq861b : Beijing Tele-info Technology Co., Ltd.
  13445. // https://www.iana.org/domains/root/db/xn--vuq861b.html
  13446. 信息
  13447. // xn--w4r85el8fhu5dnra : Kerry Trading Co. Limited
  13448. // https://www.iana.org/domains/root/db/xn--w4r85el8fhu5dnra.html
  13449. 嘉里大酒店
  13450. // xn--w4rs40l : Kerry Trading Co. Limited
  13451. // https://www.iana.org/domains/root/db/xn--w4rs40l.html
  13452. 嘉里
  13453. // xn--xhq521b : Guangzhou YU Wei Information Technology Co., Ltd.
  13454. // https://www.iana.org/domains/root/db/xn--xhq521b.html
  13455. 广东
  13456. // xn--zfr164b : China Organizational Name Administration Center
  13457. // https://www.iana.org/domains/root/db/xn--zfr164b.html
  13458. 政务
  13459. // xyz : XYZ.COM LLC
  13460. // https://www.iana.org/domains/root/db/xyz.html
  13461. xyz
  13462. // yachts : XYZ.COM LLC
  13463. // https://www.iana.org/domains/root/db/yachts.html
  13464. yachts
  13465. // yahoo : Oath Inc.
  13466. // https://www.iana.org/domains/root/db/yahoo.html
  13467. yahoo
  13468. // yamaxun : Amazon Registry Services, Inc.
  13469. // https://www.iana.org/domains/root/db/yamaxun.html
  13470. yamaxun
  13471. // yandex : Yandex Europe B.V.
  13472. // https://www.iana.org/domains/root/db/yandex.html
  13473. yandex
  13474. // yodobashi : YODOBASHI CAMERA CO.,LTD.
  13475. // https://www.iana.org/domains/root/db/yodobashi.html
  13476. yodobashi
  13477. // yoga : Registry Services, LLC
  13478. // https://www.iana.org/domains/root/db/yoga.html
  13479. yoga
  13480. // yokohama : GMO Registry, Inc.
  13481. // https://www.iana.org/domains/root/db/yokohama.html
  13482. yokohama
  13483. // you : Amazon Registry Services, Inc.
  13484. // https://www.iana.org/domains/root/db/you.html
  13485. you
  13486. // youtube : Charleston Road Registry Inc.
  13487. // https://www.iana.org/domains/root/db/youtube.html
  13488. youtube
  13489. // yun : Beijing Qihu Keji Co., Ltd.
  13490. // https://www.iana.org/domains/root/db/yun.html
  13491. yun
  13492. // zappos : Amazon Registry Services, Inc.
  13493. // https://www.iana.org/domains/root/db/zappos.html
  13494. zappos
  13495. // zara : Industria de Diseño Textil, S.A. (INDITEX, S.A.)
  13496. // https://www.iana.org/domains/root/db/zara.html
  13497. zara
  13498. // zero : Amazon Registry Services, Inc.
  13499. // https://www.iana.org/domains/root/db/zero.html
  13500. zero
  13501. // zip : Charleston Road Registry Inc.
  13502. // https://www.iana.org/domains/root/db/zip.html
  13503. zip
  13504. // zone : Binky Moon, LLC
  13505. // https://www.iana.org/domains/root/db/zone.html
  13506. zone
  13507. // zuerich : Kanton Zürich (Canton of Zurich)
  13508. // https://www.iana.org/domains/root/db/zuerich.html
  13509. zuerich
  13510. // ===END ICANN DOMAINS===
  13511. // ===BEGIN PRIVATE DOMAINS===
  13512. // (Note: these are in alphabetical order by company name)
  13513. // 1GB LLC : https://www.1gb.ua/
  13514. // Submitted by 1GB LLC <noc@1gb.com.ua>
  13515. cc.ua
  13516. inf.ua
  13517. ltd.ua
  13518. // 611coin : https://611project.org/
  13519. 611.to
  13520. // Aaron Marais' Gitlab pages: https://lab.aaronleem.co.za
  13521. // Submitted by Aaron Marais <its_me@aaronleem.co.za>
  13522. graphox.us
  13523. // accesso Technology Group, plc. : https://accesso.com/
  13524. // Submitted by accesso Team <accessoecommerce@accesso.com>
  13525. *.devcdnaccesso.com
  13526. // Acorn Labs : https://acorn.io
  13527. // Submitted by Craig Jellick <domains@acorn.io>
  13528. *.on-acorn.io
  13529. // ActiveTrail: https://www.activetrail.biz/
  13530. // Submitted by Ofer Kalaora <postmaster@activetrail.com>
  13531. activetrail.biz
  13532. // Adobe : https://www.adobe.com/
  13533. // Submitted by Ian Boston <boston@adobe.com> and Lars Trieloff <trieloff@adobe.com>
  13534. adobeaemcloud.com
  13535. *.dev.adobeaemcloud.com
  13536. hlx.live
  13537. adobeaemcloud.net
  13538. hlx.page
  13539. hlx3.page
  13540. // Adobe Developer Platform : https://developer.adobe.com
  13541. // Submitted by Jesse MacFadyen<jessem@adobe.com>
  13542. adobeio-static.net
  13543. adobeioruntime.net
  13544. // Agnat sp. z o.o. : https://domena.pl
  13545. // Submitted by Przemyslaw Plewa <it-admin@domena.pl>
  13546. beep.pl
  13547. // Airkit : https://www.airkit.com/
  13548. // Submitted by Grant Cooksey <security@airkit.com>
  13549. airkitapps.com
  13550. airkitapps-au.com
  13551. airkitapps.eu
  13552. // Aiven: https://aiven.io/
  13553. // Submitted by Etienne Stalmans <security@aiven.io>
  13554. aivencloud.com
  13555. // Akamai : https://www.akamai.com/
  13556. // Submitted by Akamai Team <publicsuffixlist@akamai.com>
  13557. akadns.net
  13558. akamai.net
  13559. akamai-staging.net
  13560. akamaiedge.net
  13561. akamaiedge-staging.net
  13562. akamaihd.net
  13563. akamaihd-staging.net
  13564. akamaiorigin.net
  13565. akamaiorigin-staging.net
  13566. akamaized.net
  13567. akamaized-staging.net
  13568. edgekey.net
  13569. edgekey-staging.net
  13570. edgesuite.net
  13571. edgesuite-staging.net
  13572. // alboto.ca : http://alboto.ca
  13573. // Submitted by Anton Avramov <avramov@alboto.ca>
  13574. barsy.ca
  13575. // Alces Software Ltd : http://alces-software.com
  13576. // Submitted by Mark J. Titorenko <mark.titorenko@alces-software.com>
  13577. *.compute.estate
  13578. *.alces.network
  13579. // all-inkl.com : https://all-inkl.com
  13580. // Submitted by Werner Kaltofen <wk@all-inkl.com>
  13581. kasserver.com
  13582. // Altervista: https://www.altervista.org
  13583. // Submitted by Carlo Cannas <tech_staff@altervista.it>
  13584. altervista.org
  13585. // alwaysdata : https://www.alwaysdata.com
  13586. // Submitted by Cyril <admin@alwaysdata.com>
  13587. alwaysdata.net
  13588. // Amaze Software : https://amaze.co
  13589. // Submitted by Domain Admin <domainadmin@amaze.co>
  13590. myamaze.net
  13591. // Amazon : https://www.amazon.com/
  13592. // Submitted by AWS Security <psl-maintainers@amazon.com>
  13593. // Subsections of Amazon/subsidiaries will appear until "concludes" tag
  13594. // Amazon CloudFront
  13595. // Submitted by Donavan Miller <donavanm@amazon.com>
  13596. // Reference: 54144616-fd49-4435-8535-19c6a601bdb3
  13597. cloudfront.net
  13598. // Amazon EC2
  13599. // Submitted by Luke Wells <psl-maintainers@amazon.com>
  13600. // Reference: 4c38fa71-58ac-4768-99e5-689c1767e537
  13601. *.compute.amazonaws.com
  13602. *.compute-1.amazonaws.com
  13603. *.compute.amazonaws.com.cn
  13604. us-east-1.amazonaws.com
  13605. // Amazon S3
  13606. // Submitted by Luke Wells <psl-maintainers@amazon.com>
  13607. // Reference: d068bd97-f0a9-4838-a6d8-954b622ef4ae
  13608. s3.cn-north-1.amazonaws.com.cn
  13609. s3.dualstack.ap-northeast-1.amazonaws.com
  13610. s3.dualstack.ap-northeast-2.amazonaws.com
  13611. s3.ap-northeast-2.amazonaws.com
  13612. s3-website.ap-northeast-2.amazonaws.com
  13613. s3.dualstack.ap-south-1.amazonaws.com
  13614. s3.ap-south-1.amazonaws.com
  13615. s3-website.ap-south-1.amazonaws.com
  13616. s3.dualstack.ap-southeast-1.amazonaws.com
  13617. s3.dualstack.ap-southeast-2.amazonaws.com
  13618. s3.dualstack.ca-central-1.amazonaws.com
  13619. s3.ca-central-1.amazonaws.com
  13620. s3-website.ca-central-1.amazonaws.com
  13621. s3.dualstack.eu-central-1.amazonaws.com
  13622. s3.eu-central-1.amazonaws.com
  13623. s3-website.eu-central-1.amazonaws.com
  13624. s3.dualstack.eu-west-1.amazonaws.com
  13625. s3.dualstack.eu-west-2.amazonaws.com
  13626. s3.eu-west-2.amazonaws.com
  13627. s3-website.eu-west-2.amazonaws.com
  13628. s3.dualstack.eu-west-3.amazonaws.com
  13629. s3.eu-west-3.amazonaws.com
  13630. s3-website.eu-west-3.amazonaws.com
  13631. s3.amazonaws.com
  13632. s3-ap-northeast-1.amazonaws.com
  13633. s3-ap-northeast-2.amazonaws.com
  13634. s3-ap-south-1.amazonaws.com
  13635. s3-ap-southeast-1.amazonaws.com
  13636. s3-ap-southeast-2.amazonaws.com
  13637. s3-ca-central-1.amazonaws.com
  13638. s3-eu-central-1.amazonaws.com
  13639. s3-eu-west-1.amazonaws.com
  13640. s3-eu-west-2.amazonaws.com
  13641. s3-eu-west-3.amazonaws.com
  13642. s3-external-1.amazonaws.com
  13643. s3-fips-us-gov-west-1.amazonaws.com
  13644. s3-sa-east-1.amazonaws.com
  13645. s3-us-east-2.amazonaws.com
  13646. s3-us-gov-west-1.amazonaws.com
  13647. s3-us-west-1.amazonaws.com
  13648. s3-us-west-2.amazonaws.com
  13649. s3-website-ap-northeast-1.amazonaws.com
  13650. s3-website-ap-southeast-1.amazonaws.com
  13651. s3-website-ap-southeast-2.amazonaws.com
  13652. s3-website-eu-west-1.amazonaws.com
  13653. s3-website-sa-east-1.amazonaws.com
  13654. s3-website-us-east-1.amazonaws.com
  13655. s3-website-us-west-1.amazonaws.com
  13656. s3-website-us-west-2.amazonaws.com
  13657. s3.dualstack.sa-east-1.amazonaws.com
  13658. s3.dualstack.us-east-1.amazonaws.com
  13659. s3.dualstack.us-east-2.amazonaws.com
  13660. s3.us-east-2.amazonaws.com
  13661. s3-website.us-east-2.amazonaws.com
  13662. // Analytics on AWS
  13663. // Submitted by AWS Security <psl-maintainers@amazon.com>
  13664. // Reference: c02c3a80-f8a0-4fd2-b719-48ea8b7c28de
  13665. analytics-gateway.ap-northeast-1.amazonaws.com
  13666. analytics-gateway.eu-west-1.amazonaws.com
  13667. analytics-gateway.us-east-1.amazonaws.com
  13668. analytics-gateway.us-east-2.amazonaws.com
  13669. analytics-gateway.us-west-2.amazonaws.com
  13670. // AWS Cloud9
  13671. // Submitted by: AWS Security <psl-maintainers@amazon.com>
  13672. // Reference: 05c44955-977c-4b57-938a-f2af92733f9f
  13673. webview-assets.aws-cloud9.af-south-1.amazonaws.com
  13674. vfs.cloud9.af-south-1.amazonaws.com
  13675. webview-assets.cloud9.af-south-1.amazonaws.com
  13676. webview-assets.aws-cloud9.ap-east-1.amazonaws.com
  13677. vfs.cloud9.ap-east-1.amazonaws.com
  13678. webview-assets.cloud9.ap-east-1.amazonaws.com
  13679. webview-assets.aws-cloud9.ap-northeast-1.amazonaws.com
  13680. vfs.cloud9.ap-northeast-1.amazonaws.com
  13681. webview-assets.cloud9.ap-northeast-1.amazonaws.com
  13682. webview-assets.aws-cloud9.ap-northeast-2.amazonaws.com
  13683. vfs.cloud9.ap-northeast-2.amazonaws.com
  13684. webview-assets.cloud9.ap-northeast-2.amazonaws.com
  13685. webview-assets.aws-cloud9.ap-northeast-3.amazonaws.com
  13686. vfs.cloud9.ap-northeast-3.amazonaws.com
  13687. webview-assets.cloud9.ap-northeast-3.amazonaws.com
  13688. webview-assets.aws-cloud9.ap-south-1.amazonaws.com
  13689. vfs.cloud9.ap-south-1.amazonaws.com
  13690. webview-assets.cloud9.ap-south-1.amazonaws.com
  13691. webview-assets.aws-cloud9.ap-southeast-1.amazonaws.com
  13692. vfs.cloud9.ap-southeast-1.amazonaws.com
  13693. webview-assets.cloud9.ap-southeast-1.amazonaws.com
  13694. webview-assets.aws-cloud9.ap-southeast-2.amazonaws.com
  13695. vfs.cloud9.ap-southeast-2.amazonaws.com
  13696. webview-assets.cloud9.ap-southeast-2.amazonaws.com
  13697. webview-assets.aws-cloud9.ca-central-1.amazonaws.com
  13698. vfs.cloud9.ca-central-1.amazonaws.com
  13699. webview-assets.cloud9.ca-central-1.amazonaws.com
  13700. webview-assets.aws-cloud9.eu-central-1.amazonaws.com
  13701. vfs.cloud9.eu-central-1.amazonaws.com
  13702. webview-assets.cloud9.eu-central-1.amazonaws.com
  13703. webview-assets.aws-cloud9.eu-north-1.amazonaws.com
  13704. vfs.cloud9.eu-north-1.amazonaws.com
  13705. webview-assets.cloud9.eu-north-1.amazonaws.com
  13706. webview-assets.aws-cloud9.eu-south-1.amazonaws.com
  13707. vfs.cloud9.eu-south-1.amazonaws.com
  13708. webview-assets.cloud9.eu-south-1.amazonaws.com
  13709. webview-assets.aws-cloud9.eu-west-1.amazonaws.com
  13710. vfs.cloud9.eu-west-1.amazonaws.com
  13711. webview-assets.cloud9.eu-west-1.amazonaws.com
  13712. webview-assets.aws-cloud9.eu-west-2.amazonaws.com
  13713. vfs.cloud9.eu-west-2.amazonaws.com
  13714. webview-assets.cloud9.eu-west-2.amazonaws.com
  13715. webview-assets.aws-cloud9.eu-west-3.amazonaws.com
  13716. vfs.cloud9.eu-west-3.amazonaws.com
  13717. webview-assets.cloud9.eu-west-3.amazonaws.com
  13718. webview-assets.aws-cloud9.me-south-1.amazonaws.com
  13719. vfs.cloud9.me-south-1.amazonaws.com
  13720. webview-assets.cloud9.me-south-1.amazonaws.com
  13721. webview-assets.aws-cloud9.sa-east-1.amazonaws.com
  13722. vfs.cloud9.sa-east-1.amazonaws.com
  13723. webview-assets.cloud9.sa-east-1.amazonaws.com
  13724. webview-assets.aws-cloud9.us-east-1.amazonaws.com
  13725. vfs.cloud9.us-east-1.amazonaws.com
  13726. webview-assets.cloud9.us-east-1.amazonaws.com
  13727. webview-assets.aws-cloud9.us-east-2.amazonaws.com
  13728. vfs.cloud9.us-east-2.amazonaws.com
  13729. webview-assets.cloud9.us-east-2.amazonaws.com
  13730. webview-assets.aws-cloud9.us-west-1.amazonaws.com
  13731. vfs.cloud9.us-west-1.amazonaws.com
  13732. webview-assets.cloud9.us-west-1.amazonaws.com
  13733. webview-assets.aws-cloud9.us-west-2.amazonaws.com
  13734. vfs.cloud9.us-west-2.amazonaws.com
  13735. webview-assets.cloud9.us-west-2.amazonaws.com
  13736. // AWS Elastic Beanstalk
  13737. // Submitted by Luke Wells <psl-maintainers@amazon.com>
  13738. // Reference: aa202394-43a0-4857-b245-8db04549137e
  13739. cn-north-1.eb.amazonaws.com.cn
  13740. cn-northwest-1.eb.amazonaws.com.cn
  13741. elasticbeanstalk.com
  13742. ap-northeast-1.elasticbeanstalk.com
  13743. ap-northeast-2.elasticbeanstalk.com
  13744. ap-northeast-3.elasticbeanstalk.com
  13745. ap-south-1.elasticbeanstalk.com
  13746. ap-southeast-1.elasticbeanstalk.com
  13747. ap-southeast-2.elasticbeanstalk.com
  13748. ca-central-1.elasticbeanstalk.com
  13749. eu-central-1.elasticbeanstalk.com
  13750. eu-west-1.elasticbeanstalk.com
  13751. eu-west-2.elasticbeanstalk.com
  13752. eu-west-3.elasticbeanstalk.com
  13753. sa-east-1.elasticbeanstalk.com
  13754. us-east-1.elasticbeanstalk.com
  13755. us-east-2.elasticbeanstalk.com
  13756. us-gov-west-1.elasticbeanstalk.com
  13757. us-west-1.elasticbeanstalk.com
  13758. us-west-2.elasticbeanstalk.com
  13759. // (AWS) Elastic Load Balancing
  13760. // Submitted by Luke Wells <psl-maintainers@amazon.com>
  13761. // Reference: 12a3d528-1bac-4433-a359-a395867ffed2
  13762. *.elb.amazonaws.com.cn
  13763. *.elb.amazonaws.com
  13764. // AWS Global Accelerator
  13765. // Submitted by Daniel Massaguer <psl-maintainers@amazon.com>
  13766. // Reference: d916759d-a08b-4241-b536-4db887383a6a
  13767. awsglobalaccelerator.com
  13768. // eero
  13769. // Submitted by Yue Kang <eero-dynamic-dns@amazon.com>
  13770. // Reference: 264afe70-f62c-4c02-8ab9-b5281ed24461
  13771. eero.online
  13772. eero-stage.online
  13773. // concludes Amazon
  13774. // Amune : https://amune.org/
  13775. // Submitted by Team Amune <cert@amune.org>
  13776. t3l3p0rt.net
  13777. tele.amune.org
  13778. // Apigee : https://apigee.com/
  13779. // Submitted by Apigee Security Team <security@apigee.com>
  13780. apigee.io
  13781. // Apphud : https://apphud.com
  13782. // Submitted by Alexander Selivanov <alex@apphud.com>
  13783. siiites.com
  13784. // Appspace : https://www.appspace.com
  13785. // Submitted by Appspace Security Team <security@appspace.com>
  13786. appspacehosted.com
  13787. appspaceusercontent.com
  13788. // Appudo UG (haftungsbeschränkt) : https://www.appudo.com
  13789. // Submitted by Alexander Hochbaum <admin@appudo.com>
  13790. appudo.net
  13791. // Aptible : https://www.aptible.com/
  13792. // Submitted by Thomas Orozco <thomas@aptible.com>
  13793. on-aptible.com
  13794. // ASEINet : https://www.aseinet.com/
  13795. // Submitted by Asei SEKIGUCHI <mail@aseinet.com>
  13796. user.aseinet.ne.jp
  13797. gv.vc
  13798. d.gv.vc
  13799. // Asociación Amigos de la Informática "Euskalamiga" : http://encounter.eus/
  13800. // Submitted by Hector Martin <marcan@euskalencounter.org>
  13801. user.party.eus
  13802. // Association potager.org : https://potager.org/
  13803. // Submitted by Lunar <jardiniers@potager.org>
  13804. pimienta.org
  13805. poivron.org
  13806. potager.org
  13807. sweetpepper.org
  13808. // ASUSTOR Inc. : http://www.asustor.com
  13809. // Submitted by Vincent Tseng <vincenttseng@asustor.com>
  13810. myasustor.com
  13811. // Atlassian : https://atlassian.com
  13812. // Submitted by Sam Smyth <devloop@atlassian.com>
  13813. cdn.prod.atlassian-dev.net
  13814. // Authentick UG (haftungsbeschränkt) : https://authentick.net
  13815. // Submitted by Lukas Reschke <lukas@authentick.net>
  13816. translated.page
  13817. // Autocode : https://autocode.com
  13818. // Submitted by Jacob Lee <jacob@autocode.com>
  13819. autocode.dev
  13820. // AVM : https://avm.de
  13821. // Submitted by Andreas Weise <a.weise@avm.de>
  13822. myfritz.net
  13823. // AVStack Pte. Ltd. : https://avstack.io
  13824. // Submitted by Jasper Hugo <jasper@avstack.io>
  13825. onavstack.net
  13826. // AW AdvisorWebsites.com Software Inc : https://advisorwebsites.com
  13827. // Submitted by James Kennedy <domains@advisorwebsites.com>
  13828. *.awdev.ca
  13829. *.advisor.ws
  13830. // AZ.pl sp. z.o.o: https://az.pl
  13831. // Submitted by Krzysztof Wolski <krzysztof.wolski@home.eu>
  13832. ecommerce-shop.pl
  13833. // b-data GmbH : https://www.b-data.io
  13834. // Submitted by Olivier Benz <olivier.benz@b-data.ch>
  13835. b-data.io
  13836. // backplane : https://www.backplane.io
  13837. // Submitted by Anthony Voutas <anthony@backplane.io>
  13838. backplaneapp.io
  13839. // Balena : https://www.balena.io
  13840. // Submitted by Petros Angelatos <petrosagg@balena.io>
  13841. balena-devices.com
  13842. // University of Banja Luka : https://unibl.org
  13843. // Domains for Republic of Srpska administrative entity.
  13844. // Submitted by Marko Ivanovic <kormang@hotmail.rs>
  13845. rs.ba
  13846. // Banzai Cloud
  13847. // Submitted by Janos Matyas <info@banzaicloud.com>
  13848. *.banzai.cloud
  13849. app.banzaicloud.io
  13850. *.backyards.banzaicloud.io
  13851. // BASE, Inc. : https://binc.jp
  13852. // Submitted by Yuya NAGASAWA <public-suffix-list@binc.jp>
  13853. base.ec
  13854. official.ec
  13855. buyshop.jp
  13856. fashionstore.jp
  13857. handcrafted.jp
  13858. kawaiishop.jp
  13859. supersale.jp
  13860. theshop.jp
  13861. shopselect.net
  13862. base.shop
  13863. // BeagleBoard.org Foundation : https://beagleboard.org
  13864. // Submitted by Jason Kridner <jkridner@beagleboard.org>
  13865. beagleboard.io
  13866. // Beget Ltd
  13867. // Submitted by Lev Nekrasov <lnekrasov@beget.com>
  13868. *.beget.app
  13869. // BetaInABox
  13870. // Submitted by Adrian <adrian@betainabox.com>
  13871. betainabox.com
  13872. // BinaryLane : http://www.binarylane.com
  13873. // Submitted by Nathan O'Sullivan <nathan@mammoth.com.au>
  13874. bnr.la
  13875. // Bitbucket : http://bitbucket.org
  13876. // Submitted by Andy Ortlieb <aortlieb@atlassian.com>
  13877. bitbucket.io
  13878. // Blackbaud, Inc. : https://www.blackbaud.com
  13879. // Submitted by Paul Crowder <paul.crowder@blackbaud.com>
  13880. blackbaudcdn.net
  13881. // Blatech : http://www.blatech.net
  13882. // Submitted by Luke Bratch <luke@bratch.co.uk>
  13883. of.je
  13884. // Blue Bite, LLC : https://bluebite.com
  13885. // Submitted by Joshua Weiss <admin.engineering@bluebite.com>
  13886. bluebite.io
  13887. // Boomla : https://boomla.com
  13888. // Submitted by Tibor Halter <thalter@boomla.com>
  13889. boomla.net
  13890. // Boutir : https://www.boutir.com
  13891. // Submitted by Eric Ng Ka Ka <ngkaka@boutir.com>
  13892. boutir.com
  13893. // Boxfuse : https://boxfuse.com
  13894. // Submitted by Axel Fontaine <axel@boxfuse.com>
  13895. boxfuse.io
  13896. // bplaced : https://www.bplaced.net/
  13897. // Submitted by Miroslav Bozic <security@bplaced.net>
  13898. square7.ch
  13899. bplaced.com
  13900. bplaced.de
  13901. square7.de
  13902. bplaced.net
  13903. square7.net
  13904. // Brendly : https://brendly.rs
  13905. // Submitted by Dusan Radovanovic <dusan.radovanovic@brendly.rs>
  13906. shop.brendly.rs
  13907. // BrowserSafetyMark
  13908. // Submitted by Dave Tharp <browsersafetymark.io@quicinc.com>
  13909. browsersafetymark.io
  13910. // Bytemark Hosting : https://www.bytemark.co.uk
  13911. // Submitted by Paul Cammish <paul.cammish@bytemark.co.uk>
  13912. uk0.bigv.io
  13913. dh.bytemark.co.uk
  13914. vm.bytemark.co.uk
  13915. // Caf.js Labs LLC : https://www.cafjs.com
  13916. // Submitted by Antonio Lain <antlai@cafjs.com>
  13917. cafjs.com
  13918. // callidomus : https://www.callidomus.com/
  13919. // Submitted by Marcus Popp <admin@callidomus.com>
  13920. mycd.eu
  13921. // Canva Pty Ltd : https://canva.com/
  13922. // Submitted by Joel Aquilina <publicsuffixlist@canva.com>
  13923. canva-apps.cn
  13924. canva-apps.com
  13925. // Carrd : https://carrd.co
  13926. // Submitted by AJ <aj@carrd.co>
  13927. drr.ac
  13928. uwu.ai
  13929. carrd.co
  13930. crd.co
  13931. ju.mp
  13932. // CentralNic : http://www.centralnic.com/names/domains
  13933. // Submitted by registry <gavin.brown@centralnic.com>
  13934. ae.org
  13935. br.com
  13936. cn.com
  13937. com.de
  13938. com.se
  13939. de.com
  13940. eu.com
  13941. gb.net
  13942. hu.net
  13943. jp.net
  13944. jpn.com
  13945. mex.com
  13946. ru.com
  13947. sa.com
  13948. se.net
  13949. uk.com
  13950. uk.net
  13951. us.com
  13952. za.bz
  13953. za.com
  13954. // No longer operated by CentralNic, these entries should be adopted and/or removed by current operators
  13955. // Submitted by Gavin Brown <gavin.brown@centralnic.com>
  13956. ar.com
  13957. hu.com
  13958. kr.com
  13959. no.com
  13960. qc.com
  13961. uy.com
  13962. // Africa.com Web Solutions Ltd : https://registry.africa.com
  13963. // Submitted by Gavin Brown <gavin.brown@centralnic.com>
  13964. africa.com
  13965. // iDOT Services Limited : http://www.domain.gr.com
  13966. // Submitted by Gavin Brown <gavin.brown@centralnic.com>
  13967. gr.com
  13968. // Radix FZC : http://domains.in.net
  13969. // Submitted by Gavin Brown <gavin.brown@centralnic.com>
  13970. in.net
  13971. web.in
  13972. // US REGISTRY LLC : http://us.org
  13973. // Submitted by Gavin Brown <gavin.brown@centralnic.com>
  13974. us.org
  13975. // co.com Registry, LLC : https://registry.co.com
  13976. // Submitted by Gavin Brown <gavin.brown@centralnic.com>
  13977. co.com
  13978. // Roar Domains LLC : https://roar.basketball/
  13979. // Submitted by Gavin Brown <gavin.brown@centralnic.com>
  13980. aus.basketball
  13981. nz.basketball
  13982. // BRS Media : https://brsmedia.com/
  13983. // Submitted by Gavin Brown <gavin.brown@centralnic.com>
  13984. radio.am
  13985. radio.fm
  13986. // c.la : http://www.c.la/
  13987. c.la
  13988. // certmgr.org : https://certmgr.org
  13989. // Submitted by B. Blechschmidt <hostmaster@certmgr.org>
  13990. certmgr.org
  13991. // Cityhost LLC : https://cityhost.ua
  13992. // Submitted by Maksym Rivtin <support@cityhost.net.ua>
  13993. cx.ua
  13994. // Civilized Discourse Construction Kit, Inc. : https://www.discourse.org/
  13995. // Submitted by Rishabh Nambiar & Michael Brown <team@discourse.org>
  13996. discourse.group
  13997. discourse.team
  13998. // Clever Cloud : https://www.clever-cloud.com/
  13999. // Submitted by Quentin Adam <noc@clever-cloud.com>
  14000. cleverapps.io
  14001. // Clerk : https://www.clerk.dev
  14002. // Submitted by Colin Sidoti <systems@clerk.dev>
  14003. clerk.app
  14004. clerkstage.app
  14005. *.lcl.dev
  14006. *.lclstage.dev
  14007. *.stg.dev
  14008. *.stgstage.dev
  14009. // ClickRising : https://clickrising.com/
  14010. // Submitted by Umut Gumeli <infrastructure-publicsuffixlist@clickrising.com>
  14011. clickrising.net
  14012. // Cloud66 : https://www.cloud66.com/
  14013. // Submitted by Khash Sajadi <khash@cloud66.com>
  14014. c66.me
  14015. cloud66.ws
  14016. cloud66.zone
  14017. // CloudAccess.net : https://www.cloudaccess.net/
  14018. // Submitted by Pawel Panek <noc@cloudaccess.net>
  14019. jdevcloud.com
  14020. wpdevcloud.com
  14021. cloudaccess.host
  14022. freesite.host
  14023. cloudaccess.net
  14024. // cloudControl : https://www.cloudcontrol.com/
  14025. // Submitted by Tobias Wilken <tw@cloudcontrol.com>
  14026. cloudcontrolled.com
  14027. cloudcontrolapp.com
  14028. // Cloudera, Inc. : https://www.cloudera.com/
  14029. // Submitted by Kedarnath Waikar <security@cloudera.com>
  14030. *.cloudera.site
  14031. // Cloudflare, Inc. : https://www.cloudflare.com/
  14032. // Submitted by Cloudflare Team <publicsuffixlist@cloudflare.com>
  14033. cf-ipfs.com
  14034. cloudflare-ipfs.com
  14035. trycloudflare.com
  14036. pages.dev
  14037. r2.dev
  14038. workers.dev
  14039. // Clovyr : https://clovyr.io
  14040. // Submitted by Patrick Nielsen <patrick@clovyr.io>
  14041. wnext.app
  14042. // co.ca : http://registry.co.ca/
  14043. co.ca
  14044. // Co & Co : https://co-co.nl/
  14045. // Submitted by Govert Versluis <govert@co-co.nl>
  14046. *.otap.co
  14047. // i-registry s.r.o. : http://www.i-registry.cz/
  14048. // Submitted by Martin Semrad <semrad@i-registry.cz>
  14049. co.cz
  14050. // CDN77.com : http://www.cdn77.com
  14051. // Submitted by Jan Krpes <jan.krpes@cdn77.com>
  14052. c.cdn77.org
  14053. cdn77-ssl.net
  14054. r.cdn77.net
  14055. rsc.cdn77.org
  14056. ssl.origin.cdn77-secure.org
  14057. // Cloud DNS Ltd : http://www.cloudns.net
  14058. // Submitted by Aleksander Hristov <noc@cloudns.net>
  14059. cloudns.asia
  14060. cloudns.biz
  14061. cloudns.club
  14062. cloudns.cc
  14063. cloudns.eu
  14064. cloudns.in
  14065. cloudns.info
  14066. cloudns.org
  14067. cloudns.pro
  14068. cloudns.pw
  14069. cloudns.us
  14070. // CNPY : https://cnpy.gdn
  14071. // Submitted by Angelo Gladding <angelo@lahacker.net>
  14072. cnpy.gdn
  14073. // Codeberg e. V. : https://codeberg.org
  14074. // Submitted by Moritz Marquardt <git@momar.de>
  14075. codeberg.page
  14076. // CoDNS B.V.
  14077. co.nl
  14078. co.no
  14079. // Combell.com : https://www.combell.com
  14080. // Submitted by Thomas Wouters <thomas.wouters@combellgroup.com>
  14081. webhosting.be
  14082. hosting-cluster.nl
  14083. // Coordination Center for TLD RU and XN--P1AI : https://cctld.ru/en/domains/domens_ru/reserved/
  14084. // Submitted by George Georgievsky <gug@cctld.ru>
  14085. ac.ru
  14086. edu.ru
  14087. gov.ru
  14088. int.ru
  14089. mil.ru
  14090. test.ru
  14091. // COSIMO GmbH : http://www.cosimo.de
  14092. // Submitted by Rene Marticke <rmarticke@cosimo.de>
  14093. dyn.cosidns.de
  14094. dynamisches-dns.de
  14095. dnsupdater.de
  14096. internet-dns.de
  14097. l-o-g-i-n.de
  14098. dynamic-dns.info
  14099. feste-ip.net
  14100. knx-server.net
  14101. static-access.net
  14102. // Craynic, s.r.o. : http://www.craynic.com/
  14103. // Submitted by Ales Krajnik <ales.krajnik@craynic.com>
  14104. realm.cz
  14105. // Cryptonomic : https://cryptonomic.net/
  14106. // Submitted by Andrew Cady <public-suffix-list@cryptonomic.net>
  14107. *.cryptonomic.net
  14108. // Cupcake : https://cupcake.io/
  14109. // Submitted by Jonathan Rudenberg <jonathan@cupcake.io>
  14110. cupcake.is
  14111. // Curv UG : https://curv-labs.de/
  14112. // Submitted by Marvin Wiesner <Marvin@curv-labs.de>
  14113. curv.dev
  14114. // Customer OCI - Oracle Dyn https://cloud.oracle.com/home https://dyn.com/dns/
  14115. // Submitted by Gregory Drake <support@dyn.com>
  14116. // Note: This is intended to also include customer-oci.com due to wildcards implicitly including the current label
  14117. *.customer-oci.com
  14118. *.oci.customer-oci.com
  14119. *.ocp.customer-oci.com
  14120. *.ocs.customer-oci.com
  14121. // cyon GmbH : https://www.cyon.ch/
  14122. // Submitted by Dominic Luechinger <dol@cyon.ch>
  14123. cyon.link
  14124. cyon.site
  14125. // Danger Science Group: https://dangerscience.com/
  14126. // Submitted by Skylar MacDonald <skylar@dangerscience.com>
  14127. fnwk.site
  14128. folionetwork.site
  14129. platform0.app
  14130. // Daplie, Inc : https://daplie.com
  14131. // Submitted by AJ ONeal <aj@daplie.com>
  14132. daplie.me
  14133. localhost.daplie.me
  14134. // Datto, Inc. : https://www.datto.com/
  14135. // Submitted by Philipp Heckel <ph@datto.com>
  14136. dattolocal.com
  14137. dattorelay.com
  14138. dattoweb.com
  14139. mydatto.com
  14140. dattolocal.net
  14141. mydatto.net
  14142. // Dansk.net : http://www.dansk.net/
  14143. // Submitted by Anani Voule <digital@digital.co.dk>
  14144. biz.dk
  14145. co.dk
  14146. firm.dk
  14147. reg.dk
  14148. store.dk
  14149. // dappnode.io : https://dappnode.io/
  14150. // Submitted by Abel Boldu / DAppNode Team <community@dappnode.io>
  14151. dyndns.dappnode.io
  14152. // dapps.earth : https://dapps.earth/
  14153. // Submitted by Daniil Burdakov <icqkill@gmail.com>
  14154. *.dapps.earth
  14155. *.bzz.dapps.earth
  14156. // Dark, Inc. : https://darklang.com
  14157. // Submitted by Paul Biggar <ops@darklang.com>
  14158. builtwithdark.com
  14159. // DataDetect, LLC. : https://datadetect.com
  14160. // Submitted by Andrew Banchich <abanchich@sceven.com>
  14161. demo.datadetect.com
  14162. instance.datadetect.com
  14163. // Datawire, Inc : https://www.datawire.io
  14164. // Submitted by Richard Li <secalert@datawire.io>
  14165. edgestack.me
  14166. // DDNS5 : https://ddns5.com
  14167. // Submitted by Cameron Elliott <cameron@cameronelliott.com>
  14168. ddns5.com
  14169. // Debian : https://www.debian.org/
  14170. // Submitted by Peter Palfrader / Debian Sysadmin Team <dsa-publicsuffixlist@debian.org>
  14171. debian.net
  14172. // Deno Land Inc : https://deno.com/
  14173. // Submitted by Luca Casonato <hostmaster@deno.com>
  14174. deno.dev
  14175. deno-staging.dev
  14176. // deSEC : https://desec.io/
  14177. // Submitted by Peter Thomassen <peter@desec.io>
  14178. dedyn.io
  14179. // Deta: https://www.deta.sh/
  14180. // Submitted by Aavash Shrestha <aavash@deta.sh>
  14181. deta.app
  14182. deta.dev
  14183. // Diher Solutions : https://diher.solutions
  14184. // Submitted by Didi Hermawan <mail@diher.solutions>
  14185. *.rss.my.id
  14186. *.diher.solutions
  14187. // Discord Inc : https://discord.com
  14188. // Submitted by Sahn Lam <slam@discordapp.com>
  14189. discordsays.com
  14190. discordsez.com
  14191. // DNS Africa Ltd https://dns.business
  14192. // Submitted by Calvin Browne <calvin@dns.business>
  14193. jozi.biz
  14194. // DNShome : https://www.dnshome.de/
  14195. // Submitted by Norbert Auler <mail@dnshome.de>
  14196. dnshome.de
  14197. // DotArai : https://www.dotarai.com/
  14198. // Submitted by Atsadawat Netcharadsang <atsadawat@dotarai.co.th>
  14199. online.th
  14200. shop.th
  14201. // DrayTek Corp. : https://www.draytek.com/
  14202. // Submitted by Paul Fang <mis@draytek.com>
  14203. drayddns.com
  14204. // DreamCommerce : https://shoper.pl/
  14205. // Submitted by Konrad Kotarba <konrad.kotarba@dreamcommerce.com>
  14206. shoparena.pl
  14207. // DreamHost : http://www.dreamhost.com/
  14208. // Submitted by Andrew Farmer <andrew.farmer@dreamhost.com>
  14209. dreamhosters.com
  14210. // Drobo : http://www.drobo.com/
  14211. // Submitted by Ricardo Padilha <rpadilha@drobo.com>
  14212. mydrobo.com
  14213. // Drud Holdings, LLC. : https://www.drud.com/
  14214. // Submitted by Kevin Bridges <kevin@drud.com>
  14215. drud.io
  14216. drud.us
  14217. // DuckDNS : http://www.duckdns.org/
  14218. // Submitted by Richard Harper <richard@duckdns.org>
  14219. duckdns.org
  14220. // Bip : https://bip.sh
  14221. // Submitted by Joel Kennedy <joel@bip.sh>
  14222. bip.sh
  14223. // bitbridge.net : Submitted by Craig Welch, abeliidev@gmail.com
  14224. bitbridge.net
  14225. // dy.fi : http://dy.fi/
  14226. // Submitted by Heikki Hannikainen <hessu@hes.iki.fi>
  14227. dy.fi
  14228. tunk.org
  14229. // DynDNS.com : http://www.dyndns.com/services/dns/dyndns/
  14230. dyndns-at-home.com
  14231. dyndns-at-work.com
  14232. dyndns-blog.com
  14233. dyndns-free.com
  14234. dyndns-home.com
  14235. dyndns-ip.com
  14236. dyndns-mail.com
  14237. dyndns-office.com
  14238. dyndns-pics.com
  14239. dyndns-remote.com
  14240. dyndns-server.com
  14241. dyndns-web.com
  14242. dyndns-wiki.com
  14243. dyndns-work.com
  14244. dyndns.biz
  14245. dyndns.info
  14246. dyndns.org
  14247. dyndns.tv
  14248. at-band-camp.net
  14249. ath.cx
  14250. barrel-of-knowledge.info
  14251. barrell-of-knowledge.info
  14252. better-than.tv
  14253. blogdns.com
  14254. blogdns.net
  14255. blogdns.org
  14256. blogsite.org
  14257. boldlygoingnowhere.org
  14258. broke-it.net
  14259. buyshouses.net
  14260. cechire.com
  14261. dnsalias.com
  14262. dnsalias.net
  14263. dnsalias.org
  14264. dnsdojo.com
  14265. dnsdojo.net
  14266. dnsdojo.org
  14267. does-it.net
  14268. doesntexist.com
  14269. doesntexist.org
  14270. dontexist.com
  14271. dontexist.net
  14272. dontexist.org
  14273. doomdns.com
  14274. doomdns.org
  14275. dvrdns.org
  14276. dyn-o-saur.com
  14277. dynalias.com
  14278. dynalias.net
  14279. dynalias.org
  14280. dynathome.net
  14281. dyndns.ws
  14282. endofinternet.net
  14283. endofinternet.org
  14284. endoftheinternet.org
  14285. est-a-la-maison.com
  14286. est-a-la-masion.com
  14287. est-le-patron.com
  14288. est-mon-blogueur.com
  14289. for-better.biz
  14290. for-more.biz
  14291. for-our.info
  14292. for-some.biz
  14293. for-the.biz
  14294. forgot.her.name
  14295. forgot.his.name
  14296. from-ak.com
  14297. from-al.com
  14298. from-ar.com
  14299. from-az.net
  14300. from-ca.com
  14301. from-co.net
  14302. from-ct.com
  14303. from-dc.com
  14304. from-de.com
  14305. from-fl.com
  14306. from-ga.com
  14307. from-hi.com
  14308. from-ia.com
  14309. from-id.com
  14310. from-il.com
  14311. from-in.com
  14312. from-ks.com
  14313. from-ky.com
  14314. from-la.net
  14315. from-ma.com
  14316. from-md.com
  14317. from-me.org
  14318. from-mi.com
  14319. from-mn.com
  14320. from-mo.com
  14321. from-ms.com
  14322. from-mt.com
  14323. from-nc.com
  14324. from-nd.com
  14325. from-ne.com
  14326. from-nh.com
  14327. from-nj.com
  14328. from-nm.com
  14329. from-nv.com
  14330. from-ny.net
  14331. from-oh.com
  14332. from-ok.com
  14333. from-or.com
  14334. from-pa.com
  14335. from-pr.com
  14336. from-ri.com
  14337. from-sc.com
  14338. from-sd.com
  14339. from-tn.com
  14340. from-tx.com
  14341. from-ut.com
  14342. from-va.com
  14343. from-vt.com
  14344. from-wa.com
  14345. from-wi.com
  14346. from-wv.com
  14347. from-wy.com
  14348. ftpaccess.cc
  14349. fuettertdasnetz.de
  14350. game-host.org
  14351. game-server.cc
  14352. getmyip.com
  14353. gets-it.net
  14354. go.dyndns.org
  14355. gotdns.com
  14356. gotdns.org
  14357. groks-the.info
  14358. groks-this.info
  14359. ham-radio-op.net
  14360. here-for-more.info
  14361. hobby-site.com
  14362. hobby-site.org
  14363. home.dyndns.org
  14364. homedns.org
  14365. homeftp.net
  14366. homeftp.org
  14367. homeip.net
  14368. homelinux.com
  14369. homelinux.net
  14370. homelinux.org
  14371. homeunix.com
  14372. homeunix.net
  14373. homeunix.org
  14374. iamallama.com
  14375. in-the-band.net
  14376. is-a-anarchist.com
  14377. is-a-blogger.com
  14378. is-a-bookkeeper.com
  14379. is-a-bruinsfan.org
  14380. is-a-bulls-fan.com
  14381. is-a-candidate.org
  14382. is-a-caterer.com
  14383. is-a-celticsfan.org
  14384. is-a-chef.com
  14385. is-a-chef.net
  14386. is-a-chef.org
  14387. is-a-conservative.com
  14388. is-a-cpa.com
  14389. is-a-cubicle-slave.com
  14390. is-a-democrat.com
  14391. is-a-designer.com
  14392. is-a-doctor.com
  14393. is-a-financialadvisor.com
  14394. is-a-geek.com
  14395. is-a-geek.net
  14396. is-a-geek.org
  14397. is-a-green.com
  14398. is-a-guru.com
  14399. is-a-hard-worker.com
  14400. is-a-hunter.com
  14401. is-a-knight.org
  14402. is-a-landscaper.com
  14403. is-a-lawyer.com
  14404. is-a-liberal.com
  14405. is-a-libertarian.com
  14406. is-a-linux-user.org
  14407. is-a-llama.com
  14408. is-a-musician.com
  14409. is-a-nascarfan.com
  14410. is-a-nurse.com
  14411. is-a-painter.com
  14412. is-a-patsfan.org
  14413. is-a-personaltrainer.com
  14414. is-a-photographer.com
  14415. is-a-player.com
  14416. is-a-republican.com
  14417. is-a-rockstar.com
  14418. is-a-socialist.com
  14419. is-a-soxfan.org
  14420. is-a-student.com
  14421. is-a-teacher.com
  14422. is-a-techie.com
  14423. is-a-therapist.com
  14424. is-an-accountant.com
  14425. is-an-actor.com
  14426. is-an-actress.com
  14427. is-an-anarchist.com
  14428. is-an-artist.com
  14429. is-an-engineer.com
  14430. is-an-entertainer.com
  14431. is-by.us
  14432. is-certified.com
  14433. is-found.org
  14434. is-gone.com
  14435. is-into-anime.com
  14436. is-into-cars.com
  14437. is-into-cartoons.com
  14438. is-into-games.com
  14439. is-leet.com
  14440. is-lost.org
  14441. is-not-certified.com
  14442. is-saved.org
  14443. is-slick.com
  14444. is-uberleet.com
  14445. is-very-bad.org
  14446. is-very-evil.org
  14447. is-very-good.org
  14448. is-very-nice.org
  14449. is-very-sweet.org
  14450. is-with-theband.com
  14451. isa-geek.com
  14452. isa-geek.net
  14453. isa-geek.org
  14454. isa-hockeynut.com
  14455. issmarterthanyou.com
  14456. isteingeek.de
  14457. istmein.de
  14458. kicks-ass.net
  14459. kicks-ass.org
  14460. knowsitall.info
  14461. land-4-sale.us
  14462. lebtimnetz.de
  14463. leitungsen.de
  14464. likes-pie.com
  14465. likescandy.com
  14466. merseine.nu
  14467. mine.nu
  14468. misconfused.org
  14469. mypets.ws
  14470. myphotos.cc
  14471. neat-url.com
  14472. office-on-the.net
  14473. on-the-web.tv
  14474. podzone.net
  14475. podzone.org
  14476. readmyblog.org
  14477. saves-the-whales.com
  14478. scrapper-site.net
  14479. scrapping.cc
  14480. selfip.biz
  14481. selfip.com
  14482. selfip.info
  14483. selfip.net
  14484. selfip.org
  14485. sells-for-less.com
  14486. sells-for-u.com
  14487. sells-it.net
  14488. sellsyourhome.org
  14489. servebbs.com
  14490. servebbs.net
  14491. servebbs.org
  14492. serveftp.net
  14493. serveftp.org
  14494. servegame.org
  14495. shacknet.nu
  14496. simple-url.com
  14497. space-to-rent.com
  14498. stuff-4-sale.org
  14499. stuff-4-sale.us
  14500. teaches-yoga.com
  14501. thruhere.net
  14502. traeumtgerade.de
  14503. webhop.biz
  14504. webhop.info
  14505. webhop.net
  14506. webhop.org
  14507. worse-than.tv
  14508. writesthisblog.com
  14509. // ddnss.de : https://www.ddnss.de/
  14510. // Submitted by Robert Niedziela <webmaster@ddnss.de>
  14511. ddnss.de
  14512. dyn.ddnss.de
  14513. dyndns.ddnss.de
  14514. dyndns1.de
  14515. dyn-ip24.de
  14516. home-webserver.de
  14517. dyn.home-webserver.de
  14518. myhome-server.de
  14519. ddnss.org
  14520. // Definima : http://www.definima.com/
  14521. // Submitted by Maxence Bitterli <maxence@definima.com>
  14522. definima.net
  14523. definima.io
  14524. // DigitalOcean App Platform : https://www.digitalocean.com/products/app-platform/
  14525. // Submitted by Braxton Huggins <psl-maintainers@digitalocean.com>
  14526. ondigitalocean.app
  14527. // DigitalOcean Spaces : https://www.digitalocean.com/products/spaces/
  14528. // Submitted by Robin H. Johnson <psl-maintainers@digitalocean.com>
  14529. *.digitaloceanspaces.com
  14530. // dnstrace.pro : https://dnstrace.pro/
  14531. // Submitted by Chris Partridge <chris@partridge.tech>
  14532. bci.dnstrace.pro
  14533. // Dynu.com : https://www.dynu.com/
  14534. // Submitted by Sue Ye <sue@dynu.com>
  14535. ddnsfree.com
  14536. ddnsgeek.com
  14537. giize.com
  14538. gleeze.com
  14539. kozow.com
  14540. loseyourip.com
  14541. ooguy.com
  14542. theworkpc.com
  14543. casacam.net
  14544. dynu.net
  14545. accesscam.org
  14546. camdvr.org
  14547. freeddns.org
  14548. mywire.org
  14549. webredirect.org
  14550. myddns.rocks
  14551. blogsite.xyz
  14552. // dynv6 : https://dynv6.com
  14553. // Submitted by Dominik Menke <dom@digineo.de>
  14554. dynv6.net
  14555. // E4YOU spol. s.r.o. : https://e4you.cz/
  14556. // Submitted by Vladimir Dudr <info@e4you.cz>
  14557. e4.cz
  14558. // Easypanel : https://easypanel.io
  14559. // Submitted by Andrei Canta <andrei@easypanel.io>
  14560. easypanel.app
  14561. easypanel.host
  14562. // Elementor : Elementor Ltd.
  14563. // Submitted by Anton Barkan <antonb@elementor.com>
  14564. elementor.cloud
  14565. elementor.cool
  14566. // En root‽ : https://en-root.org
  14567. // Submitted by Emmanuel Raviart <emmanuel@raviart.com>
  14568. en-root.fr
  14569. // Enalean SAS: https://www.enalean.com
  14570. // Submitted by Thomas Cottier <thomas.cottier@enalean.com>
  14571. mytuleap.com
  14572. tuleap-partners.com
  14573. // Encoretivity AB: https://encore.dev
  14574. // Submitted by André Eriksson <andre@encore.dev>
  14575. encr.app
  14576. encoreapi.com
  14577. // ECG Robotics, Inc: https://ecgrobotics.org
  14578. // Submitted by <frc1533@ecgrobotics.org>
  14579. onred.one
  14580. staging.onred.one
  14581. // encoway GmbH : https://www.encoway.de
  14582. // Submitted by Marcel Daus <cloudops@encoway.de>
  14583. eu.encoway.cloud
  14584. // EU.org https://eu.org/
  14585. // Submitted by Pierre Beyssac <hostmaster@eu.org>
  14586. eu.org
  14587. al.eu.org
  14588. asso.eu.org
  14589. at.eu.org
  14590. au.eu.org
  14591. be.eu.org
  14592. bg.eu.org
  14593. ca.eu.org
  14594. cd.eu.org
  14595. ch.eu.org
  14596. cn.eu.org
  14597. cy.eu.org
  14598. cz.eu.org
  14599. de.eu.org
  14600. dk.eu.org
  14601. edu.eu.org
  14602. ee.eu.org
  14603. es.eu.org
  14604. fi.eu.org
  14605. fr.eu.org
  14606. gr.eu.org
  14607. hr.eu.org
  14608. hu.eu.org
  14609. ie.eu.org
  14610. il.eu.org
  14611. in.eu.org
  14612. int.eu.org
  14613. is.eu.org
  14614. it.eu.org
  14615. jp.eu.org
  14616. kr.eu.org
  14617. lt.eu.org
  14618. lu.eu.org
  14619. lv.eu.org
  14620. mc.eu.org
  14621. me.eu.org
  14622. mk.eu.org
  14623. mt.eu.org
  14624. my.eu.org
  14625. net.eu.org
  14626. ng.eu.org
  14627. nl.eu.org
  14628. no.eu.org
  14629. nz.eu.org
  14630. paris.eu.org
  14631. pl.eu.org
  14632. pt.eu.org
  14633. q-a.eu.org
  14634. ro.eu.org
  14635. ru.eu.org
  14636. se.eu.org
  14637. si.eu.org
  14638. sk.eu.org
  14639. tr.eu.org
  14640. uk.eu.org
  14641. us.eu.org
  14642. // Eurobyte : https://eurobyte.ru
  14643. // Submitted by Evgeniy Subbotin <e.subbotin@eurobyte.ru>
  14644. eurodir.ru
  14645. // Evennode : http://www.evennode.com/
  14646. // Submitted by Michal Kralik <support@evennode.com>
  14647. eu-1.evennode.com
  14648. eu-2.evennode.com
  14649. eu-3.evennode.com
  14650. eu-4.evennode.com
  14651. us-1.evennode.com
  14652. us-2.evennode.com
  14653. us-3.evennode.com
  14654. us-4.evennode.com
  14655. // eDirect Corp. : https://hosting.url.com.tw/
  14656. // Submitted by C.S. chang <cschang@corp.url.com.tw>
  14657. twmail.cc
  14658. twmail.net
  14659. twmail.org
  14660. mymailer.com.tw
  14661. url.tw
  14662. // Fabrica Technologies, Inc. : https://www.fabrica.dev/
  14663. // Submitted by Eric Jiang <eric@fabrica.dev>
  14664. onfabrica.com
  14665. // Facebook, Inc.
  14666. // Submitted by Peter Ruibal <public-suffix@fb.com>
  14667. apps.fbsbx.com
  14668. // FAITID : https://faitid.org/
  14669. // Submitted by Maxim Alzoba <tech.contact@faitid.org>
  14670. // https://www.flexireg.net/stat_info
  14671. ru.net
  14672. adygeya.ru
  14673. bashkiria.ru
  14674. bir.ru
  14675. cbg.ru
  14676. com.ru
  14677. dagestan.ru
  14678. grozny.ru
  14679. kalmykia.ru
  14680. kustanai.ru
  14681. marine.ru
  14682. mordovia.ru
  14683. msk.ru
  14684. mytis.ru
  14685. nalchik.ru
  14686. nov.ru
  14687. pyatigorsk.ru
  14688. spb.ru
  14689. vladikavkaz.ru
  14690. vladimir.ru
  14691. abkhazia.su
  14692. adygeya.su
  14693. aktyubinsk.su
  14694. arkhangelsk.su
  14695. armenia.su
  14696. ashgabad.su
  14697. azerbaijan.su
  14698. balashov.su
  14699. bashkiria.su
  14700. bryansk.su
  14701. bukhara.su
  14702. chimkent.su
  14703. dagestan.su
  14704. east-kazakhstan.su
  14705. exnet.su
  14706. georgia.su
  14707. grozny.su
  14708. ivanovo.su
  14709. jambyl.su
  14710. kalmykia.su
  14711. kaluga.su
  14712. karacol.su
  14713. karaganda.su
  14714. karelia.su
  14715. khakassia.su
  14716. krasnodar.su
  14717. kurgan.su
  14718. kustanai.su
  14719. lenug.su
  14720. mangyshlak.su
  14721. mordovia.su
  14722. msk.su
  14723. murmansk.su
  14724. nalchik.su
  14725. navoi.su
  14726. north-kazakhstan.su
  14727. nov.su
  14728. obninsk.su
  14729. penza.su
  14730. pokrovsk.su
  14731. sochi.su
  14732. spb.su
  14733. tashkent.su
  14734. termez.su
  14735. togliatti.su
  14736. troitsk.su
  14737. tselinograd.su
  14738. tula.su
  14739. tuva.su
  14740. vladikavkaz.su
  14741. vladimir.su
  14742. vologda.su
  14743. // Fancy Bits, LLC : http://getchannels.com
  14744. // Submitted by Aman Gupta <aman@getchannels.com>
  14745. channelsdvr.net
  14746. u.channelsdvr.net
  14747. // Fastly Inc. : http://www.fastly.com/
  14748. // Submitted by Fastly Security <security@fastly.com>
  14749. edgecompute.app
  14750. fastly-edge.com
  14751. fastly-terrarium.com
  14752. fastlylb.net
  14753. map.fastlylb.net
  14754. freetls.fastly.net
  14755. map.fastly.net
  14756. a.prod.fastly.net
  14757. global.prod.fastly.net
  14758. a.ssl.fastly.net
  14759. b.ssl.fastly.net
  14760. global.ssl.fastly.net
  14761. // Fastmail : https://www.fastmail.com/
  14762. // Submitted by Marc Bradshaw <marc@fastmailteam.com>
  14763. *.user.fm
  14764. // FASTVPS EESTI OU : https://fastvps.ru/
  14765. // Submitted by Likhachev Vasiliy <lihachev@fastvps.ru>
  14766. fastvps-server.com
  14767. fastvps.host
  14768. myfast.host
  14769. fastvps.site
  14770. myfast.space
  14771. // Fedora : https://fedoraproject.org/
  14772. // submitted by Patrick Uiterwijk <puiterwijk@fedoraproject.org>
  14773. fedorainfracloud.org
  14774. fedorapeople.org
  14775. cloud.fedoraproject.org
  14776. app.os.fedoraproject.org
  14777. app.os.stg.fedoraproject.org
  14778. // FearWorks Media Ltd. : https://fearworksmedia.co.uk
  14779. // submitted by Keith Fairley <domains@fearworksmedia.co.uk>
  14780. conn.uk
  14781. copro.uk
  14782. hosp.uk
  14783. // Fermax : https://fermax.com/
  14784. // submitted by Koen Van Isterdael <k.vanisterdael@fermax.be>
  14785. mydobiss.com
  14786. // FH Muenster : https://www.fh-muenster.de
  14787. // Submitted by Robin Naundorf <r.naundorf@fh-muenster.de>
  14788. fh-muenster.io
  14789. // Filegear Inc. : https://www.filegear.com
  14790. // Submitted by Jason Zhu <jason@owtware.com>
  14791. filegear.me
  14792. filegear-au.me
  14793. filegear-de.me
  14794. filegear-gb.me
  14795. filegear-ie.me
  14796. filegear-jp.me
  14797. filegear-sg.me
  14798. // Firebase, Inc.
  14799. // Submitted by Chris Raynor <chris@firebase.com>
  14800. firebaseapp.com
  14801. // Firewebkit : https://www.firewebkit.com
  14802. // Submitted by Majid Qureshi <mqureshi@amrayn.com>
  14803. fireweb.app
  14804. // FLAP : https://www.flap.cloud
  14805. // Submitted by Louis Chemineau <louis@chmn.me>
  14806. flap.id
  14807. // FlashDrive : https://flashdrive.io
  14808. // Submitted by Eric Chan <support@flashdrive.io>
  14809. onflashdrive.app
  14810. fldrv.com
  14811. // fly.io: https://fly.io
  14812. // Submitted by Kurt Mackey <kurt@fly.io>
  14813. fly.dev
  14814. edgeapp.net
  14815. shw.io
  14816. // Flynn : https://flynn.io
  14817. // Submitted by Jonathan Rudenberg <jonathan@flynn.io>
  14818. flynnhosting.net
  14819. // Forgerock : https://www.forgerock.com
  14820. // Submitted by Roderick Parr <roderick.parr@forgerock.com>
  14821. forgeblocks.com
  14822. id.forgerock.io
  14823. // Framer : https://www.framer.com
  14824. // Submitted by Koen Rouwhorst <koenrh@framer.com>
  14825. framer.app
  14826. framercanvas.com
  14827. framer.media
  14828. framer.photos
  14829. framer.website
  14830. framer.wiki
  14831. // Frusky MEDIA&PR : https://www.frusky.de
  14832. // Submitted by Victor Pupynin <hallo@frusky.de>
  14833. *.frusky.de
  14834. // RavPage : https://www.ravpage.co.il
  14835. // Submitted by Roni Horowitz <roni@responder.co.il>
  14836. ravpage.co.il
  14837. // Frederik Braun https://frederik-braun.com
  14838. // Submitted by Frederik Braun <fb@frederik-braun.com>
  14839. 0e.vc
  14840. // Freebox : http://www.freebox.fr
  14841. // Submitted by Romain Fliedel <rfliedel@freebox.fr>
  14842. freebox-os.com
  14843. freeboxos.com
  14844. fbx-os.fr
  14845. fbxos.fr
  14846. freebox-os.fr
  14847. freeboxos.fr
  14848. // freedesktop.org : https://www.freedesktop.org
  14849. // Submitted by Daniel Stone <daniel@fooishbar.org>
  14850. freedesktop.org
  14851. // freemyip.com : https://freemyip.com
  14852. // Submitted by Cadence <contact@freemyip.com>
  14853. freemyip.com
  14854. // FunkFeuer - Verein zur Förderung freier Netze : https://www.funkfeuer.at
  14855. // Submitted by Daniel A. Maierhofer <vorstand@funkfeuer.at>
  14856. wien.funkfeuer.at
  14857. // Futureweb OG : http://www.futureweb.at
  14858. // Submitted by Andreas Schnederle-Wagner <schnederle@futureweb.at>
  14859. *.futurecms.at
  14860. *.ex.futurecms.at
  14861. *.in.futurecms.at
  14862. futurehosting.at
  14863. futuremailing.at
  14864. *.ex.ortsinfo.at
  14865. *.kunden.ortsinfo.at
  14866. *.statics.cloud
  14867. // GDS : https://www.gov.uk/service-manual/technology/managing-domain-names
  14868. // Submitted by Stephen Ford <hostmaster@digital.cabinet-office.gov.uk>
  14869. independent-commission.uk
  14870. independent-inquest.uk
  14871. independent-inquiry.uk
  14872. independent-panel.uk
  14873. independent-review.uk
  14874. public-inquiry.uk
  14875. royal-commission.uk
  14876. campaign.gov.uk
  14877. service.gov.uk
  14878. // CDDO : https://www.gov.uk/guidance/get-an-api-domain-on-govuk
  14879. // Submitted by Jamie Tanna <jamie.tanna@digital.cabinet-office.gov.uk>
  14880. api.gov.uk
  14881. // Gehirn Inc. : https://www.gehirn.co.jp/
  14882. // Submitted by Kohei YOSHIDA <tech@gehirn.co.jp>
  14883. gehirn.ne.jp
  14884. usercontent.jp
  14885. // Gentlent, Inc. : https://www.gentlent.com
  14886. // Submitted by Tom Klein <tom@gentlent.com>
  14887. gentapps.com
  14888. gentlentapis.com
  14889. lab.ms
  14890. cdn-edges.net
  14891. // Ghost Foundation : https://ghost.org
  14892. // Submitted by Matt Hanley <security@ghost.org>
  14893. ghost.io
  14894. // GignoSystemJapan: http://gsj.bz
  14895. // Submitted by GignoSystemJapan <kakutou-ec@gsj.bz>
  14896. gsj.bz
  14897. // GitHub, Inc.
  14898. // Submitted by Patrick Toomey <security@github.com>
  14899. githubusercontent.com
  14900. githubpreview.dev
  14901. github.io
  14902. // GitLab, Inc.
  14903. // Submitted by Alex Hanselka <alex@gitlab.com>
  14904. gitlab.io
  14905. // Gitplac.si - https://gitplac.si
  14906. // Submitted by Aljaž Starc <me@aljaxus.eu>
  14907. gitapp.si
  14908. gitpage.si
  14909. // Glitch, Inc : https://glitch.com
  14910. // Submitted by Mads Hartmann <mads@glitch.com>
  14911. glitch.me
  14912. // Global NOG Alliance : https://nogalliance.org/
  14913. // Submitted by Sander Steffann <sander@nogalliance.org>
  14914. nog.community
  14915. // Globe Hosting SRL : https://www.globehosting.com/
  14916. // Submitted by Gavin Brown <gavin.brown@centralnic.com>
  14917. co.ro
  14918. shop.ro
  14919. // GMO Pepabo, Inc. : https://pepabo.com/
  14920. // Submitted by Hosting Div <admin@pepabo.com>
  14921. lolipop.io
  14922. angry.jp
  14923. babyblue.jp
  14924. babymilk.jp
  14925. backdrop.jp
  14926. bambina.jp
  14927. bitter.jp
  14928. blush.jp
  14929. boo.jp
  14930. boy.jp
  14931. boyfriend.jp
  14932. but.jp
  14933. candypop.jp
  14934. capoo.jp
  14935. catfood.jp
  14936. cheap.jp
  14937. chicappa.jp
  14938. chillout.jp
  14939. chips.jp
  14940. chowder.jp
  14941. chu.jp
  14942. ciao.jp
  14943. cocotte.jp
  14944. coolblog.jp
  14945. cranky.jp
  14946. cutegirl.jp
  14947. daa.jp
  14948. deca.jp
  14949. deci.jp
  14950. digick.jp
  14951. egoism.jp
  14952. fakefur.jp
  14953. fem.jp
  14954. flier.jp
  14955. floppy.jp
  14956. fool.jp
  14957. frenchkiss.jp
  14958. girlfriend.jp
  14959. girly.jp
  14960. gloomy.jp
  14961. gonna.jp
  14962. greater.jp
  14963. hacca.jp
  14964. heavy.jp
  14965. her.jp
  14966. hiho.jp
  14967. hippy.jp
  14968. holy.jp
  14969. hungry.jp
  14970. icurus.jp
  14971. itigo.jp
  14972. jellybean.jp
  14973. kikirara.jp
  14974. kill.jp
  14975. kilo.jp
  14976. kuron.jp
  14977. littlestar.jp
  14978. lolipopmc.jp
  14979. lolitapunk.jp
  14980. lomo.jp
  14981. lovepop.jp
  14982. lovesick.jp
  14983. main.jp
  14984. mods.jp
  14985. mond.jp
  14986. mongolian.jp
  14987. moo.jp
  14988. namaste.jp
  14989. nikita.jp
  14990. nobushi.jp
  14991. noor.jp
  14992. oops.jp
  14993. parallel.jp
  14994. parasite.jp
  14995. pecori.jp
  14996. peewee.jp
  14997. penne.jp
  14998. pepper.jp
  14999. perma.jp
  15000. pigboat.jp
  15001. pinoko.jp
  15002. punyu.jp
  15003. pupu.jp
  15004. pussycat.jp
  15005. pya.jp
  15006. raindrop.jp
  15007. readymade.jp
  15008. sadist.jp
  15009. schoolbus.jp
  15010. secret.jp
  15011. staba.jp
  15012. stripper.jp
  15013. sub.jp
  15014. sunnyday.jp
  15015. thick.jp
  15016. tonkotsu.jp
  15017. under.jp
  15018. upper.jp
  15019. velvet.jp
  15020. verse.jp
  15021. versus.jp
  15022. vivian.jp
  15023. watson.jp
  15024. weblike.jp
  15025. whitesnow.jp
  15026. zombie.jp
  15027. heteml.net
  15028. // GOV.UK Platform as a Service : https://www.cloud.service.gov.uk/
  15029. // Submitted by Tom Whitwell <gov-uk-paas-support@digital.cabinet-office.gov.uk>
  15030. cloudapps.digital
  15031. london.cloudapps.digital
  15032. // GOV.UK Pay : https://www.payments.service.gov.uk/
  15033. // Submitted by Richard Baker <richard.baker@digital.cabinet-office.gov.uk>
  15034. pymnt.uk
  15035. // UKHomeOffice : https://www.gov.uk/government/organisations/home-office
  15036. // Submitted by Jon Shanks <jon.shanks@digital.homeoffice.gov.uk>
  15037. homeoffice.gov.uk
  15038. // GlobeHosting, Inc.
  15039. // Submitted by Zoltan Egresi <egresi@globehosting.com>
  15040. ro.im
  15041. // GoIP DNS Services : http://www.goip.de
  15042. // Submitted by Christian Poulter <milchstrasse@goip.de>
  15043. goip.de
  15044. // Google, Inc.
  15045. // Submitted by Eduardo Vela <evn@google.com>
  15046. run.app
  15047. a.run.app
  15048. web.app
  15049. *.0emm.com
  15050. appspot.com
  15051. *.r.appspot.com
  15052. codespot.com
  15053. googleapis.com
  15054. googlecode.com
  15055. pagespeedmobilizer.com
  15056. publishproxy.com
  15057. withgoogle.com
  15058. withyoutube.com
  15059. *.gateway.dev
  15060. cloud.goog
  15061. translate.goog
  15062. *.usercontent.goog
  15063. cloudfunctions.net
  15064. blogspot.ae
  15065. blogspot.al
  15066. blogspot.am
  15067. blogspot.ba
  15068. blogspot.be
  15069. blogspot.bg
  15070. blogspot.bj
  15071. blogspot.ca
  15072. blogspot.cf
  15073. blogspot.ch
  15074. blogspot.cl
  15075. blogspot.co.at
  15076. blogspot.co.id
  15077. blogspot.co.il
  15078. blogspot.co.ke
  15079. blogspot.co.nz
  15080. blogspot.co.uk
  15081. blogspot.co.za
  15082. blogspot.com
  15083. blogspot.com.ar
  15084. blogspot.com.au
  15085. blogspot.com.br
  15086. blogspot.com.by
  15087. blogspot.com.co
  15088. blogspot.com.cy
  15089. blogspot.com.ee
  15090. blogspot.com.eg
  15091. blogspot.com.es
  15092. blogspot.com.mt
  15093. blogspot.com.ng
  15094. blogspot.com.tr
  15095. blogspot.com.uy
  15096. blogspot.cv
  15097. blogspot.cz
  15098. blogspot.de
  15099. blogspot.dk
  15100. blogspot.fi
  15101. blogspot.fr
  15102. blogspot.gr
  15103. blogspot.hk
  15104. blogspot.hr
  15105. blogspot.hu
  15106. blogspot.ie
  15107. blogspot.in
  15108. blogspot.is
  15109. blogspot.it
  15110. blogspot.jp
  15111. blogspot.kr
  15112. blogspot.li
  15113. blogspot.lt
  15114. blogspot.lu
  15115. blogspot.md
  15116. blogspot.mk
  15117. blogspot.mr
  15118. blogspot.mx
  15119. blogspot.my
  15120. blogspot.nl
  15121. blogspot.no
  15122. blogspot.pe
  15123. blogspot.pt
  15124. blogspot.qa
  15125. blogspot.re
  15126. blogspot.ro
  15127. blogspot.rs
  15128. blogspot.ru
  15129. blogspot.se
  15130. blogspot.sg
  15131. blogspot.si
  15132. blogspot.sk
  15133. blogspot.sn
  15134. blogspot.td
  15135. blogspot.tw
  15136. blogspot.ug
  15137. blogspot.vn
  15138. // Goupile : https://goupile.fr
  15139. // Submitted by Niels Martignene <hello@goupile.fr>
  15140. goupile.fr
  15141. // Government of the Netherlands: https://www.government.nl
  15142. // Submitted by <domeinnaam@minaz.nl>
  15143. gov.nl
  15144. // Group 53, LLC : https://www.group53.com
  15145. // Submitted by Tyler Todd <noc@nova53.net>
  15146. awsmppl.com
  15147. // GünstigBestellen : https://günstigbestellen.de
  15148. // Submitted by Furkan Akkoc <info@hendelzon.de>
  15149. günstigbestellen.de
  15150. günstigliefern.de
  15151. // Hakaran group: http://hakaran.cz
  15152. // Submitted by Arseniy Sokolov <security@hakaran.cz>
  15153. fin.ci
  15154. free.hr
  15155. caa.li
  15156. ua.rs
  15157. conf.se
  15158. // Handshake : https://handshake.org
  15159. // Submitted by Mike Damm <md@md.vc>
  15160. hs.zone
  15161. hs.run
  15162. // Hashbang : https://hashbang.sh
  15163. hashbang.sh
  15164. // Hasura : https://hasura.io
  15165. // Submitted by Shahidh K Muhammed <shahidh@hasura.io>
  15166. hasura.app
  15167. hasura-app.io
  15168. // Heilbronn University of Applied Sciences - Faculty Informatics (GitLab Pages): https://www.hs-heilbronn.de
  15169. // Submitted by Richard Zowalla <mi-admin@hs-heilbronn.de>
  15170. pages.it.hs-heilbronn.de
  15171. // Hepforge : https://www.hepforge.org
  15172. // Submitted by David Grellscheid <admin@hepforge.org>
  15173. hepforge.org
  15174. // Heroku : https://www.heroku.com/
  15175. // Submitted by Tom Maher <tmaher@heroku.com>
  15176. herokuapp.com
  15177. herokussl.com
  15178. // Hibernating Rhinos
  15179. // Submitted by Oren Eini <oren@ravendb.net>
  15180. ravendb.cloud
  15181. ravendb.community
  15182. ravendb.me
  15183. development.run
  15184. ravendb.run
  15185. // home.pl S.A.: https://home.pl
  15186. // Submitted by Krzysztof Wolski <krzysztof.wolski@home.eu>
  15187. homesklep.pl
  15188. // Hong Kong Productivity Council: https://www.hkpc.org/
  15189. // Submitted by SECaaS Team <summchan@hkpc.org>
  15190. secaas.hk
  15191. // Hoplix : https://www.hoplix.com
  15192. // Submitted by Danilo De Franco<info@hoplix.shop>
  15193. hoplix.shop
  15194. // HOSTBIP REGISTRY : https://www.hostbip.com/
  15195. // Submitted by Atanunu Igbunuroghene <publicsuffixlist@hostbip.com>
  15196. orx.biz
  15197. biz.gl
  15198. col.ng
  15199. firm.ng
  15200. gen.ng
  15201. ltd.ng
  15202. ngo.ng
  15203. edu.scot
  15204. sch.so
  15205. // HostFly : https://www.ie.ua
  15206. // Submitted by Bohdan Dub <support@hostfly.com.ua>
  15207. ie.ua
  15208. // HostyHosting (hostyhosting.com)
  15209. hostyhosting.io
  15210. // Häkkinen.fi
  15211. // Submitted by Eero Häkkinen <Eero+psl@Häkkinen.fi>
  15212. häkkinen.fi
  15213. // Ici la Lune : http://www.icilalune.com/
  15214. // Submitted by Simon Morvan <simon@icilalune.com>
  15215. *.moonscale.io
  15216. moonscale.net
  15217. // iki.fi
  15218. // Submitted by Hannu Aronsson <haa@iki.fi>
  15219. iki.fi
  15220. // iliad italia: https://www.iliad.it
  15221. // Submitted by Marios Makassikis <mmakassikis@freebox.fr>
  15222. ibxos.it
  15223. iliadboxos.it
  15224. // Impertrix Solutions : <https://impertrixcdn.com>
  15225. // Submitted by Zhixiang Zhao <csuite@impertrix.com>
  15226. impertrixcdn.com
  15227. impertrix.com
  15228. // Incsub, LLC: https://incsub.com/
  15229. // Submitted by Aaron Edwards <sysadmins@incsub.com>
  15230. smushcdn.com
  15231. wphostedmail.com
  15232. wpmucdn.com
  15233. tempurl.host
  15234. wpmudev.host
  15235. // Individual Network Berlin e.V. : https://www.in-berlin.de/
  15236. // Submitted by Christian Seitz <chris@in-berlin.de>
  15237. dyn-berlin.de
  15238. in-berlin.de
  15239. in-brb.de
  15240. in-butter.de
  15241. in-dsl.de
  15242. in-dsl.net
  15243. in-dsl.org
  15244. in-vpn.de
  15245. in-vpn.net
  15246. in-vpn.org
  15247. // info.at : http://www.info.at/
  15248. biz.at
  15249. info.at
  15250. // info.cx : http://info.cx
  15251. // Submitted by Jacob Slater <whois@igloo.to>
  15252. info.cx
  15253. // Interlegis : http://www.interlegis.leg.br
  15254. // Submitted by Gabriel Ferreira <registrobr@interlegis.leg.br>
  15255. ac.leg.br
  15256. al.leg.br
  15257. am.leg.br
  15258. ap.leg.br
  15259. ba.leg.br
  15260. ce.leg.br
  15261. df.leg.br
  15262. es.leg.br
  15263. go.leg.br
  15264. ma.leg.br
  15265. mg.leg.br
  15266. ms.leg.br
  15267. mt.leg.br
  15268. pa.leg.br
  15269. pb.leg.br
  15270. pe.leg.br
  15271. pi.leg.br
  15272. pr.leg.br
  15273. rj.leg.br
  15274. rn.leg.br
  15275. ro.leg.br
  15276. rr.leg.br
  15277. rs.leg.br
  15278. sc.leg.br
  15279. se.leg.br
  15280. sp.leg.br
  15281. to.leg.br
  15282. // intermetrics GmbH : https://pixolino.com/
  15283. // Submitted by Wolfgang Schwarz <admin@intermetrics.de>
  15284. pixolino.com
  15285. // Internet-Pro, LLP: https://netangels.ru/
  15286. // Submitted by Vasiliy Sheredeko <piphon@gmail.com>
  15287. na4u.ru
  15288. // iopsys software solutions AB : https://iopsys.eu/
  15289. // Submitted by Roman Azarenko <roman.azarenko@iopsys.eu>
  15290. iopsys.se
  15291. // IPiFony Systems, Inc. : https://www.ipifony.com/
  15292. // Submitted by Matthew Hardeman <mhardeman@ipifony.com>
  15293. ipifony.net
  15294. // IServ GmbH : https://iserv.de
  15295. // Submitted by Mario Hoberg <info@iserv.de>
  15296. iservschule.de
  15297. mein-iserv.de
  15298. schulplattform.de
  15299. schulserver.de
  15300. test-iserv.de
  15301. iserv.dev
  15302. // I-O DATA DEVICE, INC. : http://www.iodata.com/
  15303. // Submitted by Yuji Minagawa <domains-admin@iodata.jp>
  15304. iobb.net
  15305. // Jelastic, Inc. : https://jelastic.com/
  15306. // Submitted by Ihor Kolodyuk <ik@jelastic.com>
  15307. mel.cloudlets.com.au
  15308. cloud.interhostsolutions.be
  15309. mycloud.by
  15310. alp1.ae.flow.ch
  15311. appengine.flow.ch
  15312. es-1.axarnet.cloud
  15313. diadem.cloud
  15314. vip.jelastic.cloud
  15315. jele.cloud
  15316. it1.eur.aruba.jenv-aruba.cloud
  15317. it1.jenv-aruba.cloud
  15318. keliweb.cloud
  15319. cs.keliweb.cloud
  15320. oxa.cloud
  15321. tn.oxa.cloud
  15322. uk.oxa.cloud
  15323. primetel.cloud
  15324. uk.primetel.cloud
  15325. ca.reclaim.cloud
  15326. uk.reclaim.cloud
  15327. us.reclaim.cloud
  15328. ch.trendhosting.cloud
  15329. de.trendhosting.cloud
  15330. jele.club
  15331. amscompute.com
  15332. dopaas.com
  15333. paas.hosted-by-previder.com
  15334. rag-cloud.hosteur.com
  15335. rag-cloud-ch.hosteur.com
  15336. jcloud.ik-server.com
  15337. jcloud-ver-jpc.ik-server.com
  15338. demo.jelastic.com
  15339. kilatiron.com
  15340. paas.massivegrid.com
  15341. jed.wafaicloud.com
  15342. lon.wafaicloud.com
  15343. ryd.wafaicloud.com
  15344. j.scaleforce.com.cy
  15345. jelastic.dogado.eu
  15346. fi.cloudplatform.fi
  15347. demo.datacenter.fi
  15348. paas.datacenter.fi
  15349. jele.host
  15350. mircloud.host
  15351. paas.beebyte.io
  15352. sekd1.beebyteapp.io
  15353. jele.io
  15354. cloud-fr1.unispace.io
  15355. jc.neen.it
  15356. cloud.jelastic.open.tim.it
  15357. jcloud.kz
  15358. upaas.kazteleport.kz
  15359. cloudjiffy.net
  15360. fra1-de.cloudjiffy.net
  15361. west1-us.cloudjiffy.net
  15362. jls-sto1.elastx.net
  15363. jls-sto2.elastx.net
  15364. jls-sto3.elastx.net
  15365. faststacks.net
  15366. fr-1.paas.massivegrid.net
  15367. lon-1.paas.massivegrid.net
  15368. lon-2.paas.massivegrid.net
  15369. ny-1.paas.massivegrid.net
  15370. ny-2.paas.massivegrid.net
  15371. sg-1.paas.massivegrid.net
  15372. jelastic.saveincloud.net
  15373. nordeste-idc.saveincloud.net
  15374. j.scaleforce.net
  15375. jelastic.tsukaeru.net
  15376. sdscloud.pl
  15377. unicloud.pl
  15378. mircloud.ru
  15379. jelastic.regruhosting.ru
  15380. enscaled.sg
  15381. jele.site
  15382. jelastic.team
  15383. orangecloud.tn
  15384. j.layershift.co.uk
  15385. phx.enscaled.us
  15386. mircloud.us
  15387. // Jino : https://www.jino.ru
  15388. // Submitted by Sergey Ulyashin <ulyashin@jino.ru>
  15389. myjino.ru
  15390. *.hosting.myjino.ru
  15391. *.landing.myjino.ru
  15392. *.spectrum.myjino.ru
  15393. *.vps.myjino.ru
  15394. // Jotelulu S.L. : https://jotelulu.com
  15395. // Submitted by Daniel Fariña <ingenieria@jotelulu.com>
  15396. jotelulu.cloud
  15397. // Joyent : https://www.joyent.com/
  15398. // Submitted by Brian Bennett <brian.bennett@joyent.com>
  15399. *.triton.zone
  15400. *.cns.joyent.com
  15401. // JS.ORG : http://dns.js.org
  15402. // Submitted by Stefan Keim <admin@js.org>
  15403. js.org
  15404. // KaasHosting : http://www.kaashosting.nl/
  15405. // Submitted by Wouter Bakker <hostmaster@kaashosting.nl>
  15406. kaas.gg
  15407. khplay.nl
  15408. // Kakao : https://www.kakaocorp.com/
  15409. // Submitted by JaeYoong Lee <cec@kakaocorp.com>
  15410. ktistory.com
  15411. // Kapsi : https://kapsi.fi
  15412. // Submitted by Tomi Juntunen <erani@kapsi.fi>
  15413. kapsi.fi
  15414. // Keyweb AG : https://www.keyweb.de
  15415. // Submitted by Martin Dannehl <postmaster@keymachine.de>
  15416. keymachine.de
  15417. // KingHost : https://king.host
  15418. // Submitted by Felipe Keller Braz <felipebraz@kinghost.com.br>
  15419. kinghost.net
  15420. uni5.net
  15421. // KnightPoint Systems, LLC : http://www.knightpoint.com/
  15422. // Submitted by Roy Keene <rkeene@knightpoint.com>
  15423. knightpoint.systems
  15424. // KoobinEvent, SL: https://www.koobin.com
  15425. // Submitted by Iván Oliva <ivan.oliva@koobin.com>
  15426. koobin.events
  15427. // KUROKU LTD : https://kuroku.ltd/
  15428. // Submitted by DisposaBoy <security@oya.to>
  15429. oya.to
  15430. // Katholieke Universiteit Leuven: https://www.kuleuven.be
  15431. // Submitted by Abuse KU Leuven <abuse@kuleuven.be>
  15432. kuleuven.cloud
  15433. ezproxy.kuleuven.be
  15434. // .KRD : http://nic.krd/data/krd/Registration%20Policy.pdf
  15435. co.krd
  15436. edu.krd
  15437. // Krellian Ltd. : https://krellian.com
  15438. // Submitted by Ben Francis <ben@krellian.com>
  15439. krellian.net
  15440. webthings.io
  15441. // LCube - Professional hosting e.K. : https://www.lcube-webhosting.de
  15442. // Submitted by Lars Laehn <info@lcube.de>
  15443. git-repos.de
  15444. lcube-server.de
  15445. svn-repos.de
  15446. // Leadpages : https://www.leadpages.net
  15447. // Submitted by Greg Dallavalle <domains@leadpages.net>
  15448. leadpages.co
  15449. lpages.co
  15450. lpusercontent.com
  15451. // Lelux.fi : https://lelux.fi/
  15452. // Submitted by Lelux Admin <publisuffix@lelux.site>
  15453. lelux.site
  15454. // Lifetime Hosting : https://Lifetime.Hosting/
  15455. // Submitted by Mike Fillator <support@lifetime.hosting>
  15456. co.business
  15457. co.education
  15458. co.events
  15459. co.financial
  15460. co.network
  15461. co.place
  15462. co.technology
  15463. // Lightmaker Property Manager, Inc. : https://app.lmpm.com/
  15464. // Submitted by Greg Holland <greg.holland@lmpm.com>
  15465. app.lmpm.com
  15466. // linkyard ldt: https://www.linkyard.ch/
  15467. // Submitted by Mario Siegenthaler <mario.siegenthaler@linkyard.ch>
  15468. linkyard.cloud
  15469. linkyard-cloud.ch
  15470. // Linode : https://linode.com
  15471. // Submitted by <security@linode.com>
  15472. members.linode.com
  15473. *.nodebalancer.linode.com
  15474. *.linodeobjects.com
  15475. ip.linodeusercontent.com
  15476. // LiquidNet Ltd : http://www.liquidnetlimited.com/
  15477. // Submitted by Victor Velchev <admin@liquidnetlimited.com>
  15478. we.bs
  15479. // Localcert : https://localcert.dev
  15480. // Submitted by Lann Martin <security@localcert.dev>
  15481. *.user.localcert.dev
  15482. // localzone.xyz
  15483. // Submitted by Kenny Niehage <hello@yahe.sh>
  15484. localzone.xyz
  15485. // Log'in Line : https://www.loginline.com/
  15486. // Submitted by Rémi Mach <remi.mach@loginline.com>
  15487. loginline.app
  15488. loginline.dev
  15489. loginline.io
  15490. loginline.services
  15491. loginline.site
  15492. // Lokalized : https://lokalized.nl
  15493. // Submitted by Noah Taheij <noah@lokalized.nl>
  15494. servers.run
  15495. // Lõhmus Family, The
  15496. // Submitted by Heiki Lõhmus <hostmaster at lohmus dot me>
  15497. lohmus.me
  15498. // LubMAN UMCS Sp. z o.o : https://lubman.pl/
  15499. // Submitted by Ireneusz Maliszewski <ireneusz.maliszewski@lubman.pl>
  15500. krasnik.pl
  15501. leczna.pl
  15502. lubartow.pl
  15503. lublin.pl
  15504. poniatowa.pl
  15505. swidnik.pl
  15506. // Lug.org.uk : https://lug.org.uk
  15507. // Submitted by Jon Spriggs <admin@lug.org.uk>
  15508. glug.org.uk
  15509. lug.org.uk
  15510. lugs.org.uk
  15511. // Lukanet Ltd : https://lukanet.com
  15512. // Submitted by Anton Avramov <register@lukanet.com>
  15513. barsy.bg
  15514. barsy.co.uk
  15515. barsyonline.co.uk
  15516. barsycenter.com
  15517. barsyonline.com
  15518. barsy.club
  15519. barsy.de
  15520. barsy.eu
  15521. barsy.in
  15522. barsy.info
  15523. barsy.io
  15524. barsy.me
  15525. barsy.menu
  15526. barsy.mobi
  15527. barsy.net
  15528. barsy.online
  15529. barsy.org
  15530. barsy.pro
  15531. barsy.pub
  15532. barsy.ro
  15533. barsy.shop
  15534. barsy.site
  15535. barsy.support
  15536. barsy.uk
  15537. // Magento Commerce
  15538. // Submitted by Damien Tournoud <dtournoud@magento.cloud>
  15539. *.magentosite.cloud
  15540. // May First - People Link : https://mayfirst.org/
  15541. // Submitted by Jamie McClelland <info@mayfirst.org>
  15542. mayfirst.info
  15543. mayfirst.org
  15544. // Mail.Ru Group : https://hb.cldmail.ru
  15545. // Submitted by Ilya Zaretskiy <zaretskiy@corp.mail.ru>
  15546. hb.cldmail.ru
  15547. // Mail Transfer Platform : https://www.neupeer.com
  15548. // Submitted by Li Hui <lihui@neupeer.com>
  15549. cn.vu
  15550. // Maze Play: https://www.mazeplay.com
  15551. // Submitted by Adam Humpherys <adam@mws.dev>
  15552. mazeplay.com
  15553. // mcpe.me : https://mcpe.me
  15554. // Submitted by Noa Heyl <hi@noa.dev>
  15555. mcpe.me
  15556. // McHost : https://mchost.ru
  15557. // Submitted by Evgeniy Subbotin <e.subbotin@mchost.ru>
  15558. mcdir.me
  15559. mcdir.ru
  15560. mcpre.ru
  15561. vps.mcdir.ru
  15562. // Mediatech : https://mediatech.by
  15563. // Submitted by Evgeniy Kozhuhovskiy <ugenk@mediatech.by>
  15564. mediatech.by
  15565. mediatech.dev
  15566. // Medicom Health : https://medicomhealth.com
  15567. // Submitted by Michael Olson <molson@medicomhealth.com>
  15568. hra.health
  15569. // Memset hosting : https://www.memset.com
  15570. // Submitted by Tom Whitwell <domains@memset.com>
  15571. miniserver.com
  15572. memset.net
  15573. // Messerli Informatik AG : https://www.messerli.ch/
  15574. // Submitted by Ruben Schmidmeister <psl-maintainers@messerli.ch>
  15575. messerli.app
  15576. // MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/
  15577. // Submitted by Zdeněk Šustr <zdenek.sustr@cesnet.cz>
  15578. *.cloud.metacentrum.cz
  15579. custom.metacentrum.cz
  15580. // MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/
  15581. // Submitted by Radim Janča <janca@cesnet.cz>
  15582. flt.cloud.muni.cz
  15583. usr.cloud.muni.cz
  15584. // Meteor Development Group : https://www.meteor.com/hosting
  15585. // Submitted by Pierre Carrier <pierre@meteor.com>
  15586. meteorapp.com
  15587. eu.meteorapp.com
  15588. // Michau Enterprises Limited : http://www.co.pl/
  15589. co.pl
  15590. // Microsoft Corporation : http://microsoft.com
  15591. // Submitted by Public Suffix List Admin <msftpsladmin@microsoft.com>
  15592. *.azurecontainer.io
  15593. azurewebsites.net
  15594. azure-mobile.net
  15595. cloudapp.net
  15596. azurestaticapps.net
  15597. 1.azurestaticapps.net
  15598. 2.azurestaticapps.net
  15599. 3.azurestaticapps.net
  15600. centralus.azurestaticapps.net
  15601. eastasia.azurestaticapps.net
  15602. eastus2.azurestaticapps.net
  15603. westeurope.azurestaticapps.net
  15604. westus2.azurestaticapps.net
  15605. // minion.systems : http://minion.systems
  15606. // Submitted by Robert Böttinger <r@minion.systems>
  15607. csx.cc
  15608. // Mintere : https://mintere.com/
  15609. // Submitted by Ben Aubin <security@mintere.com>
  15610. mintere.site
  15611. // MobileEducation, LLC : https://joinforte.com
  15612. // Submitted by Grayson Martin <grayson.martin@mobileeducation.us>
  15613. forte.id
  15614. // Mozilla Corporation : https://mozilla.com
  15615. // Submitted by Ben Francis <bfrancis@mozilla.com>
  15616. mozilla-iot.org
  15617. // Mozilla Foundation : https://mozilla.org/
  15618. // Submitted by glob <glob@mozilla.com>
  15619. bmoattachments.org
  15620. // MSK-IX : https://www.msk-ix.ru/
  15621. // Submitted by Khannanov Roman <r.khannanov@msk-ix.ru>
  15622. net.ru
  15623. org.ru
  15624. pp.ru
  15625. // Mythic Beasts : https://www.mythic-beasts.com
  15626. // Submitted by Paul Cammish <kelduum@mythic-beasts.com>
  15627. hostedpi.com
  15628. customer.mythic-beasts.com
  15629. caracal.mythic-beasts.com
  15630. fentiger.mythic-beasts.com
  15631. lynx.mythic-beasts.com
  15632. ocelot.mythic-beasts.com
  15633. oncilla.mythic-beasts.com
  15634. onza.mythic-beasts.com
  15635. sphinx.mythic-beasts.com
  15636. vs.mythic-beasts.com
  15637. x.mythic-beasts.com
  15638. yali.mythic-beasts.com
  15639. cust.retrosnub.co.uk
  15640. // Nabu Casa : https://www.nabucasa.com
  15641. // Submitted by Paulus Schoutsen <infra@nabucasa.com>
  15642. ui.nabu.casa
  15643. // Net at Work Gmbh : https://www.netatwork.de
  15644. // Submitted by Jan Jaeschke <jan.jaeschke@netatwork.de>
  15645. cloud.nospamproxy.com
  15646. // Netlify : https://www.netlify.com
  15647. // Submitted by Jessica Parsons <jessica@netlify.com>
  15648. netlify.app
  15649. // Neustar Inc.
  15650. // Submitted by Trung Tran <Trung.Tran@neustar.biz>
  15651. 4u.com
  15652. // ngrok : https://ngrok.com/
  15653. // Submitted by Alan Shreve <alan@ngrok.com>
  15654. ngrok.app
  15655. ngrok-free.app
  15656. ngrok.dev
  15657. ngrok-free.dev
  15658. ngrok.io
  15659. ap.ngrok.io
  15660. au.ngrok.io
  15661. eu.ngrok.io
  15662. in.ngrok.io
  15663. jp.ngrok.io
  15664. sa.ngrok.io
  15665. us.ngrok.io
  15666. ngrok.pizza
  15667. // Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/
  15668. // Submitted by Nicholas Ford <nick@nimbushosting.co.uk>
  15669. nh-serv.co.uk
  15670. // NFSN, Inc. : https://www.NearlyFreeSpeech.NET/
  15671. // Submitted by Jeff Wheelhouse <support@nearlyfreespeech.net>
  15672. nfshost.com
  15673. // Noop : https://noop.app
  15674. // Submitted by Nathaniel Schweinberg <noop@rearc.io>
  15675. *.developer.app
  15676. noop.app
  15677. // Northflank Ltd. : https://northflank.com/
  15678. // Submitted by Marco Suter <marco@northflank.com>
  15679. *.northflank.app
  15680. *.build.run
  15681. *.code.run
  15682. *.database.run
  15683. *.migration.run
  15684. // Noticeable : https://noticeable.io
  15685. // Submitted by Laurent Pellegrino <security@noticeable.io>
  15686. noticeable.news
  15687. // Now-DNS : https://now-dns.com
  15688. // Submitted by Steve Russell <steve@now-dns.com>
  15689. dnsking.ch
  15690. mypi.co
  15691. n4t.co
  15692. 001www.com
  15693. ddnslive.com
  15694. myiphost.com
  15695. forumz.info
  15696. 16-b.it
  15697. 32-b.it
  15698. 64-b.it
  15699. soundcast.me
  15700. tcp4.me
  15701. dnsup.net
  15702. hicam.net
  15703. now-dns.net
  15704. ownip.net
  15705. vpndns.net
  15706. dynserv.org
  15707. now-dns.org
  15708. x443.pw
  15709. now-dns.top
  15710. ntdll.top
  15711. freeddns.us
  15712. crafting.xyz
  15713. zapto.xyz
  15714. // nsupdate.info : https://www.nsupdate.info/
  15715. // Submitted by Thomas Waldmann <info@nsupdate.info>
  15716. nsupdate.info
  15717. nerdpol.ovh
  15718. // No-IP.com : https://noip.com/
  15719. // Submitted by Deven Reza <publicsuffixlist@noip.com>
  15720. blogsyte.com
  15721. brasilia.me
  15722. cable-modem.org
  15723. ciscofreak.com
  15724. collegefan.org
  15725. couchpotatofries.org
  15726. damnserver.com
  15727. ddns.me
  15728. ditchyourip.com
  15729. dnsfor.me
  15730. dnsiskinky.com
  15731. dvrcam.info
  15732. dynns.com
  15733. eating-organic.net
  15734. fantasyleague.cc
  15735. geekgalaxy.com
  15736. golffan.us
  15737. health-carereform.com
  15738. homesecuritymac.com
  15739. homesecuritypc.com
  15740. hopto.me
  15741. ilovecollege.info
  15742. loginto.me
  15743. mlbfan.org
  15744. mmafan.biz
  15745. myactivedirectory.com
  15746. mydissent.net
  15747. myeffect.net
  15748. mymediapc.net
  15749. mypsx.net
  15750. mysecuritycamera.com
  15751. mysecuritycamera.net
  15752. mysecuritycamera.org
  15753. net-freaks.com
  15754. nflfan.org
  15755. nhlfan.net
  15756. no-ip.ca
  15757. no-ip.co.uk
  15758. no-ip.net
  15759. noip.us
  15760. onthewifi.com
  15761. pgafan.net
  15762. point2this.com
  15763. pointto.us
  15764. privatizehealthinsurance.net
  15765. quicksytes.com
  15766. read-books.org
  15767. securitytactics.com
  15768. serveexchange.com
  15769. servehumour.com
  15770. servep2p.com
  15771. servesarcasm.com
  15772. stufftoread.com
  15773. ufcfan.org
  15774. unusualperson.com
  15775. workisboring.com
  15776. 3utilities.com
  15777. bounceme.net
  15778. ddns.net
  15779. ddnsking.com
  15780. gotdns.ch
  15781. hopto.org
  15782. myftp.biz
  15783. myftp.org
  15784. myvnc.com
  15785. no-ip.biz
  15786. no-ip.info
  15787. no-ip.org
  15788. noip.me
  15789. redirectme.net
  15790. servebeer.com
  15791. serveblog.net
  15792. servecounterstrike.com
  15793. serveftp.com
  15794. servegame.com
  15795. servehalflife.com
  15796. servehttp.com
  15797. serveirc.com
  15798. serveminecraft.net
  15799. servemp3.com
  15800. servepics.com
  15801. servequake.com
  15802. sytes.net
  15803. webhop.me
  15804. zapto.org
  15805. // NodeArt : https://nodeart.io
  15806. // Submitted by Konstantin Nosov <Nosov@nodeart.io>
  15807. stage.nodeart.io
  15808. // Nucleos Inc. : https://nucleos.com
  15809. // Submitted by Piotr Zduniak <piotr@nucleos.com>
  15810. pcloud.host
  15811. // NYC.mn : http://www.information.nyc.mn
  15812. // Submitted by Matthew Brown <mattbrown@nyc.mn>
  15813. nyc.mn
  15814. // Observable, Inc. : https://observablehq.com
  15815. // Submitted by Mike Bostock <dns@observablehq.com>
  15816. static.observableusercontent.com
  15817. // Octopodal Solutions, LLC. : https://ulterius.io/
  15818. // Submitted by Andrew Sampson <andrew@ulterius.io>
  15819. cya.gg
  15820. // OMG.LOL : <https://omg.lol>
  15821. // Submitted by Adam Newbold <adam@omg.lol>
  15822. omg.lol
  15823. // Omnibond Systems, LLC. : https://www.omnibond.com
  15824. // Submitted by Cole Estep <cole@omnibond.com>
  15825. cloudycluster.net
  15826. // OmniWe Limited: https://omniwe.com
  15827. // Submitted by Vicary Archangel <vicary@omniwe.com>
  15828. omniwe.site
  15829. // One.com: https://www.one.com/
  15830. // Submitted by Jacob Bunk Nielsen <jbn@one.com>
  15831. 123hjemmeside.dk
  15832. 123hjemmeside.no
  15833. 123homepage.it
  15834. 123kotisivu.fi
  15835. 123minsida.se
  15836. 123miweb.es
  15837. 123paginaweb.pt
  15838. 123sait.ru
  15839. 123siteweb.fr
  15840. 123webseite.at
  15841. 123webseite.de
  15842. 123website.be
  15843. 123website.ch
  15844. 123website.lu
  15845. 123website.nl
  15846. service.one
  15847. simplesite.com
  15848. simplesite.com.br
  15849. simplesite.gr
  15850. simplesite.pl
  15851. // One Fold Media : http://www.onefoldmedia.com/
  15852. // Submitted by Eddie Jones <eddie@onefoldmedia.com>
  15853. nid.io
  15854. // Open Social : https://www.getopensocial.com/
  15855. // Submitted by Alexander Varwijk <security@getopensocial.com>
  15856. opensocial.site
  15857. // OpenCraft GmbH : http://opencraft.com/
  15858. // Submitted by Sven Marnach <sven@opencraft.com>
  15859. opencraft.hosting
  15860. // OpenResearch GmbH: https://openresearch.com/
  15861. // Submitted by Philipp Schmid <ops@openresearch.com>
  15862. orsites.com
  15863. // Opera Software, A.S.A.
  15864. // Submitted by Yngve Pettersen <yngve@opera.com>
  15865. operaunite.com
  15866. // Orange : https://www.orange.com
  15867. // Submitted by Alexandre Linte <alexandre.linte@orange.com>
  15868. tech.orange
  15869. // Oursky Limited : https://authgear.com/, https://skygear.io/
  15870. // Submitted by Authgear Team <hello@authgear.com>, Skygear Developer <hello@skygear.io>
  15871. authgear-staging.com
  15872. authgearapps.com
  15873. skygearapp.com
  15874. // OutSystems
  15875. // Submitted by Duarte Santos <domain-admin@outsystemscloud.com>
  15876. outsystemscloud.com
  15877. // OVHcloud: https://ovhcloud.com
  15878. // Submitted by Vincent Cassé <vincent.casse@ovhcloud.com>
  15879. *.webpaas.ovh.net
  15880. *.hosting.ovh.net
  15881. // OwnProvider GmbH: http://www.ownprovider.com
  15882. // Submitted by Jan Moennich <jan.moennich@ownprovider.com>
  15883. ownprovider.com
  15884. own.pm
  15885. // OwO : https://whats-th.is/
  15886. // Submitted by Dean Sheather <dean@deansheather.com>
  15887. *.owo.codes
  15888. // OX : http://www.ox.rs
  15889. // Submitted by Adam Grand <webmaster@mail.ox.rs>
  15890. ox.rs
  15891. // oy.lc
  15892. // Submitted by Charly Coste <changaco@changaco.oy.lc>
  15893. oy.lc
  15894. // Pagefog : https://pagefog.com/
  15895. // Submitted by Derek Myers <derek@pagefog.com>
  15896. pgfog.com
  15897. // Pagefront : https://www.pagefronthq.com/
  15898. // Submitted by Jason Kriss <jason@pagefronthq.com>
  15899. pagefrontapp.com
  15900. // PageXL : https://pagexl.com
  15901. // Submitted by Yann Guichard <yann@pagexl.com>
  15902. pagexl.com
  15903. // Paywhirl, Inc : https://paywhirl.com/
  15904. // Submitted by Daniel Netzer <dan@paywhirl.com>
  15905. *.paywhirl.com
  15906. // pcarrier.ca Software Inc: https://pcarrier.ca/
  15907. // Submitted by Pierre Carrier <pc@rrier.ca>
  15908. bar0.net
  15909. bar1.net
  15910. bar2.net
  15911. rdv.to
  15912. // .pl domains (grandfathered)
  15913. art.pl
  15914. gliwice.pl
  15915. krakow.pl
  15916. poznan.pl
  15917. wroc.pl
  15918. zakopane.pl
  15919. // Pantheon Systems, Inc. : https://pantheon.io/
  15920. // Submitted by Gary Dylina <gary@pantheon.io>
  15921. pantheonsite.io
  15922. gotpantheon.com
  15923. // Peplink | Pepwave : http://peplink.com/
  15924. // Submitted by Steve Leung <steveleung@peplink.com>
  15925. mypep.link
  15926. // Perspecta : https://perspecta.com/
  15927. // Submitted by Kenneth Van Alstyne <kvanalstyne@perspecta.com>
  15928. perspecta.cloud
  15929. // PE Ulyanov Kirill Sergeevich : https://airy.host
  15930. // Submitted by Kirill Ulyanov <k.ulyanov@airy.host>
  15931. lk3.ru
  15932. // Planet-Work : https://www.planet-work.com/
  15933. // Submitted by Frédéric VANNIÈRE <f.vanniere@planet-work.com>
  15934. on-web.fr
  15935. // Platform.sh : https://platform.sh
  15936. // Submitted by Nikola Kotur <nikola@platform.sh>
  15937. bc.platform.sh
  15938. ent.platform.sh
  15939. eu.platform.sh
  15940. us.platform.sh
  15941. *.platformsh.site
  15942. *.tst.site
  15943. // Platter: https://platter.dev
  15944. // Submitted by Patrick Flor <patrick@platter.dev>
  15945. platter-app.com
  15946. platter-app.dev
  15947. platterp.us
  15948. // Plesk : https://www.plesk.com/
  15949. // Submitted by Anton Akhtyamov <program-managers@plesk.com>
  15950. pdns.page
  15951. plesk.page
  15952. pleskns.com
  15953. // Port53 : https://port53.io/
  15954. // Submitted by Maximilian Schieder <maxi@zeug.co>
  15955. dyn53.io
  15956. // Porter : https://porter.run/
  15957. // Submitted by Rudraksh MK <rudi@porter.run>
  15958. onporter.run
  15959. // Positive Codes Technology Company : http://co.bn/faq.html
  15960. // Submitted by Zulfais <pc@co.bn>
  15961. co.bn
  15962. // Postman, Inc : https://postman.com
  15963. // Submitted by Rahul Dhawan <security@postman.com>
  15964. postman-echo.com
  15965. pstmn.io
  15966. mock.pstmn.io
  15967. httpbin.org
  15968. //prequalifyme.today : https://prequalifyme.today
  15969. //Submitted by DeepakTiwari deepak@ivylead.io
  15970. prequalifyme.today
  15971. // prgmr.com : https://prgmr.com/
  15972. // Submitted by Sarah Newman <owner@prgmr.com>
  15973. xen.prgmr.com
  15974. // priv.at : http://www.nic.priv.at/
  15975. // Submitted by registry <lendl@nic.at>
  15976. priv.at
  15977. // privacytools.io : https://www.privacytools.io/
  15978. // Submitted by Jonah Aragon <jonah@privacytools.io>
  15979. prvcy.page
  15980. // Protocol Labs : https://protocol.ai/
  15981. // Submitted by Michael Burns <noc@protocol.ai>
  15982. *.dweb.link
  15983. // Protonet GmbH : http://protonet.io
  15984. // Submitted by Martin Meier <admin@protonet.io>
  15985. protonet.io
  15986. // Publication Presse Communication SARL : https://ppcom.fr
  15987. // Submitted by Yaacov Akiba Slama <admin@chirurgiens-dentistes-en-france.fr>
  15988. chirurgiens-dentistes-en-france.fr
  15989. byen.site
  15990. // pubtls.org: https://www.pubtls.org
  15991. // Submitted by Kor Nielsen <kor@pubtls.org>
  15992. pubtls.org
  15993. // PythonAnywhere LLP: https://www.pythonanywhere.com
  15994. // Submitted by Giles Thomas <giles@pythonanywhere.com>
  15995. pythonanywhere.com
  15996. eu.pythonanywhere.com
  15997. // QOTO, Org.
  15998. // Submitted by Jeffrey Phillips Freeman <jeffrey.freeman@qoto.org>
  15999. qoto.io
  16000. // Qualifio : https://qualifio.com/
  16001. // Submitted by Xavier De Cock <xdecock@gmail.com>
  16002. qualifioapp.com
  16003. // Quality Unit: https://qualityunit.com
  16004. // Submitted by Vasyl Tsalko <vtsalko@qualityunit.com>
  16005. ladesk.com
  16006. // QuickBackend: https://www.quickbackend.com
  16007. // Submitted by Dani Biro <dani@pymet.com>
  16008. qbuser.com
  16009. // Rad Web Hosting: https://radwebhosting.com
  16010. // Submitted by Scott Claeys <s.claeys@radwebhosting.com>
  16011. cloudsite.builders
  16012. // Redgate Software: https://red-gate.com
  16013. // Submitted by Andrew Farries <andrew.farries@red-gate.com>
  16014. instances.spawn.cc
  16015. // Redstar Consultants : https://www.redstarconsultants.com/
  16016. // Submitted by Jons Slemmer <jons@redstarconsultants.com>
  16017. instantcloud.cn
  16018. // Russian Academy of Sciences
  16019. // Submitted by Tech Support <support@rasnet.ru>
  16020. ras.ru
  16021. // QA2
  16022. // Submitted by Daniel Dent (https://www.danieldent.com/)
  16023. qa2.com
  16024. // QCX
  16025. // Submitted by Cassandra Beelen <cassandra@beelen.one>
  16026. qcx.io
  16027. *.sys.qcx.io
  16028. // QNAP System Inc : https://www.qnap.com
  16029. // Submitted by Nick Chang <nickchang@qnap.com>
  16030. dev-myqnapcloud.com
  16031. alpha-myqnapcloud.com
  16032. myqnapcloud.com
  16033. // Quip : https://quip.com
  16034. // Submitted by Patrick Linehan <plinehan@quip.com>
  16035. *.quipelements.com
  16036. // Qutheory LLC : http://qutheory.io
  16037. // Submitted by Jonas Schwartz <jonas@qutheory.io>
  16038. vapor.cloud
  16039. vaporcloud.io
  16040. // Rackmaze LLC : https://www.rackmaze.com
  16041. // Submitted by Kirill Pertsev <kika@rackmaze.com>
  16042. rackmaze.com
  16043. rackmaze.net
  16044. // Rakuten Games, Inc : https://dev.viberplay.io
  16045. // Submitted by Joshua Zhang <public-suffix@rgames.jp>
  16046. g.vbrplsbx.io
  16047. // Rancher Labs, Inc : https://rancher.com
  16048. // Submitted by Vincent Fiduccia <domains@rancher.com>
  16049. *.on-k3s.io
  16050. *.on-rancher.cloud
  16051. *.on-rio.io
  16052. // Read The Docs, Inc : https://www.readthedocs.org
  16053. // Submitted by David Fischer <team@readthedocs.org>
  16054. readthedocs.io
  16055. // Red Hat, Inc. OpenShift : https://openshift.redhat.com/
  16056. // Submitted by Tim Kramer <tkramer@rhcloud.com>
  16057. rhcloud.com
  16058. // Render : https://render.com
  16059. // Submitted by Anurag Goel <dev@render.com>
  16060. app.render.com
  16061. onrender.com
  16062. // Repl.it : https://repl.it
  16063. // Submitted by Lincoln Bergeson <lincoln@replit.com>
  16064. firewalledreplit.co
  16065. id.firewalledreplit.co
  16066. repl.co
  16067. id.repl.co
  16068. repl.run
  16069. // Resin.io : https://resin.io
  16070. // Submitted by Tim Perry <tim@resin.io>
  16071. resindevice.io
  16072. devices.resinstaging.io
  16073. // RethinkDB : https://www.rethinkdb.com/
  16074. // Submitted by Chris Kastorff <info@rethinkdb.com>
  16075. hzc.io
  16076. // Revitalised Limited : http://www.revitalised.co.uk
  16077. // Submitted by Jack Price <jack@revitalised.co.uk>
  16078. wellbeingzone.eu
  16079. wellbeingzone.co.uk
  16080. // Rico Developments Limited : https://adimo.co
  16081. // Submitted by Colin Brown <hello@adimo.co>
  16082. adimo.co.uk
  16083. // Riseup Networks : https://riseup.net
  16084. // Submitted by Micah Anderson <micah@riseup.net>
  16085. itcouldbewor.se
  16086. // Rochester Institute of Technology : http://www.rit.edu/
  16087. // Submitted by Jennifer Herting <jchits@rit.edu>
  16088. git-pages.rit.edu
  16089. // Rocky Enterprise Software Foundation : https://resf.org
  16090. // Submitted by Neil Hanlon <neil@resf.org>
  16091. rocky.page
  16092. // Rusnames Limited: http://rusnames.ru/
  16093. // Submitted by Sergey Zotov <admin@rusnames.ru>
  16094. биз.рус
  16095. ком.рус
  16096. крым.рус
  16097. мир.рус
  16098. мск.рус
  16099. орг.рус
  16100. самара.рус
  16101. сочи.рус
  16102. спб.рус
  16103. я.рус
  16104. // SAKURA Internet Inc. : https://www.sakura.ad.jp/
  16105. // Submitted by Internet Service Department <rs-vendor-ml@sakura.ad.jp>
  16106. 180r.com
  16107. dojin.com
  16108. sakuratan.com
  16109. sakuraweb.com
  16110. x0.com
  16111. 2-d.jp
  16112. bona.jp
  16113. crap.jp
  16114. daynight.jp
  16115. eek.jp
  16116. flop.jp
  16117. halfmoon.jp
  16118. jeez.jp
  16119. matrix.jp
  16120. mimoza.jp
  16121. ivory.ne.jp
  16122. mail-box.ne.jp
  16123. mints.ne.jp
  16124. mokuren.ne.jp
  16125. opal.ne.jp
  16126. sakura.ne.jp
  16127. sumomo.ne.jp
  16128. topaz.ne.jp
  16129. netgamers.jp
  16130. nyanta.jp
  16131. o0o0.jp
  16132. rdy.jp
  16133. rgr.jp
  16134. rulez.jp
  16135. s3.isk01.sakurastorage.jp
  16136. s3.isk02.sakurastorage.jp
  16137. saloon.jp
  16138. sblo.jp
  16139. skr.jp
  16140. tank.jp
  16141. uh-oh.jp
  16142. undo.jp
  16143. rs.webaccel.jp
  16144. user.webaccel.jp
  16145. websozai.jp
  16146. xii.jp
  16147. squares.net
  16148. jpn.org
  16149. kirara.st
  16150. x0.to
  16151. from.tv
  16152. sakura.tv
  16153. // Salesforce.com, Inc. https://salesforce.com/
  16154. // Submitted by Michael Biven <mbiven@salesforce.com>
  16155. *.builder.code.com
  16156. *.dev-builder.code.com
  16157. *.stg-builder.code.com
  16158. // Sandstorm Development Group, Inc. : https://sandcats.io/
  16159. // Submitted by Asheesh Laroia <asheesh@sandstorm.io>
  16160. sandcats.io
  16161. // SBE network solutions GmbH : https://www.sbe.de/
  16162. // Submitted by Norman Meilick <nm@sbe.de>
  16163. logoip.de
  16164. logoip.com
  16165. // Scaleway : https://www.scaleway.com/
  16166. // Submitted by Rémy Léone <rleone@scaleway.com>
  16167. fr-par-1.baremetal.scw.cloud
  16168. fr-par-2.baremetal.scw.cloud
  16169. nl-ams-1.baremetal.scw.cloud
  16170. fnc.fr-par.scw.cloud
  16171. functions.fnc.fr-par.scw.cloud
  16172. k8s.fr-par.scw.cloud
  16173. nodes.k8s.fr-par.scw.cloud
  16174. s3.fr-par.scw.cloud
  16175. s3-website.fr-par.scw.cloud
  16176. whm.fr-par.scw.cloud
  16177. priv.instances.scw.cloud
  16178. pub.instances.scw.cloud
  16179. k8s.scw.cloud
  16180. k8s.nl-ams.scw.cloud
  16181. nodes.k8s.nl-ams.scw.cloud
  16182. s3.nl-ams.scw.cloud
  16183. s3-website.nl-ams.scw.cloud
  16184. whm.nl-ams.scw.cloud
  16185. k8s.pl-waw.scw.cloud
  16186. nodes.k8s.pl-waw.scw.cloud
  16187. s3.pl-waw.scw.cloud
  16188. s3-website.pl-waw.scw.cloud
  16189. scalebook.scw.cloud
  16190. smartlabeling.scw.cloud
  16191. dedibox.fr
  16192. // schokokeks.org GbR : https://schokokeks.org/
  16193. // Submitted by Hanno Böck <hanno@schokokeks.org>
  16194. schokokeks.net
  16195. // Scottish Government: https://www.gov.scot
  16196. // Submitted by Martin Ellis <martin.ellis@gov.scot>
  16197. gov.scot
  16198. service.gov.scot
  16199. // Scry Security : http://www.scrysec.com
  16200. // Submitted by Shante Adam <shante@skyhat.io>
  16201. scrysec.com
  16202. // Securepoint GmbH : https://www.securepoint.de
  16203. // Submitted by Erik Anders <erik.anders@securepoint.de>
  16204. firewall-gateway.com
  16205. firewall-gateway.de
  16206. my-gateway.de
  16207. my-router.de
  16208. spdns.de
  16209. spdns.eu
  16210. firewall-gateway.net
  16211. my-firewall.org
  16212. myfirewall.org
  16213. spdns.org
  16214. // Seidat : https://www.seidat.com
  16215. // Submitted by Artem Kondratev <accounts@seidat.com>
  16216. seidat.net
  16217. // Sellfy : https://sellfy.com
  16218. // Submitted by Yuriy Romadin <contact@sellfy.com>
  16219. sellfy.store
  16220. // Senseering GmbH : https://www.senseering.de
  16221. // Submitted by Felix Mönckemeyer <f.moenckemeyer@senseering.de>
  16222. senseering.net
  16223. // Sendmsg: https://www.sendmsg.co.il
  16224. // Submitted by Assaf Stern <domains@comstar.co.il>
  16225. minisite.ms
  16226. // Service Magnet : https://myservicemagnet.com
  16227. // Submitted by Dave Sanders <dave@myservicemagnet.com>
  16228. magnet.page
  16229. // Service Online LLC : http://drs.ua/
  16230. // Submitted by Serhii Bulakh <support@drs.ua>
  16231. biz.ua
  16232. co.ua
  16233. pp.ua
  16234. // Shift Crypto AG : https://shiftcrypto.ch
  16235. // Submitted by alex <alex@shiftcrypto.ch>
  16236. shiftcrypto.dev
  16237. shiftcrypto.io
  16238. // ShiftEdit : https://shiftedit.net/
  16239. // Submitted by Adam Jimenez <adam@shiftcreate.com>
  16240. shiftedit.io
  16241. // Shopblocks : http://www.shopblocks.com/
  16242. // Submitted by Alex Bowers <alex@shopblocks.com>
  16243. myshopblocks.com
  16244. // Shopify : https://www.shopify.com
  16245. // Submitted by Alex Richter <alex.richter@shopify.com>
  16246. myshopify.com
  16247. // Shopit : https://www.shopitcommerce.com/
  16248. // Submitted by Craig McMahon <craig@shopitcommerce.com>
  16249. shopitsite.com
  16250. // shopware AG : https://shopware.com
  16251. // Submitted by Jens Küper <cloud@shopware.com>
  16252. shopware.store
  16253. // Siemens Mobility GmbH
  16254. // Submitted by Oliver Graebner <security@mo-siemens.io>
  16255. mo-siemens.io
  16256. // SinaAppEngine : http://sae.sina.com.cn/
  16257. // Submitted by SinaAppEngine <saesupport@sinacloud.com>
  16258. 1kapp.com
  16259. appchizi.com
  16260. applinzi.com
  16261. sinaapp.com
  16262. vipsinaapp.com
  16263. // Siteleaf : https://www.siteleaf.com/
  16264. // Submitted by Skylar Challand <support@siteleaf.com>
  16265. siteleaf.net
  16266. // Skyhat : http://www.skyhat.io
  16267. // Submitted by Shante Adam <shante@skyhat.io>
  16268. bounty-full.com
  16269. alpha.bounty-full.com
  16270. beta.bounty-full.com
  16271. // Smallregistry by Promopixel SARL: https://www.smallregistry.net
  16272. // Former AFNIC's SLDs
  16273. // Submitted by Jérôme Lipowicz <support@promopixel.com>
  16274. aeroport.fr
  16275. avocat.fr
  16276. chambagri.fr
  16277. chirurgiens-dentistes.fr
  16278. experts-comptables.fr
  16279. medecin.fr
  16280. notaires.fr
  16281. pharmacien.fr
  16282. port.fr
  16283. veterinaire.fr
  16284. // Small Technology Foundation : https://small-tech.org
  16285. // Submitted by Aral Balkan <aral@small-tech.org>
  16286. small-web.org
  16287. // Smoove.io : https://www.smoove.io/
  16288. // Submitted by Dan Kozak <dan@smoove.io>
  16289. vp4.me
  16290. // Snowflake Inc : https://www.snowflake.com/
  16291. // Submitted by Faith Olapade <faith.olapade@snowflake.com>
  16292. snowflake.app
  16293. privatelink.snowflake.app
  16294. streamlit.app
  16295. streamlitapp.com
  16296. // Snowplow Analytics : https://snowplowanalytics.com/
  16297. // Submitted by Ian Streeter <ian@snowplowanalytics.com>
  16298. try-snowplow.com
  16299. // SourceHut : https://sourcehut.org
  16300. // Submitted by Drew DeVault <sir@cmpwn.com>
  16301. srht.site
  16302. // Stackhero : https://www.stackhero.io
  16303. // Submitted by Adrien Gillon <adrien+public-suffix-list@stackhero.io>
  16304. stackhero-network.com
  16305. // Staclar : https://staclar.com
  16306. // Submitted by Q Misell <q@staclar.com>
  16307. musician.io
  16308. // Submitted by Matthias Merkel <matthias.merkel@staclar.com>
  16309. novecore.site
  16310. // staticland : https://static.land
  16311. // Submitted by Seth Vincent <sethvincent@gmail.com>
  16312. static.land
  16313. dev.static.land
  16314. sites.static.land
  16315. // Storebase : https://www.storebase.io
  16316. // Submitted by Tony Schirmer <tony@storebase.io>
  16317. storebase.store
  16318. // Strategic System Consulting (eApps Hosting): https://www.eapps.com/
  16319. // Submitted by Alex Oancea <aoancea@cloudscale365.com>
  16320. vps-host.net
  16321. atl.jelastic.vps-host.net
  16322. njs.jelastic.vps-host.net
  16323. ric.jelastic.vps-host.net
  16324. // Sony Interactive Entertainment LLC : https://sie.com/
  16325. // Submitted by David Coles <david.coles@sony.com>
  16326. playstation-cloud.com
  16327. // SourceLair PC : https://www.sourcelair.com
  16328. // Submitted by Antonis Kalipetis <akalipetis@sourcelair.com>
  16329. apps.lair.io
  16330. *.stolos.io
  16331. // SpaceKit : https://www.spacekit.io/
  16332. // Submitted by Reza Akhavan <spacekit.io@gmail.com>
  16333. spacekit.io
  16334. // SpeedPartner GmbH: https://www.speedpartner.de/
  16335. // Submitted by Stefan Neufeind <info@speedpartner.de>
  16336. customer.speedpartner.de
  16337. // Spreadshop (sprd.net AG) : https://www.spreadshop.com/
  16338. // Submitted by Martin Breest <security@spreadshop.com>
  16339. myspreadshop.at
  16340. myspreadshop.com.au
  16341. myspreadshop.be
  16342. myspreadshop.ca
  16343. myspreadshop.ch
  16344. myspreadshop.com
  16345. myspreadshop.de
  16346. myspreadshop.dk
  16347. myspreadshop.es
  16348. myspreadshop.fi
  16349. myspreadshop.fr
  16350. myspreadshop.ie
  16351. myspreadshop.it
  16352. myspreadshop.net
  16353. myspreadshop.nl
  16354. myspreadshop.no
  16355. myspreadshop.pl
  16356. myspreadshop.se
  16357. myspreadshop.co.uk
  16358. // Standard Library : https://stdlib.com
  16359. // Submitted by Jacob Lee <jacob@stdlib.com>
  16360. api.stdlib.com
  16361. // Storipress : https://storipress.com
  16362. // Submitted by Benno Liu <benno@storipress.com>
  16363. storipress.app
  16364. // Storj Labs Inc. : https://storj.io/
  16365. // Submitted by Philip Hutchins <hostmaster@storj.io>
  16366. storj.farm
  16367. // Studenten Net Twente : http://www.snt.utwente.nl/
  16368. // Submitted by Silke Hofstra <syscom@snt.utwente.nl>
  16369. utwente.io
  16370. // Student-Run Computing Facility : https://www.srcf.net/
  16371. // Submitted by Edwin Balani <sysadmins@srcf.net>
  16372. soc.srcf.net
  16373. user.srcf.net
  16374. // Sub 6 Limited: http://www.sub6.com
  16375. // Submitted by Dan Miller <dm@sub6.com>
  16376. temp-dns.com
  16377. // Supabase : https://supabase.io
  16378. // Submitted by Inian Parameshwaran <security@supabase.io>
  16379. supabase.co
  16380. supabase.in
  16381. supabase.net
  16382. su.paba.se
  16383. // Symfony, SAS : https://symfony.com/
  16384. // Submitted by Fabien Potencier <fabien@symfony.com>
  16385. *.s5y.io
  16386. *.sensiosite.cloud
  16387. // Syncloud : https://syncloud.org
  16388. // Submitted by Boris Rybalkin <syncloud@syncloud.it>
  16389. syncloud.it
  16390. // Synology, Inc. : https://www.synology.com/
  16391. // Submitted by Rony Weng <ronyweng@synology.com>
  16392. dscloud.biz
  16393. direct.quickconnect.cn
  16394. dsmynas.com
  16395. familyds.com
  16396. diskstation.me
  16397. dscloud.me
  16398. i234.me
  16399. myds.me
  16400. synology.me
  16401. dscloud.mobi
  16402. dsmynas.net
  16403. familyds.net
  16404. dsmynas.org
  16405. familyds.org
  16406. vpnplus.to
  16407. direct.quickconnect.to
  16408. // Tabit Technologies Ltd. : https://tabit.cloud/
  16409. // Submitted by Oren Agiv <oren@tabit.cloud>
  16410. tabitorder.co.il
  16411. mytabit.co.il
  16412. mytabit.com
  16413. // TAIFUN Software AG : http://taifun-software.de
  16414. // Submitted by Bjoern Henke <dev-server@taifun-software.de>
  16415. taifun-dns.de
  16416. // Tailscale Inc. : https://www.tailscale.com
  16417. // Submitted by David Anderson <danderson@tailscale.com>
  16418. beta.tailscale.net
  16419. ts.net
  16420. // TASK geographical domains (www.task.gda.pl/uslugi/dns)
  16421. gda.pl
  16422. gdansk.pl
  16423. gdynia.pl
  16424. med.pl
  16425. sopot.pl
  16426. // team.blue https://team.blue
  16427. // Submitted by Cedric Dubois <cedric.dubois@team.blue>
  16428. site.tb-hosting.com
  16429. // Teckids e.V. : https://www.teckids.org
  16430. // Submitted by Dominik George <dominik.george@teckids.org>
  16431. edugit.io
  16432. s3.teckids.org
  16433. // Telebit : https://telebit.cloud
  16434. // Submitted by AJ ONeal <aj@telebit.cloud>
  16435. telebit.app
  16436. telebit.io
  16437. *.telebit.xyz
  16438. // Thingdust AG : https://thingdust.com/
  16439. // Submitted by Adrian Imboden <adi@thingdust.com>
  16440. *.firenet.ch
  16441. *.svc.firenet.ch
  16442. reservd.com
  16443. thingdustdata.com
  16444. cust.dev.thingdust.io
  16445. cust.disrec.thingdust.io
  16446. cust.prod.thingdust.io
  16447. cust.testing.thingdust.io
  16448. reservd.dev.thingdust.io
  16449. reservd.disrec.thingdust.io
  16450. reservd.testing.thingdust.io
  16451. // ticket i/O GmbH : https://ticket.io
  16452. // Submitted by Christian Franke <it@ticket.io>
  16453. tickets.io
  16454. // Tlon.io : https://tlon.io
  16455. // Submitted by Mark Staarink <mark@tlon.io>
  16456. arvo.network
  16457. azimuth.network
  16458. tlon.network
  16459. // Tor Project, Inc. : https://torproject.org
  16460. // Submitted by Antoine Beaupré <anarcat@torproject.org
  16461. torproject.net
  16462. pages.torproject.net
  16463. // TownNews.com : http://www.townnews.com
  16464. // Submitted by Dustin Ward <dward@townnews.com>
  16465. bloxcms.com
  16466. townnews-staging.com
  16467. // TrafficPlex GmbH : https://www.trafficplex.de/
  16468. // Submitted by Phillipp Röll <phillipp.roell@trafficplex.de>
  16469. 12hp.at
  16470. 2ix.at
  16471. 4lima.at
  16472. lima-city.at
  16473. 12hp.ch
  16474. 2ix.ch
  16475. 4lima.ch
  16476. lima-city.ch
  16477. trafficplex.cloud
  16478. de.cool
  16479. 12hp.de
  16480. 2ix.de
  16481. 4lima.de
  16482. lima-city.de
  16483. 1337.pictures
  16484. clan.rip
  16485. lima-city.rocks
  16486. webspace.rocks
  16487. lima.zone
  16488. // TransIP : https://www.transip.nl
  16489. // Submitted by Rory Breuk <rbreuk@transip.nl>
  16490. *.transurl.be
  16491. *.transurl.eu
  16492. *.transurl.nl
  16493. // TransIP: https://www.transip.nl
  16494. // Submitted by Cedric Dubois <cedric.dubois@team.blue>
  16495. site.transip.me
  16496. // TuxFamily : http://tuxfamily.org
  16497. // Submitted by TuxFamily administrators <adm@staff.tuxfamily.org>
  16498. tuxfamily.org
  16499. // TwoDNS : https://www.twodns.de/
  16500. // Submitted by TwoDNS-Support <support@two-dns.de>
  16501. dd-dns.de
  16502. diskstation.eu
  16503. diskstation.org
  16504. dray-dns.de
  16505. draydns.de
  16506. dyn-vpn.de
  16507. dynvpn.de
  16508. mein-vigor.de
  16509. my-vigor.de
  16510. my-wan.de
  16511. syno-ds.de
  16512. synology-diskstation.de
  16513. synology-ds.de
  16514. // Typedream : https://typedream.com
  16515. // Submitted by Putri Karunia <putri@typedream.com>
  16516. typedream.app
  16517. // Typeform : https://www.typeform.com
  16518. // Submitted by Sergi Ferriz <sergi.ferriz@typeform.com>
  16519. pro.typeform.com
  16520. // Uberspace : https://uberspace.de
  16521. // Submitted by Moritz Werner <mwerner@jonaspasche.com>
  16522. uber.space
  16523. *.uberspace.de
  16524. // UDR Limited : http://www.udr.hk.com
  16525. // Submitted by registry <hostmaster@udr.hk.com>
  16526. hk.com
  16527. hk.org
  16528. ltd.hk
  16529. inc.hk
  16530. // UK Intis Telecom LTD : https://it.com
  16531. // Submitted by ITComdomains <to@it.com>
  16532. it.com
  16533. // UNIVERSAL DOMAIN REGISTRY : https://www.udr.org.yt/
  16534. // see also: whois -h whois.udr.org.yt help
  16535. // Submitted by Atanunu Igbunuroghene <publicsuffixlist@udr.org.yt>
  16536. name.pm
  16537. sch.tf
  16538. biz.wf
  16539. sch.wf
  16540. org.yt
  16541. // United Gameserver GmbH : https://united-gameserver.de
  16542. // Submitted by Stefan Schwarz <sysadm@united-gameserver.de>
  16543. virtualuser.de
  16544. virtual-user.de
  16545. // Upli : https://upli.io
  16546. // Submitted by Lenny Bakkalian <lenny.bakkalian@gmail.com>
  16547. upli.io
  16548. // urown.net : https://urown.net
  16549. // Submitted by Hostmaster <hostmaster@urown.net>
  16550. urown.cloud
  16551. dnsupdate.info
  16552. // .US
  16553. // Submitted by Ed Moore <Ed.Moore@lib.de.us>
  16554. lib.de.us
  16555. // VeryPositive SIA : http://very.lv
  16556. // Submitted by Danko Aleksejevs <danko@very.lv>
  16557. 2038.io
  16558. // Vercel, Inc : https://vercel.com/
  16559. // Submitted by Connor Davis <security@vercel.com>
  16560. vercel.app
  16561. vercel.dev
  16562. now.sh
  16563. // Viprinet Europe GmbH : http://www.viprinet.com
  16564. // Submitted by Simon Kissel <hostmaster@viprinet.com>
  16565. router.management
  16566. // Virtual-Info : https://www.virtual-info.info/
  16567. // Submitted by Adnan RIHAN <hostmaster@v-info.info>
  16568. v-info.info
  16569. // Voorloper.com: https://voorloper.com
  16570. // Submitted by Nathan van Bakel <info@voorloper.com>
  16571. voorloper.cloud
  16572. // Voxel.sh DNS : https://voxel.sh/dns/
  16573. // Submitted by Mia Rehlinger <dns@voxel.sh>
  16574. neko.am
  16575. nyaa.am
  16576. be.ax
  16577. cat.ax
  16578. es.ax
  16579. eu.ax
  16580. gg.ax
  16581. mc.ax
  16582. us.ax
  16583. xy.ax
  16584. nl.ci
  16585. xx.gl
  16586. app.gp
  16587. blog.gt
  16588. de.gt
  16589. to.gt
  16590. be.gy
  16591. cc.hn
  16592. blog.kg
  16593. io.kg
  16594. jp.kg
  16595. tv.kg
  16596. uk.kg
  16597. us.kg
  16598. de.ls
  16599. at.md
  16600. de.md
  16601. jp.md
  16602. to.md
  16603. indie.porn
  16604. vxl.sh
  16605. ch.tc
  16606. me.tc
  16607. we.tc
  16608. nyan.to
  16609. at.vg
  16610. blog.vu
  16611. dev.vu
  16612. me.vu
  16613. // V.UA Domain Administrator : https://domain.v.ua/
  16614. // Submitted by Serhii Rostilo <sergey@rostilo.kiev.ua>
  16615. v.ua
  16616. // Vultr Objects : https://www.vultr.com/products/object-storage/
  16617. // Submitted by Niels Maumenee <storage@vultr.com>
  16618. *.vultrobjects.com
  16619. // Waffle Computer Inc., Ltd. : https://docs.waffleinfo.com
  16620. // Submitted by Masayuki Note <masa@blade.wafflecell.com>
  16621. wafflecell.com
  16622. // WebHare bv: https://www.webhare.com/
  16623. // Submitted by Arnold Hendriks <info@webhare.com>
  16624. *.webhare.dev
  16625. // WebHotelier Technologies Ltd: https://www.webhotelier.net/
  16626. // Submitted by Apostolos Tsakpinis <apostolos.tsakpinis@gmail.com>
  16627. reserve-online.net
  16628. reserve-online.com
  16629. bookonline.app
  16630. hotelwithflight.com
  16631. // WeDeploy by Liferay, Inc. : https://www.wedeploy.com
  16632. // Submitted by Henrique Vicente <security@wedeploy.com>
  16633. wedeploy.io
  16634. wedeploy.me
  16635. wedeploy.sh
  16636. // Western Digital Technologies, Inc : https://www.wdc.com
  16637. // Submitted by Jung Jin <jungseok.jin@wdc.com>
  16638. remotewd.com
  16639. // WIARD Enterprises : https://wiardweb.com
  16640. // Submitted by Kidd Hustle <kiddhustle@wiardweb.com>
  16641. pages.wiardweb.com
  16642. // Wikimedia Labs : https://wikitech.wikimedia.org
  16643. // Submitted by Arturo Borrero Gonzalez <aborrero@wikimedia.org>
  16644. wmflabs.org
  16645. toolforge.org
  16646. wmcloud.org
  16647. // WISP : https://wisp.gg
  16648. // Submitted by Stepan Fedotov <stepan@wisp.gg>
  16649. panel.gg
  16650. daemon.panel.gg
  16651. // Wizard Zines : https://wizardzines.com
  16652. // Submitted by Julia Evans <julia@wizardzines.com>
  16653. messwithdns.com
  16654. // WoltLab GmbH : https://www.woltlab.com
  16655. // Submitted by Tim Düsterhus <security@woltlab.cloud>
  16656. woltlab-demo.com
  16657. myforum.community
  16658. community-pro.de
  16659. diskussionsbereich.de
  16660. community-pro.net
  16661. meinforum.net
  16662. // Woods Valldata : https://www.woodsvalldata.co.uk/
  16663. // Submitted by Chris Whittle <chris.whittle@woodsvalldata.co.uk>
  16664. affinitylottery.org.uk
  16665. raffleentry.org.uk
  16666. weeklylottery.org.uk
  16667. // WP Engine : https://wpengine.com/
  16668. // Submitted by Michael Smith <michael.smith@wpengine.com>
  16669. // Submitted by Brandon DuRette <brandon.durette@wpengine.com>
  16670. wpenginepowered.com
  16671. js.wpenginepowered.com
  16672. // Wix.com, Inc. : https://www.wix.com
  16673. // Submitted by Shahar Talmi <shahar@wix.com>
  16674. wixsite.com
  16675. editorx.io
  16676. wixstudio.io
  16677. wix.run
  16678. // XenonCloud GbR: https://xenoncloud.net
  16679. // Submitted by Julian Uphoff <publicsuffixlist@xenoncloud.net>
  16680. half.host
  16681. // XnBay Technology : http://www.xnbay.com/
  16682. // Submitted by XnBay Developer <developer.xncloud@gmail.com>
  16683. xnbay.com
  16684. u2.xnbay.com
  16685. u2-local.xnbay.com
  16686. // XS4ALL Internet bv : https://www.xs4all.nl/
  16687. // Submitted by Daniel Mostertman <unixbeheer+publicsuffix@xs4all.net>
  16688. cistron.nl
  16689. demon.nl
  16690. xs4all.space
  16691. // Yandex.Cloud LLC: https://cloud.yandex.com
  16692. // Submitted by Alexander Lodin <security+psl@yandex-team.ru>
  16693. yandexcloud.net
  16694. storage.yandexcloud.net
  16695. website.yandexcloud.net
  16696. // YesCourse Pty Ltd : https://yescourse.com
  16697. // Submitted by Atul Bhouraskar <atul@yescourse.com>
  16698. official.academy
  16699. // Yola : https://www.yola.com/
  16700. // Submitted by Stefano Rivera <stefano@yola.com>
  16701. yolasite.com
  16702. // Yombo : https://yombo.net
  16703. // Submitted by Mitch Schwenk <mitch@yombo.net>
  16704. ybo.faith
  16705. yombo.me
  16706. homelink.one
  16707. ybo.party
  16708. ybo.review
  16709. ybo.science
  16710. ybo.trade
  16711. // Yunohost : https://yunohost.org
  16712. // Submitted by Valentin Grimaud <security@yunohost.org>
  16713. ynh.fr
  16714. nohost.me
  16715. noho.st
  16716. // ZaNiC : http://www.za.net/
  16717. // Submitted by registry <hostmaster@nic.za.net>
  16718. za.net
  16719. za.org
  16720. // Zine EOOD : https://zine.bg/
  16721. // Submitted by Martin Angelov <martin@zine.bg>
  16722. bss.design
  16723. // Zitcom A/S : https://www.zitcom.dk
  16724. // Submitted by Emil Stahl <esp@zitcom.dk>
  16725. basicserver.io
  16726. virtualserver.io
  16727. enterprisecloud.nu
  16728. // ===END PRIVATE DOMAINS===
  16729. `.split("\n").filter(line => !line.startsWith("//") && line.trim().length > 0).sort((lineLeft, lineRight) => lineRight.length - lineLeft.length);
  16730. async function formatFilename(content, doc, options) {
  16731. let filename = (await evalTemplate(options.filenameTemplate, options, content, doc)) || "";
  16732. filename = filename.trim();
  16733. if (options.replaceEmojisInFilename) {
  16734. EMOJIS.forEach(emoji => (filename = replaceAll(filename, emoji, " _" + EMOJI_NAMES[emoji] + "_ ")));
  16735. }
  16736. const replacementCharacter = options.filenameReplacementCharacter;
  16737. filename = getValidFilename(filename, options.filenameReplacedCharacters, replacementCharacter);
  16738. if (!options.backgroundSave) {
  16739. filename = filename.replace(/\//g, replacementCharacter);
  16740. }
  16741. if (!options.keepFilename && ((options.filenameMaxLengthUnit == "bytes" && getContentSize(filename) > options.filenameMaxLength) || filename.length > options.filenameMaxLength)) {
  16742. const extensionMatch = filename.match(/(\.[^.]{3,4})$/);
  16743. const extension = extensionMatch && extensionMatch[0] && extensionMatch[0].length > 1 ? extensionMatch[0] : "";
  16744. filename = options.filenameMaxLengthUnit == "bytes" ? await truncateText(filename, options.filenameMaxLength - extension.length) : filename.substring(0, options.filenameMaxLength - extension.length);
  16745. filename = filename + "…" + extension;
  16746. }
  16747. if (!filename) {
  16748. filename = "Unnamed page";
  16749. }
  16750. if (filename.startsWith(".")) {
  16751. filename = "Unnamed page" + filename;
  16752. }
  16753. return filename.trim();
  16754. }
  16755. async function evalTemplate(template = "", options, content, doc, dontReplaceSlash) {
  16756. const url = new URL$3(options.saveUrl);
  16757. const urlHref = decode(url.href);
  16758. const params = Array.from(new URLSearchParams$1(url.search));
  16759. const bookmarkFolder = (options.bookmarkFolders && options.bookmarkFolders.join("/")) || "";
  16760. const dontReplaceSlashIfUndefined = dontReplaceSlash === undefined ? true : dontReplaceSlash;
  16761. const urlSuffix = PUBLIC_SUFFIX_LIST.find(urlTopLevelDomainName => url.hostname.endsWith("." + urlTopLevelDomainName) && urlTopLevelDomainName);
  16762. const urlDomainName = urlSuffix ? url.hostname.substring(0, url.hostname.length - urlSuffix.length - 1) : url.hostname;
  16763. const indexLastDotCharacter = urlDomainName.lastIndexOf(".");
  16764. let urlSubDomains = urlDomainName.substring(0, indexLastDotCharacter == -1 ? 0 : indexLastDotCharacter);
  16765. const urlDomain = urlDomainName.substring(urlSubDomains.length ? urlSubDomains.length + 1 : 0);
  16766. const urlRoot = urlDomain + "." + urlSuffix;
  16767. if (urlSubDomains.startsWith("www.")) {
  16768. urlSubDomains = urlSubDomains.substring(4);
  16769. } else if (urlSubDomains == "www") {
  16770. urlSubDomains = "";
  16771. }
  16772. const variables = {
  16773. "page-title": { getter: () => options.title },
  16774. "page-heading": { getter: () => options.info.heading },
  16775. "page-language": { getter: () => options.info.lang },
  16776. "page-description": { getter: () => options.info.description },
  16777. "page-author": { getter: () => options.info.author },
  16778. "page-creator": { getter: () => options.info.creator },
  16779. "page-publisher": { getter: () => options.info.publisher },
  16780. "url-hash": { getter: () => url.hash.substring(1) },
  16781. "url-host": { getter: () => url.host.replace(/\/$/, "") },
  16782. "url-hostname": { getter: () => url.hostname.replace(/\/$/, "") },
  16783. "url-hostname-suffix": { getter: () => urlSuffix },
  16784. "url-hostname-domain": { getter: () => urlDomain },
  16785. "url-hostname-root": { getter: () => urlRoot },
  16786. "url-hostname-subdomains": { getter: () => urlSubDomains },
  16787. "url-href": { getter: () => urlHref, dontReplaceSlash: dontReplaceSlashIfUndefined },
  16788. "url-href-digest-sha-1": { getter: urlHref ? async () => digest("SHA-1", urlHref) : "" },
  16789. "url-href-flat": { getter: () => decode(url.href), dontReplaceSlash: false },
  16790. "url-referrer": { getter: () => decode(options.referrer), dontReplaceSlash: dontReplaceSlashIfUndefined },
  16791. "url-referrer-flat": { getter: () => decode(options.referrer), dontReplaceSlash: false },
  16792. "url-password": { getter: () => url.password },
  16793. "url-pathname": { getter: () => decode(url.pathname).replace(/^\//, "").replace(/\/$/, ""), dontReplaceSlash: dontReplaceSlashIfUndefined },
  16794. "url-pathname-flat": { getter: () => decode(url.pathname), dontReplaceSlash: false },
  16795. "url-port": { getter: () => url.port },
  16796. "url-protocol": { getter: () => url.protocol },
  16797. "url-search": { getter: () => url.search.substring(1) },
  16798. "url-username": { getter: () => url.username },
  16799. "tab-id": { getter: () => String(options.tabId) },
  16800. "tab-index": { getter: () => String(options.tabIndex) },
  16801. "url-last-segment": { getter: () => decode(getLastSegment(url, options.filenameReplacementCharacter)) },
  16802. "bookmark-pathname": { getter: () => bookmarkFolder, dontReplaceSlash: dontReplaceSlashIfUndefined },
  16803. "bookmark-pathname-flat": { getter: () => bookmarkFolder, dontReplaceSlash: false },
  16804. "profile-name": { getter: () => options.profileName },
  16805. "filename-extension": { getter: () => getFilenameExtension(options) },
  16806. "save-action": { getter: () => options.selected ? "selection" : "page" }
  16807. };
  16808. if (content) {
  16809. variables["digest-sha-256"] = { getter: async () => digest("SHA-256", content) };
  16810. variables["digest-sha-384"] = { getter: async () => digest("SHA-384", content) };
  16811. variables["digest-sha-512"] = { getter: async () => digest("SHA-512", content) };
  16812. }
  16813. if (options.saveDate) {
  16814. addDateVariables(options.saveDate);
  16815. }
  16816. if (options.visitDate) {
  16817. addDateVariables(options.visitDate, "visit-");
  16818. }
  16819. const functions = {
  16820. "if-empty": (...values) => {
  16821. const defaultValue = values.pop();
  16822. const foundValue = values.find(value => value);
  16823. return foundValue ? foundValue : defaultValue;
  16824. },
  16825. "if-not-empty": (...values) => {
  16826. const defaultValue = values.pop();
  16827. const foundValue = values.find(value => value);
  16828. return foundValue ? defaultValue : foundValue;
  16829. },
  16830. "if-equals": (value, otherValue, trueValue, falseValue) => value == otherValue ? trueValue : falseValue,
  16831. "if-not-equals": (value, otherValue, trueValue, falseValue) => value != otherValue ? trueValue : falseValue,
  16832. "if-contains": (value, otherValue, trueValue, falseValue) => otherValue && value.includes(otherValue) ? trueValue : falseValue,
  16833. "if-not-contains": (value, otherValue, trueValue, falseValue) => otherValue && !value.includes(otherValue) ? trueValue : falseValue,
  16834. "substring": (value, start, end) => value.substring(start, end),
  16835. "lowercase": value => value.toLowerCase(),
  16836. "uppercase": value => value.toUpperCase(),
  16837. "capitalize": value => value.charAt(0).toUpperCase() + value.slice(1),
  16838. "replace": (value, searchValue, replaceValue) => searchValue && replaceValue ? replaceAll(value, searchValue, replaceValue) : value,
  16839. "trim": value => value.trim(),
  16840. "trim-left": value => value.trimLeft(),
  16841. "trim-right": value => value.trimRight(),
  16842. "pad-left": (value, length, padString) => length > 0 ? value.padStart(length, padString) : value,
  16843. "pad-right": (value, length, padString) => length > 0 ? value.padEnd(length, padString) : value,
  16844. "repeat": (value, count) => count > 0 ? value.repeat(count) : "",
  16845. "index-of": (value, searchValue, fromIndex) => value.indexOf(searchValue, fromIndex),
  16846. "last-index-of": (value, searchValue, fromIndex) => value.lastIndexOf(searchValue, fromIndex),
  16847. "length": value => value.length,
  16848. "url-search-name": (index = 0) => params[index] && params[index][0],
  16849. "url-search-value": (index = 0) => params[index] && params[index][1],
  16850. "url-search-named-value": name => {
  16851. const param = params.find(param => param[0] == name);
  16852. return (param && param[1]);
  16853. },
  16854. "url-search": name => {
  16855. const param = params.find(param => param[0] == name);
  16856. return (param && param[1]);
  16857. },
  16858. "url-segment": (index = 0) => {
  16859. const segments = decode(url.pathname).split("/");
  16860. segments.pop();
  16861. segments.push(getLastSegment(url, options.filenameReplacementCharacter));
  16862. return segments[index];
  16863. },
  16864. "url-hostname-subdomain": (index = 0) => {
  16865. const subdomains = urlSubDomains.split(".");
  16866. return subdomains[subdomains.length - index - 1];
  16867. },
  16868. "stringify": value => { try { return JSON.stringify(value); } catch (error) { return value; } },
  16869. "encode-uri": value => { try { return encodeURI(value); } catch (error) { return value; } },
  16870. "decode-uri": value => { try { return decodeURI(value); } catch (error) { return value; } },
  16871. "encode-uri-component": value => { try { return encodeURIComponent(value); } catch (error) { return value; } },
  16872. "decode-uri-component": value => { try { return decodeURIComponent(value); } catch (error) { return value; } }
  16873. };
  16874. if (doc) {
  16875. functions["page-element-text"] = (selector) => {
  16876. const element = doc.querySelector(selector);
  16877. return element && element.textContent;
  16878. };
  16879. functions["page-element-attribute"] = (selector, attribute) => {
  16880. const element = doc.querySelector(selector);
  16881. return element && element.getAttribute(attribute);
  16882. };
  16883. }
  16884. template = replaceAll(template, "\\%", "\\\\%");
  16885. template = replaceAll(template, "\\{", "\\\\{");
  16886. template = replaceAll(template, "\\|", "\\\\|");
  16887. template = replaceAll(template, "\\>", "\\\\>");
  16888. let result = (await peg$parse(template, {
  16889. async callFunction(name, [argument, optionalArguments], lengthData) {
  16890. const fn = functions[name];
  16891. if (fn) {
  16892. argument = argument.replace(/\\\\(.)/g, "$1");
  16893. if (!optionalArguments) {
  16894. optionalArguments = [];
  16895. }
  16896. optionalArguments = optionalArguments
  16897. .map(argument => argument.replace(/\\\\(.)/g, "$1"))
  16898. .filter(argument => argument != undefined && argument != null && argument != "");
  16899. if ((argument != undefined && argument != null && argument != "") || optionalArguments.length > 0) {
  16900. try {
  16901. return await getValue(() => fn(argument, ...optionalArguments), true, options.filenameReplacementCharacter, lengthData);
  16902. } catch (error) {
  16903. return "";
  16904. }
  16905. } else {
  16906. return "";
  16907. }
  16908. } else {
  16909. return "";
  16910. }
  16911. },
  16912. getVariableValue(name, lengthData) {
  16913. const variable = variables[name];
  16914. if (variable) {
  16915. return getValue(variable.getter, variable.dontReplaceSlash, options.filenameReplacementCharacter, lengthData);
  16916. } else {
  16917. return "";
  16918. }
  16919. }
  16920. }));
  16921. result = replaceAll(result, "\\\\%", "%");
  16922. result = replaceAll(result, "\\\\{", "{");
  16923. result = replaceAll(result, "\\\\|", "|");
  16924. result = replaceAll(result, "\\\\>", ">");
  16925. return result;
  16926. function addDateVariables(date, prefix = "") {
  16927. variables[prefix + "datetime-iso"] = { getter: () => date.toISOString() };
  16928. variables[prefix + "date-iso"] = { getter: () => date.toISOString().split("T")[0] };
  16929. variables[prefix + "time-iso"] = { getter: () => date.toISOString().split("T")[1].split("Z")[0] };
  16930. variables[prefix + "date-locale"] = { getter: () => date.toLocaleDateString() };
  16931. variables[prefix + "time-locale"] = { getter: () => date.toLocaleTimeString() };
  16932. variables[prefix + "day-locale"] = { getter: () => String(date.getDate()).padStart(2, "0") };
  16933. variables[prefix + "month-locale"] = { getter: () => String(date.getMonth() + 1).padStart(2, "0") };
  16934. variables[prefix + "year-locale"] = { getter: () => String(date.getFullYear()) };
  16935. variables[prefix + "datetime-locale"] = { getter: () => date.toLocaleString() };
  16936. variables[prefix + "datetime-utc"] = { getter: () => date.toUTCString() };
  16937. variables[prefix + "day-utc"] = { getter: () => String(date.getUTCDate()).padStart(2, "0") };
  16938. variables[prefix + "month-utc"] = { getter: () => String(date.getUTCMonth() + 1).padStart(2, "0") };
  16939. variables[prefix + "year-utc"] = { getter: () => String(date.getUTCFullYear()) };
  16940. variables[prefix + "hours-locale"] = { getter: () => String(date.getHours()).padStart(2, "0") };
  16941. variables[prefix + "minutes-locale"] = { getter: () => String(date.getMinutes()).padStart(2, "0") };
  16942. variables[prefix + "seconds-locale"] = { getter: () => String(date.getSeconds()).padStart(2, "0") };
  16943. variables[prefix + "hours-utc"] = { getter: () => String(date.getUTCHours()).padStart(2, "0") };
  16944. variables[prefix + "minutes-utc"] = { getter: () => String(date.getUTCMinutes()).padStart(2, "0") };
  16945. variables[prefix + "seconds-utc"] = { getter: () => String(date.getUTCSeconds()).padStart(2, "0") };
  16946. variables[prefix + "time-ms"] = { getter: () => String(date.getTime()) };
  16947. }
  16948. }
  16949. function replaceAll(string, search, replacement) {
  16950. if (typeof string.replaceAll == "function") {
  16951. return string.replaceAll(search, replacement);
  16952. } else {
  16953. const searchRegExp = new RegExp(search.replace(REGEXP_ESCAPE, "\\$1"), "g");
  16954. return string.replace(searchRegExp, replacement);
  16955. }
  16956. }
  16957. async function getValue(valueGetter, dontReplaceSlash, replacementCharacter, lengthData) {
  16958. const { maxLength, maxCharLength } = extractMaxLength(lengthData);
  16959. let value = (await valueGetter()) || "";
  16960. if (!dontReplaceSlash) {
  16961. value = value.replace(/\/+/g, replacementCharacter);
  16962. }
  16963. if (maxLength) {
  16964. value = await truncateText(value, maxLength);
  16965. } else if (maxCharLength) {
  16966. value = value.substring(0, maxCharLength);
  16967. }
  16968. return value;
  16969. }
  16970. function extractMaxLength(lengthData) {
  16971. if (lengthData) {
  16972. const { unit, length } = lengthData;
  16973. let maxLength, maxCharLength;
  16974. if (unit == "char") {
  16975. maxCharLength = length;
  16976. } else {
  16977. maxLength = length;
  16978. }
  16979. return { maxLength, maxCharLength };
  16980. } else {
  16981. return {};
  16982. }
  16983. }
  16984. function decode(value) {
  16985. try {
  16986. return decodeURI(value);
  16987. } catch (error) {
  16988. return value;
  16989. }
  16990. }
  16991. function getLastSegment(url, replacementCharacter) {
  16992. let lastSegmentMatch = url.pathname.match(/\/([^/]+)$/),
  16993. lastSegment = lastSegmentMatch && lastSegmentMatch[0];
  16994. if (!lastSegment) {
  16995. lastSegmentMatch = url.href.match(/([^/]+)\/?$/);
  16996. lastSegment = lastSegmentMatch && lastSegmentMatch[0];
  16997. }
  16998. if (!lastSegment) {
  16999. lastSegmentMatch = lastSegment.match(/(.*)\.[^.]+$/);
  17000. lastSegment = lastSegmentMatch && lastSegmentMatch[0];
  17001. }
  17002. if (!lastSegment) {
  17003. lastSegment = url.hostname.replace(/\/+/g, replacementCharacter).replace(/\/$/, "");
  17004. }
  17005. lastSegmentMatch = lastSegment.match(/(.*)\.[^.]+$/);
  17006. if (lastSegmentMatch && lastSegmentMatch[1]) {
  17007. lastSegment = lastSegmentMatch[1];
  17008. }
  17009. lastSegment = lastSegment.replace(/\/$/, "").replace(/^\//, "");
  17010. return lastSegment;
  17011. }
  17012. function getValidFilename(filename, replacedCharacters = DEFAULT_REPLACED_CHARACTERS$1, replacementCharacter = DEFAULT_REPLACEMENT_CHARACTER$1) {
  17013. replacedCharacters.forEach(replacedCharacter => (filename = filename.replace(new RegExp("[" + replacedCharacter + "]+", "g"), replacementCharacter)));
  17014. filename = filename
  17015. .replace(/\.\.\//g, "")
  17016. .replace(/^\/+/, "")
  17017. .replace(/\/+/g, "/")
  17018. .replace(/\/$/, "")
  17019. .replace(/\.$/, "")
  17020. .replace(/\.\//g, "." + replacementCharacter)
  17021. .replace(/\/\./g, "/" + replacementCharacter);
  17022. return filename;
  17023. }
  17024. function truncateText(content, maxSize) {
  17025. const blob = new Blob$3([content]);
  17026. const reader = new FileReader$2();
  17027. reader.readAsText(blob.slice(0, maxSize));
  17028. return new Promise((resolve, reject) => {
  17029. reader.addEventListener(
  17030. "load",
  17031. () => {
  17032. if (content.startsWith(reader.result)) {
  17033. resolve(reader.result);
  17034. } else {
  17035. truncateText(content, maxSize - 1)
  17036. .then(resolve)
  17037. .catch(reject);
  17038. }
  17039. },
  17040. false
  17041. );
  17042. reader.addEventListener("error", reject, false);
  17043. });
  17044. }
  17045. function getFilenameExtension(options) {
  17046. if (options.compressContent) {
  17047. if (options.selfExtractingArchive) {
  17048. if (options.extractDataFromPage) {
  17049. return "u.zip.html";
  17050. } else {
  17051. return "zip.html";
  17052. }
  17053. } else {
  17054. return "zip";
  17055. }
  17056. } else {
  17057. return "html";
  17058. }
  17059. }
  17060. const { Array: Array$1, Object: Object$1, String: String$1, Number: Number$1, BigInt, Math: Math$1, Date: Date$1, Map: Map$1, Set: Set$1, Response, URL: URL$2, Error: Error$1, Uint8Array: Uint8Array$1, Uint16Array, Uint32Array: Uint32Array$1, DataView: DataView$1, Blob: Blob$2, Promise: Promise$1, TextEncoder, TextDecoder: TextDecoder$1, crypto, btoa, TransformStream, ReadableStream, WritableStream, CompressionStream, DecompressionStream, navigator, Worker } = globalThis;
  17061. /*
  17062. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  17063. Redistribution and use in source and binary forms, with or without
  17064. modification, are permitted provided that the following conditions are met:
  17065. 1. Redistributions of source code must retain the above copyright notice,
  17066. this list of conditions and the following disclaimer.
  17067. 2. Redistributions in binary form must reproduce the above copyright
  17068. notice, this list of conditions and the following disclaimer in
  17069. the documentation and/or other materials provided with the distribution.
  17070. 3. The names of the authors may not be used to endorse or promote products
  17071. derived from this software without specific prior written permission.
  17072. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  17073. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  17074. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  17075. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  17076. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  17077. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  17078. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  17079. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  17080. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  17081. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  17082. */
  17083. const MAX_32_BITS = 0xffffffff;
  17084. const MAX_16_BITS = 0xffff;
  17085. const COMPRESSION_METHOD_DEFLATE = 0x08;
  17086. const COMPRESSION_METHOD_STORE = 0x00;
  17087. const COMPRESSION_METHOD_AES = 0x63;
  17088. const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
  17089. const SPLIT_ZIP_FILE_SIGNATURE = 0x08074b50;
  17090. const DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
  17091. const CENTRAL_FILE_HEADER_SIGNATURE = 0x02014b50;
  17092. const END_OF_CENTRAL_DIR_SIGNATURE = 0x06054b50;
  17093. const ZIP64_END_OF_CENTRAL_DIR_SIGNATURE = 0x06064b50;
  17094. const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE = 0x07064b50;
  17095. const END_OF_CENTRAL_DIR_LENGTH = 22;
  17096. const ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH = 20;
  17097. const ZIP64_END_OF_CENTRAL_DIR_LENGTH = 56;
  17098. const ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH = END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LENGTH;
  17099. const EXTRAFIELD_TYPE_ZIP64 = 0x0001;
  17100. const EXTRAFIELD_TYPE_AES = 0x9901;
  17101. const EXTRAFIELD_TYPE_NTFS = 0x000a;
  17102. const EXTRAFIELD_TYPE_NTFS_TAG1 = 0x0001;
  17103. const EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP = 0x5455;
  17104. const EXTRAFIELD_TYPE_UNICODE_PATH = 0x7075;
  17105. const EXTRAFIELD_TYPE_UNICODE_COMMENT = 0x6375;
  17106. const EXTRAFIELD_TYPE_USDZ = 0x1986;
  17107. const BITFLAG_ENCRYPTED = 0x01;
  17108. const BITFLAG_LEVEL = 0x06;
  17109. const BITFLAG_DATA_DESCRIPTOR = 0x0008;
  17110. const BITFLAG_LANG_ENCODING_FLAG = 0x0800;
  17111. const FILE_ATTR_MSDOS_DIR_MASK = 0x10;
  17112. const VERSION_DEFLATE = 0x14;
  17113. const VERSION_ZIP64 = 0x2D;
  17114. const VERSION_AES = 0x33;
  17115. const DIRECTORY_SIGNATURE = "/";
  17116. const MAX_DATE = new Date$1(2107, 11, 31);
  17117. const MIN_DATE = new Date$1(1980, 0, 1);
  17118. const UNDEFINED_VALUE = undefined;
  17119. const UNDEFINED_TYPE$1 = "undefined";
  17120. const FUNCTION_TYPE$1 = "function";
  17121. /*
  17122. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  17123. Redistribution and use in source and binary forms, with or without
  17124. modification, are permitted provided that the following conditions are met:
  17125. 1. Redistributions of source code must retain the above copyright notice,
  17126. this list of conditions and the following disclaimer.
  17127. 2. Redistributions in binary form must reproduce the above copyright
  17128. notice, this list of conditions and the following disclaimer in
  17129. the documentation and/or other materials provided with the distribution.
  17130. 3. The names of the authors may not be used to endorse or promote products
  17131. derived from this software without specific prior written permission.
  17132. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  17133. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  17134. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  17135. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  17136. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  17137. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  17138. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  17139. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  17140. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  17141. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  17142. */
  17143. class StreamAdapter {
  17144. constructor(Codec) {
  17145. return class extends TransformStream {
  17146. constructor(_format, options) {
  17147. const codec = new Codec(options);
  17148. super({
  17149. transform(chunk, controller) {
  17150. controller.enqueue(codec.append(chunk));
  17151. },
  17152. flush(controller) {
  17153. const chunk = codec.flush();
  17154. if (chunk) {
  17155. controller.enqueue(chunk);
  17156. }
  17157. }
  17158. });
  17159. }
  17160. };
  17161. }
  17162. }
  17163. /*
  17164. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  17165. Redistribution and use in source and binary forms, with or without
  17166. modification, are permitted provided that the following conditions are met:
  17167. 1. Redistributions of source code must retain the above copyright notice,
  17168. this list of conditions and the following disclaimer.
  17169. 2. Redistributions in binary form must reproduce the above copyright
  17170. notice, this list of conditions and the following disclaimer in
  17171. the documentation and/or other materials provided with the distribution.
  17172. 3. The names of the authors may not be used to endorse or promote products
  17173. derived from this software without specific prior written permission.
  17174. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  17175. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  17176. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  17177. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  17178. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  17179. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  17180. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  17181. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  17182. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  17183. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  17184. */
  17185. const MINIMUM_CHUNK_SIZE = 64;
  17186. let maxWorkers = 2;
  17187. try {
  17188. if (typeof navigator != UNDEFINED_TYPE$1 && navigator.hardwareConcurrency) {
  17189. maxWorkers = navigator.hardwareConcurrency;
  17190. }
  17191. } catch (_error) {
  17192. // ignored
  17193. }
  17194. const DEFAULT_CONFIGURATION = {
  17195. chunkSize: 512 * 1024,
  17196. maxWorkers,
  17197. terminateWorkerTimeout: 5000,
  17198. useWebWorkers: true,
  17199. useCompressionStream: true,
  17200. workerScripts: UNDEFINED_VALUE,
  17201. CompressionStreamNative: typeof CompressionStream != UNDEFINED_TYPE$1 && CompressionStream,
  17202. DecompressionStreamNative: typeof DecompressionStream != UNDEFINED_TYPE$1 && DecompressionStream
  17203. };
  17204. const config = Object$1.assign({}, DEFAULT_CONFIGURATION);
  17205. function getConfiguration() {
  17206. return config;
  17207. }
  17208. function getChunkSize(config) {
  17209. return Math$1.max(config.chunkSize, MINIMUM_CHUNK_SIZE);
  17210. }
  17211. function configure(configuration) {
  17212. const {
  17213. baseURL,
  17214. chunkSize,
  17215. maxWorkers,
  17216. terminateWorkerTimeout,
  17217. useCompressionStream,
  17218. useWebWorkers,
  17219. Deflate,
  17220. Inflate,
  17221. CompressionStream,
  17222. DecompressionStream,
  17223. workerScripts
  17224. } = configuration;
  17225. setIfDefined("baseURL", baseURL);
  17226. setIfDefined("chunkSize", chunkSize);
  17227. setIfDefined("maxWorkers", maxWorkers);
  17228. setIfDefined("terminateWorkerTimeout", terminateWorkerTimeout);
  17229. setIfDefined("useCompressionStream", useCompressionStream);
  17230. setIfDefined("useWebWorkers", useWebWorkers);
  17231. if (Deflate) {
  17232. config.CompressionStream = new StreamAdapter(Deflate);
  17233. }
  17234. if (Inflate) {
  17235. config.DecompressionStream = new StreamAdapter(Inflate);
  17236. }
  17237. setIfDefined("CompressionStream", CompressionStream);
  17238. setIfDefined("DecompressionStream", DecompressionStream);
  17239. if (workerScripts !== UNDEFINED_VALUE) {
  17240. const { deflate, inflate } = workerScripts;
  17241. if (deflate || inflate) {
  17242. if (!config.workerScripts) {
  17243. config.workerScripts = {};
  17244. }
  17245. }
  17246. if (deflate) {
  17247. if (!Array$1.isArray(deflate)) {
  17248. throw new Error$1("workerScripts.deflate must be an array");
  17249. }
  17250. config.workerScripts.deflate = deflate;
  17251. }
  17252. if (inflate) {
  17253. if (!Array$1.isArray(inflate)) {
  17254. throw new Error$1("workerScripts.inflate must be an array");
  17255. }
  17256. config.workerScripts.inflate = inflate;
  17257. }
  17258. }
  17259. }
  17260. function setIfDefined(propertyName, propertyValue) {
  17261. if (propertyValue !== UNDEFINED_VALUE) {
  17262. config[propertyName] = propertyValue;
  17263. }
  17264. }
  17265. function e(e){const t=()=>URL$2.createObjectURL(new Blob$2(['const{Array:e,Object:t,Number:n,Math:r,Error:s,Uint8Array:a,Uint16Array:i,Uint32Array:o,Int32Array:l,Map:c,DataView:h,Promise:f,TextEncoder:u,crypto:p,postMessage:d,TransformStream:g,ReadableStream:w,WritableStream:v,CompressionStream:y,DecompressionStream:b}=self;class m{constructor(e){return class extends g{constructor(t,n){const r=new e(n);super({transform(e,t){t.enqueue(r.append(e))},flush(e){const t=r.flush();t&&e.enqueue(t)}})}}}}const _=[];for(let e=0;256>e;e++){let t=e;for(let e=0;8>e;e++)1&t?t=t>>>1^3988292384:t>>>=1;_[e]=t}class k{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,r=0|e.length;r>n;n++)t=t>>>8^_[255&(t^e[n])];this.crc=t}get(){return~this.crc}}class S extends g{constructor(){let e;const t=new k;super({transform(e,n){t.append(e),n.enqueue(e)},flush(){const n=new a(4);new h(n.buffer).setUint32(0,t.get()),e.value=n}}),e=this}}const z={concat(e,t){if(0===e.length||0===t.length)return e.concat(t);const n=e[e.length-1],r=z.getPartial(n);return 32===r?e.concat(t):z._shiftRight(t,r,0|n,e.slice(0,e.length-1))},bitLength(e){const t=e.length;if(0===t)return 0;const n=e[t-1];return 32*(t-1)+z.getPartial(n)},clamp(e,t){if(32*e.length<t)return e;const n=(e=e.slice(0,r.ceil(t/32))).length;return t&=31,n>0&&t&&(e[n-1]=z.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>r.round(e/1099511627776)||32,_shiftRight(e,t,n,r){for(void 0===r&&(r=[]);t>=32;t-=32)r.push(n),n=0;if(0===t)return r.concat(e);for(let s=0;s<e.length;s++)r.push(n|e[s]>>>t),n=e[s]<<32-t;const s=e.length?e[e.length-1]:0,a=z.getPartial(s);return r.push(z.partial(t+a&31,t+a>32?n:r.pop(),1)),r}},D={bytes:{fromBits(e){const t=z.bitLength(e)/8,n=new a(t);let r;for(let s=0;t>s;s++)0==(3&s)&&(r=e[s/4]),n[s]=r>>>24,r<<=8;return n},toBits(e){const t=[];let n,r=0;for(n=0;n<e.length;n++)r=r<<8|e[n],3==(3&n)&&(t.push(r),r=0);return 3&n&&t.push(z.partial(8*(3&n),r)),t}}},C=class{constructor(e){const t=this;t.blockSize=512,t._init=[1732584193,4023233417,2562383102,271733878,3285377520],t._key=[1518500249,1859775393,2400959708,3395469782],e?(t._h=e._h.slice(0),t._buffer=e._buffer.slice(0),t._length=e._length):t.reset()}reset(){const e=this;return e._h=e._init.slice(0),e._buffer=[],e._length=0,e}update(e){const t=this;"string"==typeof e&&(e=D.utf8String.toBits(e));const n=t._buffer=z.concat(t._buffer,e),r=t._length,a=t._length=r+z.bitLength(e);if(a>9007199254740991)throw new s("Cannot hash more than 2^53 - 1 bits");const i=new o(n);let l=0;for(let e=t.blockSize+r-(t.blockSize+r&t.blockSize-1);a>=e;e+=t.blockSize)t._block(i.subarray(16*l,16*(l+1))),l+=1;return n.splice(0,16*l),t}finalize(){const e=this;let t=e._buffer;const n=e._h;t=z.concat(t,[z.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(r.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,r){return e>19?e>39?e>59?e>79?void 0:t^n^r:t&n|t&r|n&r:t^n^r:t&n|~t&r}_S(e,t){return t<<e|t>>>32-e}_block(t){const n=this,s=n._h,a=e(80);for(let e=0;16>e;e++)a[e]=t[e];let i=s[0],o=s[1],l=s[2],c=s[3],h=s[4];for(let e=0;79>=e;e++){16>e||(a[e]=n._S(1,a[e-3]^a[e-8]^a[e-14]^a[e-16]));const t=n._S(5,i)+n._f(e,o,l,c)+h+a[e]+n._key[r.floor(e/20)]|0;h=c,c=l,l=n._S(30,o),o=i,i=t}s[0]=s[0]+i|0,s[1]=s[1]+o|0,s[2]=s[2]+l|0,s[3]=s[3]+c|0,s[4]=s[4]+h|0}},I={getRandomValues(e){const t=new o(e.buffer),n=e=>{let t=987654321;const n=4294967295;return()=>(t=36969*(65535&t)+(t>>16)&n,(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(r.random()>.5?1:-1))};for(let s,a=0;a<e.length;a+=4){const e=n(4294967296*(s||r.random()));s=987654071*e(),t[a/4]=4294967296*e()|0}return e}},x={importKey:e=>new x.hmacSha1(D.bytes.toBits(e)),pbkdf2(e,t,n,r){if(n=n||1e4,0>r||0>n)throw new s("invalid params to pbkdf2");const a=1+(r>>5)<<2;let i,o,l,c,f;const u=new ArrayBuffer(a),p=new h(u);let d=0;const g=z;for(t=D.bytes.toBits(t),f=1;(a||1)>d;f++){for(i=o=e.encrypt(g.concat(t,[f])),l=1;n>l;l++)for(o=e.encrypt(o),c=0;c<o.length;c++)i[c]^=o[c];for(l=0;(a||1)>d&&l<i.length;l++)p.setInt32(d,i[l]),d+=4}return u.slice(0,r/8)},hmacSha1:class{constructor(e){const t=this,n=t._hash=C,r=[[],[]];t._baseHash=[new n,new n];const s=t._baseHash[0].blockSize/32;e.length>s&&(e=(new n).update(e).finalize());for(let t=0;s>t;t++)r[0][t]=909522486^e[t],r[1][t]=1549556828^e[t];t._baseHash[0].update(r[0]),t._baseHash[1].update(r[1]),t._resultHash=new n(t._baseHash[0])}reset(){const e=this;e._resultHash=new e._hash(e._baseHash[0]),e._updated=!1}update(e){this._updated=!0,this._resultHash.update(e)}digest(){const e=this,t=e._resultHash.finalize(),n=new e._hash(e._baseHash[1]).update(t).finalize();return e.reset(),n}encrypt(e){if(this._updated)throw new s("encrypt on already updated hmac called!");return this.update(e),this.digest(e)}}},A=void 0!==p&&"function"==typeof p.getRandomValues,T="Invalid password",R="Invalid signature",H="zipjs-abort-check-password";function q(e){return A?p.getRandomValues(e):I.getRandomValues(e)}const B=16,K={name:"PBKDF2"},V=t.assign({hash:{name:"HMAC"}},K),P=t.assign({iterations:1e3,hash:{name:"SHA-1"}},K),E=["deriveBits"],U=[8,12,16],W=[16,24,32],M=10,N=[0,0,0,0],O="undefined",F="function",L=typeof p!=O,j=L&&p.subtle,G=L&&typeof j!=O,X=D.bytes,J=class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],r=t._tables[1],a=e.length;let i,o,l,c=1;if(4!==a&&6!==a&&8!==a)throw new s("invalid aes key size");for(t._key=[o=e.slice(0),l=[]],i=a;4*a+28>i;i++){let e=o[i-1];(i%a==0||8===a&&i%a==4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],i%a==0&&(e=e<<8^e>>>24^c<<24,c=c<<1^283*(c>>7))),o[i]=o[i-a]^e}for(let e=0;i;e++,i--){const t=o[3&e?i:i-4];l[e]=4>=i||4>e?t:r[0][n[t>>>24]]^r[1][n[t>>16&255]]^r[2][n[t>>8&255]]^r[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],r=t[4],s=[],a=[];let i,o,l,c;for(let e=0;256>e;e++)a[(s[e]=e<<1^283*(e>>7))^e]=e;for(let h=i=0;!n[h];h^=o||1,i=a[i]||1){let a=i^i<<1^i<<2^i<<3^i<<4;a=a>>8^255&a^99,n[h]=a,r[a]=h,c=s[l=s[o=s[h]]];let f=16843009*c^65537*l^257*o^16843008*h,u=257*s[a]^16843008*a;for(let n=0;4>n;n++)e[n][h]=u=u<<24^u>>>8,t[n][a]=f=f<<24^f>>>8}for(let n=0;5>n;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new s("invalid aes block size");const n=this._key[t],r=n.length/4-2,a=[0,0,0,0],i=this._tables[t],o=i[0],l=i[1],c=i[2],h=i[3],f=i[4];let u,p,d,g=e[0]^n[0],w=e[t?3:1]^n[1],v=e[2]^n[2],y=e[t?1:3]^n[3],b=4;for(let e=0;r>e;e++)u=o[g>>>24]^l[w>>16&255]^c[v>>8&255]^h[255&y]^n[b],p=o[w>>>24]^l[v>>16&255]^c[y>>8&255]^h[255&g]^n[b+1],d=o[v>>>24]^l[y>>16&255]^c[g>>8&255]^h[255&w]^n[b+2],y=o[y>>>24]^l[g>>16&255]^c[w>>8&255]^h[255&v]^n[b+3],b+=4,g=u,w=p,v=d;for(let e=0;4>e;e++)a[t?3&-e:e]=f[g>>>24]<<24^f[w>>16&255]<<16^f[v>>8&255]<<8^f[255&y]^n[b++],u=g,g=w,w=v,v=y,y=u;return a}},Q=class{constructor(e,t){this._prf=e,this._initIv=t,this._iv=t}reset(){this._iv=this._initIv}update(e){return this.calculate(this._prf,e,this._iv)}incWord(e){if(255==(e>>24&255)){let t=e>>16&255,n=e>>8&255,r=255&e;255===t?(t=0,255===n?(n=0,255===r?r=0:++r):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=r}else e+=1<<24;return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let r;if(!(r=t.length))return[];const s=z.bitLength(t);for(let s=0;r>s;s+=4){this.incCounter(n);const r=e.encrypt(n);t[s]^=r[0],t[s+1]^=r[1],t[s+2]^=r[2],t[s+3]^=r[3]}return z.clamp(t,s)}},Y=x.hmacSha1;let Z=L&&G&&typeof j.importKey==F,$=L&&G&&typeof j.deriveBits==F;class ee extends g{constructor({password:e,signed:n,encryptionStrength:r,checkPasswordOnly:i}){super({start(){t.assign(this,{ready:new f((e=>this.resolveReady=e)),password:e,signed:n,strength:r-1,pending:new a})},async transform(e,t){const n=this,{password:r,strength:o,resolveReady:l,ready:c}=n;r?(await(async(e,t,n,r)=>{const a=await re(e,t,n,ae(r,0,U[t])),i=ae(r,U[t]);if(a[0]!=i[0]||a[1]!=i[1])throw new s(T)})(n,o,r,ae(e,0,U[o]+2)),e=ae(e,U[o]+2),i?t.error(new s(H)):l()):await c;const h=new a(e.length-M-(e.length-M)%B);t.enqueue(ne(n,e,h,0,M,!0))},async flush(e){const{signed:t,ctr:n,hmac:r,pending:i,ready:o}=this;if(r&&n){await o;const l=ae(i,0,i.length-M),c=ae(i,i.length-M);let h=new a;if(l.length){const e=oe(X,l);r.update(e);const t=n.update(e);h=ie(X,t)}if(t){const e=ae(ie(X,r.digest()),0,M);for(let t=0;M>t;t++)if(e[t]!=c[t])throw new s(R)}e.enqueue(h)}}})}}class te extends g{constructor({password:e,encryptionStrength:n}){let r;super({start(){t.assign(this,{ready:new f((e=>this.resolveReady=e)),password:e,strength:n-1,pending:new a})},async transform(e,t){const n=this,{password:r,strength:s,resolveReady:i,ready:o}=n;let l=new a;r?(l=await(async(e,t,n)=>{const r=q(new a(U[t]));return se(r,await re(e,t,n,r))})(n,s,r),i()):await o;const c=new a(l.length+e.length-e.length%B);c.set(l,0),t.enqueue(ne(n,e,c,l.length,0))},async flush(e){const{ctr:t,hmac:n,pending:s,ready:i}=this;if(n&&t){await i;let o=new a;if(s.length){const e=t.update(oe(X,s));n.update(e),o=ie(X,e)}r.signature=ie(X,n.digest()).slice(0,M),e.enqueue(se(o,r.signature))}}}),r=this}}function ne(e,t,n,r,s,i){const{ctr:o,hmac:l,pending:c}=e,h=t.length-s;let f;for(c.length&&(t=se(c,t),n=((e,t)=>{if(t&&t>e.length){const n=e;(e=new a(t)).set(n,0)}return e})(n,h-h%B)),f=0;h-B>=f;f+=B){const e=oe(X,ae(t,f,f+B));i&&l.update(e);const s=o.update(e);i||l.update(s),n.set(ie(X,s),f+r)}return e.pending=ae(t,f),n}async function re(n,r,s,i){n.password=null;const o=(e=>{if(void 0===u){const t=new a((e=unescape(encodeURIComponent(e))).length);for(let n=0;n<t.length;n++)t[n]=e.charCodeAt(n);return t}return(new u).encode(e)})(s),l=await(async(e,t,n,r,s)=>{if(!Z)return x.importKey(t);try{return await j.importKey("raw",t,n,!1,s)}catch(e){return Z=!1,x.importKey(t)}})(0,o,V,0,E),c=await(async(e,t,n)=>{if(!$)return x.pbkdf2(t,e.salt,P.iterations,n);try{return await j.deriveBits(e,t,n)}catch(r){return $=!1,x.pbkdf2(t,e.salt,P.iterations,n)}})(t.assign({salt:i},P),l,8*(2*W[r]+2)),h=new a(c),f=oe(X,ae(h,0,W[r])),p=oe(X,ae(h,W[r],2*W[r])),d=ae(h,2*W[r]);return t.assign(n,{keys:{key:f,authentication:p,passwordVerification:d},ctr:new Q(new J(f),e.from(N)),hmac:new Y(p)}),d}function se(e,t){let n=e;return e.length+t.length&&(n=new a(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function ae(e,t,n){return e.subarray(t,n)}function ie(e,t){return e.fromBits(t)}function oe(e,t){return e.toBits(t)}class le extends g{constructor({password:e,passwordVerification:n,checkPasswordOnly:r}){super({start(){t.assign(this,{password:e,passwordVerification:n}),ue(this,e)},transform(e,t){const n=this;if(n.password){const t=he(n,e.subarray(0,12));if(n.password=null,t[11]!=n.passwordVerification)throw new s(T);e=e.subarray(12)}r?t.error(new s(H)):t.enqueue(he(n,e))}})}}class ce extends g{constructor({password:e,passwordVerification:n}){super({start(){t.assign(this,{password:e,passwordVerification:n}),ue(this,e)},transform(e,t){const n=this;let r,s;if(n.password){n.password=null;const t=q(new a(12));t[11]=n.passwordVerification,r=new a(e.length+t.length),r.set(fe(n,t),0),s=12}else r=new a(e.length),s=0;r.set(fe(n,e),s),t.enqueue(r)}})}}function he(e,t){const n=new a(t.length);for(let r=0;r<t.length;r++)n[r]=de(e)^t[r],pe(e,n[r]);return n}function fe(e,t){const n=new a(t.length);for(let r=0;r<t.length;r++)n[r]=de(e)^t[r],pe(e,t[r]);return n}function ue(e,n){const r=[305419896,591751049,878082192];t.assign(e,{keys:r,crcKey0:new k(r[0]),crcKey2:new k(r[2])});for(let t=0;t<n.length;t++)pe(e,n.charCodeAt(t))}function pe(e,t){let[n,s,a]=e.keys;e.crcKey0.append([t]),n=~e.crcKey0.get(),s=we(r.imul(we(s+ge(n)),134775813)+1),e.crcKey2.append([s>>>24]),a=~e.crcKey2.get(),e.keys=[n,s,a]}function de(e){const t=2|e.keys[2];return ge(r.imul(t,1^t)>>>8)}function ge(e){return 255&e}function we(e){return 4294967295&e}const ve="deflate-raw";class ye extends g{constructor(e,{chunkSize:t,CompressionStream:n,CompressionStreamNative:r}){super({});const{compressed:s,encrypted:a,useCompressionStream:i,zipCrypto:o,signed:l,level:c}=e,f=this;let u,p,d=me(super.readable);a&&!o||!l||(u=new S,d=Se(d,u)),s&&(d=ke(d,i,{level:c,chunkSize:t},r,n)),a&&(o?d=Se(d,new ce(e)):(p=new te(e),d=Se(d,p))),_e(f,d,(()=>{let e;a&&!o&&(e=p.signature),a&&!o||!l||(e=new h(u.value.buffer).getUint32(0)),f.signature=e}))}}class be extends g{constructor(e,{chunkSize:t,DecompressionStream:n,DecompressionStreamNative:r}){super({});const{zipCrypto:a,encrypted:i,signed:o,signature:l,compressed:c,useCompressionStream:f}=e;let u,p,d=me(super.readable);i&&(a?d=Se(d,new le(e)):(p=new ee(e),d=Se(d,p))),c&&(d=ke(d,f,{chunkSize:t},r,n)),i&&!a||!o||(u=new S,d=Se(d,u)),_e(this,d,(()=>{if((!i||a)&&o){const e=new h(u.value.buffer);if(l!=e.getUint32(0,!1))throw new s(R)}}))}}function me(e){return Se(e,new g({transform(e,t){e&&e.length&&t.enqueue(e)}}))}function _e(e,n,r){n=Se(n,new g({flush:r})),t.defineProperty(e,"readable",{get:()=>n})}function ke(e,t,n,r,s){try{e=Se(e,new(t&&r?r:s)(ve,n))}catch(r){if(!t)throw r;e=Se(e,new s(ve,n))}return e}function Se(e,t){return e.pipeThrough(t)}const ze="data";class De extends g{constructor(e,n){super({});const r=this,{codecType:s}=e;let a;s.startsWith("deflate")?a=ye:s.startsWith("inflate")&&(a=be);let i=0;const o=new a(e,n),l=super.readable,c=new g({transform(e,t){e&&e.length&&(i+=e.length,t.enqueue(e))},flush(){const{signature:e}=o;t.assign(r,{signature:e,size:i})}});t.defineProperty(r,"readable",{get:()=>l.pipeThrough(o).pipeThrough(c)})}}const Ce=new c,Ie=new c;let xe=0;async function Ae(e){try{const{options:t,scripts:r,config:s}=e;r&&r.length&&importScripts.apply(void 0,r),self.initCodec&&self.initCodec(),s.CompressionStreamNative=self.CompressionStream,s.DecompressionStreamNative=self.DecompressionStream,self.Deflate&&(s.CompressionStream=new m(self.Deflate)),self.Inflate&&(s.DecompressionStream=new m(self.Inflate));const a={highWaterMark:1,size:()=>s.chunkSize},i=e.readable||new w({async pull(e){const t=new f((e=>Ce.set(xe,e)));Te({type:"pull",messageId:xe}),xe=(xe+1)%n.MAX_SAFE_INTEGER;const{value:r,done:s}=await t;e.enqueue(r),s&&e.close()}},a),o=e.writable||new v({async write(e){let t;const r=new f((e=>t=e));Ie.set(xe,t),Te({type:ze,value:e,messageId:xe}),xe=(xe+1)%n.MAX_SAFE_INTEGER,await r}},a),l=new De(t,s);await i.pipeThrough(l).pipeTo(o,{preventClose:!0,preventAbort:!0});try{await o.getWriter().close()}catch(e){}const{signature:c,size:h}=l;Te({type:"close",result:{signature:c,size:h}})}catch(e){Re(e)}}function Te(e){let{value:t}=e;if(t)if(t.length)try{t=new a(t),e.value=t.buffer,d(e,[e.value])}catch(t){d(e)}else d(e);else d(e)}function Re(e=new s("Unknown error")){const{message:t,stack:n,code:r,name:a}=e;d({error:{message:t,stack:n,code:r,name:a}})}addEventListener("message",(({data:e})=>{const{type:t,messageId:n,value:r,done:s}=e;try{if("start"==t&&Ae(e),t==ze){const e=Ce.get(n);Ce.delete(n),e({value:new a(r),done:s})}if("ack"==t){const e=Ie.get(n);Ie.delete(n),e()}}catch(e){Re(e)}}));var He=a,qe=i,Be=l,Ke=new He([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Ve=new He([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Pe=new He([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Ee=(e,t)=>{for(var n=new qe(31),r=0;31>r;++r)n[r]=t+=1<<e[r-1];var s=new Be(n[30]);for(r=1;30>r;++r)for(var a=n[r];a<n[r+1];++a)s[a]=a-n[r]<<5|r;return{b:n,r:s}},Ue=Ee(Ke,2),We=Ue.b,Me=Ue.r;We[28]=258,Me[258]=28;for(var Ne=Ee(Ve,0),Oe=Ne.b,Fe=Ne.r,Le=new qe(32768),je=0;32768>je;++je){var Ge=(43690&je)>>1|(21845&je)<<1;Ge=(61680&(Ge=(52428&Ge)>>2|(13107&Ge)<<2))>>4|(3855&Ge)<<4,Le[je]=((65280&Ge)>>8|(255&Ge)<<8)>>1}var Xe=(e,t,n)=>{for(var r=e.length,s=0,a=new qe(t);r>s;++s)e[s]&&++a[e[s]-1];var i,o=new qe(t);for(s=1;t>s;++s)o[s]=o[s-1]+a[s-1]<<1;if(n){i=new qe(1<<t);var l=15-t;for(s=0;r>s;++s)if(e[s])for(var c=s<<4|e[s],h=t-e[s],f=o[e[s]-1]++<<h,u=f|(1<<h)-1;u>=f;++f)i[Le[f]>>l]=c}else for(i=new qe(r),s=0;r>s;++s)e[s]&&(i[s]=Le[o[e[s]-1]++]>>15-e[s]);return i},Je=new He(288);for(je=0;144>je;++je)Je[je]=8;for(je=144;256>je;++je)Je[je]=9;for(je=256;280>je;++je)Je[je]=7;for(je=280;288>je;++je)Je[je]=8;var Qe=new He(32);for(je=0;32>je;++je)Qe[je]=5;var Ye=Xe(Je,9,0),Ze=Xe(Je,9,1),$e=Xe(Qe,5,0),et=Xe(Qe,5,1),tt=e=>{for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},nt=(e,t,n)=>{var r=t/8|0;return(e[r]|e[r+1]<<8)>>(7&t)&n},rt=(e,t)=>{var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(7&t)},st=e=>(e+7)/8|0,at=(e,t,n)=>((null==t||0>t)&&(t=0),(null==n||n>e.length)&&(n=e.length),new He(e.subarray(t,n))),it=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],ot=(e,t,n)=>{var r=new s(t||it[e]);if(r.code=e,s.captureStackTrace&&s.captureStackTrace(r,ot),!n)throw r;return r},lt=(e,t,n)=>{n<<=7&t;var r=t/8|0;e[r]|=n,e[r+1]|=n>>8},ct=(e,t,n)=>{n<<=7&t;var r=t/8|0;e[r]|=n,e[r+1]|=n>>8,e[r+2]|=n>>16},ht=(e,t)=>{for(var n=[],r=0;r<e.length;++r)e[r]&&n.push({s:r,f:e[r]});var s=n.length,a=n.slice();if(!s)return{t:vt,l:0};if(1==s){var i=new He(n[0].s+1);return i[n[0].s]=1,{t:i,l:1}}n.sort(((e,t)=>e.f-t.f)),n.push({s:-1,f:25001});var o=n[0],l=n[1],c=0,h=1,f=2;for(n[0]={s:-1,f:o.f+l.f,l:o,r:l};h!=s-1;)o=n[n[c].f<n[f].f?c++:f++],l=n[c!=h&&n[c].f<n[f].f?c++:f++],n[h++]={s:-1,f:o.f+l.f,l:o,r:l};var u=a[0].s;for(r=1;s>r;++r)a[r].s>u&&(u=a[r].s);var p=new qe(u+1),d=ft(n[h-1],p,0);if(d>t){r=0;var g=0,w=d-t,v=1<<w;for(a.sort(((e,t)=>p[t.s]-p[e.s]||e.f-t.f));s>r;++r){var y=a[r].s;if(p[y]<=t)break;g+=v-(1<<d-p[y]),p[y]=t}for(g>>=w;g>0;){var b=a[r].s;p[b]<t?g-=1<<t-p[b]++-1:++r}for(;r>=0&&g;--r){var m=a[r].s;p[m]==t&&(--p[m],++g)}d=t}return{t:new He(p),l:d}},ft=(e,t,n)=>-1==e.s?r.max(ft(e.l,t,n+1),ft(e.r,t,n+1)):t[e.s]=n,ut=e=>{for(var t=e.length;t&&!e[--t];);for(var n=new qe(++t),r=0,s=e[0],a=1,i=e=>{n[r++]=e},o=1;t>=o;++o)if(e[o]==s&&o!=t)++a;else{if(!s&&a>2){for(;a>138;a-=138)i(32754);a>2&&(i(a>10?a-11<<5|28690:a-3<<5|12305),a=0)}else if(a>3){for(i(s),--a;a>6;a-=6)i(8304);a>2&&(i(a-3<<5|8208),a=0)}for(;a--;)i(s);a=1,s=e[o]}return{c:n.subarray(0,r),n:t}},pt=(e,t)=>{for(var n=0,r=0;r<t.length;++r)n+=e[r]*t[r];return n},dt=(e,t,n)=>{var r=n.length,s=st(t+2);e[s]=255&r,e[s+1]=r>>8,e[s+2]=255^e[s],e[s+3]=255^e[s+1];for(var a=0;r>a;++a)e[s+a+4]=n[a];return 8*(s+4+r)},gt=(e,t,n,r,s,a,i,o,l,c,h)=>{lt(t,h++,n),++s[256];for(var f=ht(s,15),u=f.t,p=f.l,d=ht(a,15),g=d.t,w=d.l,v=ut(u),y=v.c,b=v.n,m=ut(g),_=m.c,k=m.n,S=new qe(19),z=0;z<y.length;++z)++S[31&y[z]];for(z=0;z<_.length;++z)++S[31&_[z]];for(var D=ht(S,7),C=D.t,I=D.l,x=19;x>4&&!C[Pe[x-1]];--x);var A,T,R,H,q=c+5<<3,B=pt(s,Je)+pt(a,Qe)+i,K=pt(s,u)+pt(a,g)+i+14+3*x+pt(S,C)+2*S[16]+3*S[17]+7*S[18];if(l>=0&&B>=q&&K>=q)return dt(t,h,e.subarray(l,l+c));if(lt(t,h,1+(B>K)),h+=2,B>K){A=Xe(u,p,0),T=u,R=Xe(g,w,0),H=g;var V=Xe(C,I,0);for(lt(t,h,b-257),lt(t,h+5,k-1),lt(t,h+10,x-4),h+=14,z=0;x>z;++z)lt(t,h+3*z,C[Pe[z]]);h+=3*x;for(var P=[y,_],E=0;2>E;++E){var U=P[E];for(z=0;z<U.length;++z){var W=31&U[z];lt(t,h,V[W]),h+=C[W],W>15&&(lt(t,h,U[z]>>5&127),h+=U[z]>>12)}}}else A=Ye,T=Je,R=$e,H=Qe;for(z=0;o>z;++z){var M=r[z];if(M>255){ct(t,h,A[257+(W=M>>18&31)]),h+=T[W+257],W>7&&(lt(t,h,M>>23&31),h+=Ke[W]);var N=31&M;ct(t,h,R[N]),h+=H[N],N>3&&(ct(t,h,M>>5&8191),h+=Ve[N])}else ct(t,h,A[M]),h+=T[M]}return ct(t,h,A[256]),h+T[256]},wt=new Be([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),vt=new He(0),yt=function(){function e(e,t){if("function"==typeof e&&(t=e,e={}),this.ondata=t,this.o=e||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new He(98304),this.o.dictionary){var n=this.o.dictionary.subarray(-32768);this.b.set(n,32768-n.length),this.s.i=32768-n.length}}return e.prototype.p=function(e,t){this.ondata(((e,t,n,s,a)=>{if(!a&&(a={l:1},t.dictionary)){var i=t.dictionary.subarray(-32768),o=new He(i.length+e.length);o.set(i),o.set(e,i.length),e=o,a.w=i.length}return((e,t,n,s,a,i)=>{var o=i.z||e.length,l=new He(0+o+5*(1+r.ceil(o/7e3))+0),c=l.subarray(0,l.length-0),h=i.l,f=7&(i.r||0);if(t){f&&(c[0]=i.r>>3);for(var u=wt[t-1],p=u>>13,d=8191&u,g=(1<<n)-1,w=i.p||new qe(32768),v=i.h||new qe(g+1),y=r.ceil(n/3),b=2*y,m=t=>(e[t]^e[t+1]<<y^e[t+2]<<b)&g,_=new Be(25e3),k=new qe(288),S=new qe(32),z=0,D=0,C=i.i||0,I=0,x=i.w||0,A=0;o>C+2;++C){var T=m(C),R=32767&C,H=v[T];if(w[R]=H,v[T]=R,C>=x){var q=o-C;if((z>7e3||I>24576)&&(q>423||!h)){f=gt(e,c,0,_,k,S,D,I,A,C-A,f),I=z=D=0,A=C;for(var B=0;286>B;++B)k[B]=0;for(B=0;30>B;++B)S[B]=0}var K=2,V=0,P=d,E=R-H&32767;if(q>2&&T==m(C-E))for(var U=r.min(p,q)-1,W=r.min(32767,C),M=r.min(258,q);W>=E&&--P&&R!=H;){if(e[C+K]==e[C+K-E]){for(var N=0;M>N&&e[C+N]==e[C+N-E];++N);if(N>K){if(K=N,V=E,N>U)break;var O=r.min(E,N-2),F=0;for(B=0;O>B;++B){var L=C-E+B&32767,j=L-w[L]&32767;j>F&&(F=j,H=L)}}}E+=(R=H)-(H=w[R])&32767}if(V){_[I++]=268435456|Me[K]<<18|Fe[V];var G=31&Me[K],X=31&Fe[V];D+=Ke[G]+Ve[X],++k[257+G],++S[X],x=C+K,++z}else _[I++]=e[C],++k[e[C]]}}for(C=r.max(C,x);o>C;++C)_[I++]=e[C],++k[e[C]];f=gt(e,c,h,_,k,S,D,I,A,C-A,f),h||(i.r=7&f|c[f/8|0]<<3,f-=7,i.h=v,i.p=w,i.i=C,i.w=x)}else{for(C=i.w||0;o+h>C;C+=65535){var J=C+65535;o>J||(c[f/8|0]=h,J=o),f=dt(c,f+1,e.subarray(C,J))}i.i=o}return at(l,0,0+st(f)+0)})(e,null==t.level?6:t.level,null==t.mem?r.ceil(1.5*r.max(8,r.min(13,r.log(e.length)))):12+t.mem,0,0,a)})(e,this.o,0,0,this.s),t)},e.prototype.push=function(e,t){this.ondata||ot(5),this.s.l&&ot(4);var n=e.length+this.s.z;if(n>this.b.length){if(n>2*this.b.length-32768){var r=new He(-32768&n);r.set(this.b.subarray(0,this.s.z)),this.b=r}var s=this.b.length-this.s.z;s&&(this.b.set(e.subarray(0,s),this.s.z),this.s.z=this.b.length,this.p(this.b,!1)),this.b.set(this.b.subarray(-32768)),this.b.set(e.subarray(s),32768),this.s.z=e.length-s+32768,this.s.i=32766,this.s.w=32768}else this.b.set(e,this.s.z),this.s.z+=e.length;this.s.l=1&t,(this.s.z>this.s.w+8191||t)&&(this.p(this.b,t||!1),this.s.w=this.s.i,this.s.i-=2)},e}(),bt=function(){function e(e,t){"function"==typeof e&&(t=e,e={}),this.ondata=t;var n=e&&e.dictionary&&e.dictionary.subarray(-32768);this.s={i:0,b:n?n.length:0},this.o=new He(32768),this.p=new He(0),n&&this.o.set(n)}return e.prototype.e=function(e){if(this.ondata||ot(5),this.d&&ot(4),this.p.length){if(e.length){var t=new He(this.p.length+e.length);t.set(this.p),t.set(e,this.p.length),this.p=t}}else this.p=e},e.prototype.c=function(e){this.s.i=+(this.d=e||!1);var t=this.s.b,n=((e,t,n)=>{var s=e.length;if(!s||t.f&&!t.l)return n||new He(0);var a=!n,i=a||2!=t.i,o=t.i;a&&(n=new He(3*s));var l=e=>{var t=n.length;if(e>t){var s=new He(r.max(2*t,e));s.set(n),n=s}},c=t.f||0,h=t.p||0,f=t.b||0,u=t.l,p=t.d,d=t.m,g=t.n,w=8*s;do{if(!u){c=nt(e,h,1);var v=nt(e,h+1,3);if(h+=3,!v){var y=e[(A=st(h)+4)-4]|e[A-3]<<8,b=A+y;if(b>s){o&&ot(0);break}i&&l(f+y),n.set(e.subarray(A,b),f),t.b=f+=y,t.p=h=8*b,t.f=c;continue}if(1==v)u=Ze,p=et,d=9,g=5;else if(2==v){var m=nt(e,h,31)+257,_=nt(e,h+10,15)+4,k=m+nt(e,h+5,31)+1;h+=14;for(var S=new He(k),z=new He(19),D=0;_>D;++D)z[Pe[D]]=nt(e,h+3*D,7);h+=3*_;var C=tt(z),I=(1<<C)-1,x=Xe(z,C,1);for(D=0;k>D;){var A,T=x[nt(e,h,I)];if(h+=15&T,16>(A=T>>4))S[D++]=A;else{var R=0,H=0;for(16==A?(H=3+nt(e,h,3),h+=2,R=S[D-1]):17==A?(H=3+nt(e,h,7),h+=3):18==A&&(H=11+nt(e,h,127),h+=7);H--;)S[D++]=R}}var q=S.subarray(0,m),B=S.subarray(m);d=tt(q),g=tt(B),u=Xe(q,d,1),p=Xe(B,g,1)}else ot(1);if(h>w){o&&ot(0);break}}i&&l(f+131072);for(var K=(1<<d)-1,V=(1<<g)-1,P=h;;P=h){var E=(R=u[rt(e,h)&K])>>4;if((h+=15&R)>w){o&&ot(0);break}if(R||ot(2),256>E)n[f++]=E;else{if(256==E){P=h,u=null;break}var U=E-254;if(E>264){var W=Ke[D=E-257];U=nt(e,h,(1<<W)-1)+We[D],h+=W}var M=p[rt(e,h)&V],N=M>>4;if(M||ot(3),h+=15&M,B=Oe[N],N>3&&(W=Ve[N],B+=rt(e,h)&(1<<W)-1,h+=W),h>w){o&&ot(0);break}i&&l(f+131072);var O=f+U;if(B>f){var F=0-B,L=r.min(B,O);for(0>F+f&&ot(3);L>f;++f)n[f]=undefined[F+f]}for(;O>f;++f)n[f]=n[f-B]}}t.l=u,t.p=P,t.b=f,t.f=c,u&&(c=1,t.m=d,t.d=p,t.n=g)}while(!c);return f!=n.length&&a?at(n,0,f):n.subarray(0,f)})(this.p,this.s,this.o);this.ondata(at(n,t,this.s.b),this.d),this.o=at(n,this.s.b-32768),this.s.b=this.o.length,this.p=at(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(e,t){this.e(e),this.c(t)},e}(),mt="undefined"!=typeof TextDecoder&&new TextDecoder;try{mt.decode(vt,{stream:!0})}catch(e){}function _t(e,n,r){return class{constructor(s){const i=this;var o,l;o=s,l="level",("function"==typeof t.hasOwn?t.hasOwn(o,l):o.hasOwnProperty(l))&&void 0===s.level&&delete s.level,i.codec=new e(t.assign({},n,s)),r(i.codec,(e=>{if(i.pendingData){const t=i.pendingData;i.pendingData=new a(t.length+e.length);const{pendingData:n}=i;n.set(t,0),n.set(e,t.length)}else i.pendingData=new a(e)}))}append(e){return this.codec.push(e),s(this)}flush(){return this.codec.push(new a,!0),s(this)}};function s(e){if(e.pendingData){const t=e.pendingData;return e.pendingData=null,t}return new a}}const{Deflate:kt,Inflate:St}=((e,t={},n)=>({Deflate:_t(e.Deflate,t.deflate,n),Inflate:_t(e.Inflate,t.inflate,n)}))({Deflate:yt,Inflate:bt},void 0,((e,t)=>e.ondata=t));self.initCodec=()=>{self.Deflate=kt,self.Inflate=St};\n'],{type:"text/javascript"}));e({workerScripts:{inflate:[t],deflate:[t]}});}
  17266. /*
  17267. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  17268. Redistribution and use in source and binary forms, with or without
  17269. modification, are permitted provided that the following conditions are met:
  17270. 1. Redistributions of source code must retain the above copyright notice,
  17271. this list of conditions and the following disclaimer.
  17272. 2. Redistributions in binary form must reproduce the above copyright
  17273. notice, this list of conditions and the following disclaimer in
  17274. the documentation and/or other materials provided with the distribution.
  17275. 3. The names of the authors may not be used to endorse or promote products
  17276. derived from this software without specific prior written permission.
  17277. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  17278. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  17279. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  17280. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  17281. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  17282. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  17283. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  17284. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  17285. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  17286. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  17287. */
  17288. function getMimeType() {
  17289. return "application/octet-stream";
  17290. }
  17291. function initShimAsyncCodec(library, options = {}, registerDataHandler) {
  17292. return {
  17293. Deflate: createCodecClass(library.Deflate, options.deflate, registerDataHandler),
  17294. Inflate: createCodecClass(library.Inflate, options.inflate, registerDataHandler)
  17295. };
  17296. }
  17297. function objectHasOwn(object, propertyName) {
  17298. // eslint-disable-next-line no-prototype-builtins
  17299. return typeof Object$1.hasOwn === "function" ? Object$1.hasOwn(object, propertyName) : object.hasOwnProperty(propertyName);
  17300. }
  17301. function createCodecClass(constructor, constructorOptions, registerDataHandler) {
  17302. return class {
  17303. constructor(options) {
  17304. const codecAdapter = this;
  17305. const onData = data => {
  17306. if (codecAdapter.pendingData) {
  17307. const previousPendingData = codecAdapter.pendingData;
  17308. codecAdapter.pendingData = new Uint8Array$1(previousPendingData.length + data.length);
  17309. const { pendingData } = codecAdapter;
  17310. pendingData.set(previousPendingData, 0);
  17311. pendingData.set(data, previousPendingData.length);
  17312. } else {
  17313. codecAdapter.pendingData = new Uint8Array$1(data);
  17314. }
  17315. };
  17316. if (objectHasOwn(options, "level") && options.level === undefined) {
  17317. delete options.level;
  17318. }
  17319. codecAdapter.codec = new constructor(Object$1.assign({}, constructorOptions, options));
  17320. registerDataHandler(codecAdapter.codec, onData);
  17321. }
  17322. append(data) {
  17323. this.codec.push(data);
  17324. return getResponse(this);
  17325. }
  17326. flush() {
  17327. this.codec.push(new Uint8Array$1(), true);
  17328. return getResponse(this);
  17329. }
  17330. };
  17331. function getResponse(codec) {
  17332. if (codec.pendingData) {
  17333. const output = codec.pendingData;
  17334. codec.pendingData = null;
  17335. return output;
  17336. } else {
  17337. return new Uint8Array$1();
  17338. }
  17339. }
  17340. }
  17341. /*
  17342. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  17343. Redistribution and use in source and binary forms, with or without
  17344. modification, are permitted provided that the following conditions are met:
  17345. 1. Redistributions of source code must retain the above copyright notice,
  17346. this list of conditions and the following disclaimer.
  17347. 2. Redistributions in binary form must reproduce the above copyright
  17348. notice, this list of conditions and the following disclaimer in
  17349. the documentation and/or other materials provided with the distribution.
  17350. 3. The names of the authors may not be used to endorse or promote products
  17351. derived from this software without specific prior written permission.
  17352. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  17353. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  17354. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  17355. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  17356. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  17357. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  17358. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  17359. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  17360. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  17361. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  17362. */
  17363. const table = [];
  17364. for (let i = 0; i < 256; i++) {
  17365. let t = i;
  17366. for (let j = 0; j < 8; j++) {
  17367. if (t & 1) {
  17368. t = (t >>> 1) ^ 0xEDB88320;
  17369. } else {
  17370. t = t >>> 1;
  17371. }
  17372. }
  17373. table[i] = t;
  17374. }
  17375. class Crc32 {
  17376. constructor(crc) {
  17377. this.crc = crc || -1;
  17378. }
  17379. append(data) {
  17380. let crc = this.crc | 0;
  17381. for (let offset = 0, length = data.length | 0; offset < length; offset++) {
  17382. crc = (crc >>> 8) ^ table[(crc ^ data[offset]) & 0xFF];
  17383. }
  17384. this.crc = crc;
  17385. }
  17386. get() {
  17387. return ~this.crc;
  17388. }
  17389. }
  17390. /*
  17391. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  17392. Redistribution and use in source and binary forms, with or without
  17393. modification, are permitted provided that the following conditions are met:
  17394. 1. Redistributions of source code must retain the above copyright notice,
  17395. this list of conditions and the following disclaimer.
  17396. 2. Redistributions in binary form must reproduce the above copyright
  17397. notice, this list of conditions and the following disclaimer in
  17398. the documentation and/or other materials provided with the distribution.
  17399. 3. The names of the authors may not be used to endorse or promote products
  17400. derived from this software without specific prior written permission.
  17401. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  17402. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  17403. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  17404. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  17405. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  17406. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  17407. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  17408. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  17409. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  17410. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  17411. */
  17412. class Crc32Stream extends TransformStream {
  17413. constructor() {
  17414. let stream;
  17415. const crc32 = new Crc32();
  17416. super({
  17417. transform(chunk, controller) {
  17418. crc32.append(chunk);
  17419. controller.enqueue(chunk);
  17420. },
  17421. flush() {
  17422. const value = new Uint8Array$1(4);
  17423. const dataView = new DataView$1(value.buffer);
  17424. dataView.setUint32(0, crc32.get());
  17425. stream.value = value;
  17426. }
  17427. });
  17428. stream = this;
  17429. }
  17430. }
  17431. /*
  17432. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  17433. Redistribution and use in source and binary forms, with or without
  17434. modification, are permitted provided that the following conditions are met:
  17435. 1. Redistributions of source code must retain the above copyright notice,
  17436. this list of conditions and the following disclaimer.
  17437. 2. Redistributions in binary form must reproduce the above copyright
  17438. notice, this list of conditions and the following disclaimer in
  17439. the documentation and/or other materials provided with the distribution.
  17440. 3. The names of the authors may not be used to endorse or promote products
  17441. derived from this software without specific prior written permission.
  17442. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  17443. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  17444. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  17445. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  17446. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  17447. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  17448. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  17449. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  17450. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  17451. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  17452. */
  17453. function encodeText(value) {
  17454. if (typeof TextEncoder == "undefined") {
  17455. value = unescape(encodeURIComponent(value));
  17456. const result = new Uint8Array$1(value.length);
  17457. for (let i = 0; i < result.length; i++) {
  17458. result[i] = value.charCodeAt(i);
  17459. }
  17460. return result;
  17461. } else {
  17462. return new TextEncoder().encode(value);
  17463. }
  17464. }
  17465. // Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
  17466. // deno-lint-ignore-file no-this-alias
  17467. /*
  17468. * SJCL is open. You can use, modify and redistribute it under a BSD
  17469. * license or under the GNU GPL, version 2.0.
  17470. */
  17471. /** @fileOverview Javascript cryptography implementation.
  17472. *
  17473. * Crush to remove comments, shorten variable names and
  17474. * generally reduce transmission size.
  17475. *
  17476. * @author Emily Stark
  17477. * @author Mike Hamburg
  17478. * @author Dan Boneh
  17479. */
  17480. /*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */
  17481. /** @fileOverview Arrays of bits, encoded as arrays of Numbers.
  17482. *
  17483. * @author Emily Stark
  17484. * @author Mike Hamburg
  17485. * @author Dan Boneh
  17486. */
  17487. /**
  17488. * Arrays of bits, encoded as arrays of Numbers.
  17489. * @namespace
  17490. * @description
  17491. * <p>
  17492. * These objects are the currency accepted by SJCL's crypto functions.
  17493. * </p>
  17494. *
  17495. * <p>
  17496. * Most of our crypto primitives operate on arrays of 4-byte words internally,
  17497. * but many of them can take arguments that are not a multiple of 4 bytes.
  17498. * This library encodes arrays of bits (whose size need not be a multiple of 8
  17499. * bits) as arrays of 32-bit words. The bits are packed, big-endian, into an
  17500. * array of words, 32 bits at a time. Since the words are double-precision
  17501. * floating point numbers, they fit some extra data. We use this (in a private,
  17502. * possibly-changing manner) to encode the number of bits actually present
  17503. * in the last word of the array.
  17504. * </p>
  17505. *
  17506. * <p>
  17507. * Because bitwise ops clear this out-of-band data, these arrays can be passed
  17508. * to ciphers like AES which want arrays of words.
  17509. * </p>
  17510. */
  17511. const bitArray = {
  17512. /**
  17513. * Concatenate two bit arrays.
  17514. * @param {bitArray} a1 The first array.
  17515. * @param {bitArray} a2 The second array.
  17516. * @return {bitArray} The concatenation of a1 and a2.
  17517. */
  17518. concat(a1, a2) {
  17519. if (a1.length === 0 || a2.length === 0) {
  17520. return a1.concat(a2);
  17521. }
  17522. const last = a1[a1.length - 1], shift = bitArray.getPartial(last);
  17523. if (shift === 32) {
  17524. return a1.concat(a2);
  17525. } else {
  17526. return bitArray._shiftRight(a2, shift, last | 0, a1.slice(0, a1.length - 1));
  17527. }
  17528. },
  17529. /**
  17530. * Find the length of an array of bits.
  17531. * @param {bitArray} a The array.
  17532. * @return {Number} The length of a, in bits.
  17533. */
  17534. bitLength(a) {
  17535. const l = a.length;
  17536. if (l === 0) {
  17537. return 0;
  17538. }
  17539. const x = a[l - 1];
  17540. return (l - 1) * 32 + bitArray.getPartial(x);
  17541. },
  17542. /**
  17543. * Truncate an array.
  17544. * @param {bitArray} a The array.
  17545. * @param {Number} len The length to truncate to, in bits.
  17546. * @return {bitArray} A new array, truncated to len bits.
  17547. */
  17548. clamp(a, len) {
  17549. if (a.length * 32 < len) {
  17550. return a;
  17551. }
  17552. a = a.slice(0, Math$1.ceil(len / 32));
  17553. const l = a.length;
  17554. len = len & 31;
  17555. if (l > 0 && len) {
  17556. a[l - 1] = bitArray.partial(len, a[l - 1] & 0x80000000 >> (len - 1), 1);
  17557. }
  17558. return a;
  17559. },
  17560. /**
  17561. * Make a partial word for a bit array.
  17562. * @param {Number} len The number of bits in the word.
  17563. * @param {Number} x The bits.
  17564. * @param {Number} [_end=0] Pass 1 if x has already been shifted to the high side.
  17565. * @return {Number} The partial word.
  17566. */
  17567. partial(len, x, _end) {
  17568. if (len === 32) {
  17569. return x;
  17570. }
  17571. return (_end ? x | 0 : x << (32 - len)) + len * 0x10000000000;
  17572. },
  17573. /**
  17574. * Get the number of bits used by a partial word.
  17575. * @param {Number} x The partial word.
  17576. * @return {Number} The number of bits used by the partial word.
  17577. */
  17578. getPartial(x) {
  17579. return Math$1.round(x / 0x10000000000) || 32;
  17580. },
  17581. /** Shift an array right.
  17582. * @param {bitArray} a The array to shift.
  17583. * @param {Number} shift The number of bits to shift.
  17584. * @param {Number} [carry=0] A byte to carry in
  17585. * @param {bitArray} [out=[]] An array to prepend to the output.
  17586. * @private
  17587. */
  17588. _shiftRight(a, shift, carry, out) {
  17589. if (out === undefined) {
  17590. out = [];
  17591. }
  17592. for (; shift >= 32; shift -= 32) {
  17593. out.push(carry);
  17594. carry = 0;
  17595. }
  17596. if (shift === 0) {
  17597. return out.concat(a);
  17598. }
  17599. for (let i = 0; i < a.length; i++) {
  17600. out.push(carry | a[i] >>> shift);
  17601. carry = a[i] << (32 - shift);
  17602. }
  17603. const last2 = a.length ? a[a.length - 1] : 0;
  17604. const shift2 = bitArray.getPartial(last2);
  17605. out.push(bitArray.partial(shift + shift2 & 31, (shift + shift2 > 32) ? carry : out.pop(), 1));
  17606. return out;
  17607. }
  17608. };
  17609. /** @fileOverview Bit array codec implementations.
  17610. *
  17611. * @author Emily Stark
  17612. * @author Mike Hamburg
  17613. * @author Dan Boneh
  17614. */
  17615. /**
  17616. * Arrays of bytes
  17617. * @namespace
  17618. */
  17619. const codec = {
  17620. bytes: {
  17621. /** Convert from a bitArray to an array of bytes. */
  17622. fromBits(arr) {
  17623. const bl = bitArray.bitLength(arr);
  17624. const byteLength = bl / 8;
  17625. const out = new Uint8Array$1(byteLength);
  17626. let tmp;
  17627. for (let i = 0; i < byteLength; i++) {
  17628. if ((i & 3) === 0) {
  17629. tmp = arr[i / 4];
  17630. }
  17631. out[i] = tmp >>> 24;
  17632. tmp <<= 8;
  17633. }
  17634. return out;
  17635. },
  17636. /** Convert from an array of bytes to a bitArray. */
  17637. toBits(bytes) {
  17638. const out = [];
  17639. let i;
  17640. let tmp = 0;
  17641. for (i = 0; i < bytes.length; i++) {
  17642. tmp = tmp << 8 | bytes[i];
  17643. if ((i & 3) === 3) {
  17644. out.push(tmp);
  17645. tmp = 0;
  17646. }
  17647. }
  17648. if (i & 3) {
  17649. out.push(bitArray.partial(8 * (i & 3), tmp));
  17650. }
  17651. return out;
  17652. }
  17653. }
  17654. };
  17655. const hash = {};
  17656. /**
  17657. * Context for a SHA-1 operation in progress.
  17658. * @constructor
  17659. */
  17660. hash.sha1 = class {
  17661. constructor(hash) {
  17662. const sha1 = this;
  17663. /**
  17664. * The hash's block size, in bits.
  17665. * @constant
  17666. */
  17667. sha1.blockSize = 512;
  17668. /**
  17669. * The SHA-1 initialization vector.
  17670. * @private
  17671. */
  17672. sha1._init = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0];
  17673. /**
  17674. * The SHA-1 hash key.
  17675. * @private
  17676. */
  17677. sha1._key = [0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6];
  17678. if (hash) {
  17679. sha1._h = hash._h.slice(0);
  17680. sha1._buffer = hash._buffer.slice(0);
  17681. sha1._length = hash._length;
  17682. } else {
  17683. sha1.reset();
  17684. }
  17685. }
  17686. /**
  17687. * Reset the hash state.
  17688. * @return this
  17689. */
  17690. reset() {
  17691. const sha1 = this;
  17692. sha1._h = sha1._init.slice(0);
  17693. sha1._buffer = [];
  17694. sha1._length = 0;
  17695. return sha1;
  17696. }
  17697. /**
  17698. * Input several words to the hash.
  17699. * @param {bitArray|String} data the data to hash.
  17700. * @return this
  17701. */
  17702. update(data) {
  17703. const sha1 = this;
  17704. if (typeof data === "string") {
  17705. data = codec.utf8String.toBits(data);
  17706. }
  17707. const b = sha1._buffer = bitArray.concat(sha1._buffer, data);
  17708. const ol = sha1._length;
  17709. const nl = sha1._length = ol + bitArray.bitLength(data);
  17710. if (nl > 9007199254740991) {
  17711. throw new Error$1("Cannot hash more than 2^53 - 1 bits");
  17712. }
  17713. const c = new Uint32Array$1(b);
  17714. let j = 0;
  17715. for (let i = sha1.blockSize + ol - ((sha1.blockSize + ol) & (sha1.blockSize - 1)); i <= nl;
  17716. i += sha1.blockSize) {
  17717. sha1._block(c.subarray(16 * j, 16 * (j + 1)));
  17718. j += 1;
  17719. }
  17720. b.splice(0, 16 * j);
  17721. return sha1;
  17722. }
  17723. /**
  17724. * Complete hashing and output the hash value.
  17725. * @return {bitArray} The hash value, an array of 5 big-endian words. TODO
  17726. */
  17727. finalize() {
  17728. const sha1 = this;
  17729. let b = sha1._buffer;
  17730. const h = sha1._h;
  17731. // Round out and push the buffer
  17732. b = bitArray.concat(b, [bitArray.partial(1, 1)]);
  17733. // Round out the buffer to a multiple of 16 words, less the 2 length words.
  17734. for (let i = b.length + 2; i & 15; i++) {
  17735. b.push(0);
  17736. }
  17737. // append the length
  17738. b.push(Math$1.floor(sha1._length / 0x100000000));
  17739. b.push(sha1._length | 0);
  17740. while (b.length) {
  17741. sha1._block(b.splice(0, 16));
  17742. }
  17743. sha1.reset();
  17744. return h;
  17745. }
  17746. /**
  17747. * The SHA-1 logical functions f(0), f(1), ..., f(79).
  17748. * @private
  17749. */
  17750. _f(t, b, c, d) {
  17751. if (t <= 19) {
  17752. return (b & c) | (~b & d);
  17753. } else if (t <= 39) {
  17754. return b ^ c ^ d;
  17755. } else if (t <= 59) {
  17756. return (b & c) | (b & d) | (c & d);
  17757. } else if (t <= 79) {
  17758. return b ^ c ^ d;
  17759. }
  17760. }
  17761. /**
  17762. * Circular left-shift operator.
  17763. * @private
  17764. */
  17765. _S(n, x) {
  17766. return (x << n) | (x >>> 32 - n);
  17767. }
  17768. /**
  17769. * Perform one cycle of SHA-1.
  17770. * @param {Uint32Array|bitArray} words one block of words.
  17771. * @private
  17772. */
  17773. _block(words) {
  17774. const sha1 = this;
  17775. const h = sha1._h;
  17776. // When words is passed to _block, it has 16 elements. SHA1 _block
  17777. // function extends words with new elements (at the end there are 80 elements).
  17778. // The problem is that if we use Uint32Array instead of Array,
  17779. // the length of Uint32Array cannot be changed. Thus, we replace words with a
  17780. // normal Array here.
  17781. const w = Array$1(80); // do not use Uint32Array here as the instantiation is slower
  17782. for (let j = 0; j < 16; j++) {
  17783. w[j] = words[j];
  17784. }
  17785. let a = h[0];
  17786. let b = h[1];
  17787. let c = h[2];
  17788. let d = h[3];
  17789. let e = h[4];
  17790. for (let t = 0; t <= 79; t++) {
  17791. if (t >= 16) {
  17792. w[t] = sha1._S(1, w[t - 3] ^ w[t - 8] ^ w[t - 14] ^ w[t - 16]);
  17793. }
  17794. const tmp = (sha1._S(5, a) + sha1._f(t, b, c, d) + e + w[t] +
  17795. sha1._key[Math$1.floor(t / 20)]) | 0;
  17796. e = d;
  17797. d = c;
  17798. c = sha1._S(30, b);
  17799. b = a;
  17800. a = tmp;
  17801. }
  17802. h[0] = (h[0] + a) | 0;
  17803. h[1] = (h[1] + b) | 0;
  17804. h[2] = (h[2] + c) | 0;
  17805. h[3] = (h[3] + d) | 0;
  17806. h[4] = (h[4] + e) | 0;
  17807. }
  17808. };
  17809. /** @fileOverview Low-level AES implementation.
  17810. *
  17811. * This file contains a low-level implementation of AES, optimized for
  17812. * size and for efficiency on several browsers. It is based on
  17813. * OpenSSL's aes_core.c, a public-domain implementation by Vincent
  17814. * Rijmen, Antoon Bosselaers and Paulo Barreto.
  17815. *
  17816. * An older version of this implementation is available in the public
  17817. * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh,
  17818. * Stanford University 2008-2010 and BSD-licensed for liability
  17819. * reasons.
  17820. *
  17821. * @author Emily Stark
  17822. * @author Mike Hamburg
  17823. * @author Dan Boneh
  17824. */
  17825. const cipher = {};
  17826. /**
  17827. * Schedule out an AES key for both encryption and decryption. This
  17828. * is a low-level class. Use a cipher mode to do bulk encryption.
  17829. *
  17830. * @constructor
  17831. * @param {Array} key The key as an array of 4, 6 or 8 words.
  17832. */
  17833. cipher.aes = class {
  17834. constructor(key) {
  17835. /**
  17836. * The expanded S-box and inverse S-box tables. These will be computed
  17837. * on the client so that we don't have to send them down the wire.
  17838. *
  17839. * There are two tables, _tables[0] is for encryption and
  17840. * _tables[1] is for decryption.
  17841. *
  17842. * The first 4 sub-tables are the expanded S-box with MixColumns. The
  17843. * last (_tables[01][4]) is the S-box itself.
  17844. *
  17845. * @private
  17846. */
  17847. const aes = this;
  17848. aes._tables = [[[], [], [], [], []], [[], [], [], [], []]];
  17849. if (!aes._tables[0][0][0]) {
  17850. aes._precompute();
  17851. }
  17852. const sbox = aes._tables[0][4];
  17853. const decTable = aes._tables[1];
  17854. const keyLen = key.length;
  17855. let i, encKey, decKey, rcon = 1;
  17856. if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) {
  17857. throw new Error$1("invalid aes key size");
  17858. }
  17859. aes._key = [encKey = key.slice(0), decKey = []];
  17860. // schedule encryption keys
  17861. for (i = keyLen; i < 4 * keyLen + 28; i++) {
  17862. let tmp = encKey[i - 1];
  17863. // apply sbox
  17864. if (i % keyLen === 0 || (keyLen === 8 && i % keyLen === 4)) {
  17865. tmp = sbox[tmp >>> 24] << 24 ^ sbox[tmp >> 16 & 255] << 16 ^ sbox[tmp >> 8 & 255] << 8 ^ sbox[tmp & 255];
  17866. // shift rows and add rcon
  17867. if (i % keyLen === 0) {
  17868. tmp = tmp << 8 ^ tmp >>> 24 ^ rcon << 24;
  17869. rcon = rcon << 1 ^ (rcon >> 7) * 283;
  17870. }
  17871. }
  17872. encKey[i] = encKey[i - keyLen] ^ tmp;
  17873. }
  17874. // schedule decryption keys
  17875. for (let j = 0; i; j++, i--) {
  17876. const tmp = encKey[j & 3 ? i : i - 4];
  17877. if (i <= 4 || j < 4) {
  17878. decKey[j] = tmp;
  17879. } else {
  17880. decKey[j] = decTable[0][sbox[tmp >>> 24]] ^
  17881. decTable[1][sbox[tmp >> 16 & 255]] ^
  17882. decTable[2][sbox[tmp >> 8 & 255]] ^
  17883. decTable[3][sbox[tmp & 255]];
  17884. }
  17885. }
  17886. }
  17887. // public
  17888. /* Something like this might appear here eventually
  17889. name: "AES",
  17890. blockSize: 4,
  17891. keySizes: [4,6,8],
  17892. */
  17893. /**
  17894. * Encrypt an array of 4 big-endian words.
  17895. * @param {Array} data The plaintext.
  17896. * @return {Array} The ciphertext.
  17897. */
  17898. encrypt(data) {
  17899. return this._crypt(data, 0);
  17900. }
  17901. /**
  17902. * Decrypt an array of 4 big-endian words.
  17903. * @param {Array} data The ciphertext.
  17904. * @return {Array} The plaintext.
  17905. */
  17906. decrypt(data) {
  17907. return this._crypt(data, 1);
  17908. }
  17909. /**
  17910. * Expand the S-box tables.
  17911. *
  17912. * @private
  17913. */
  17914. _precompute() {
  17915. const encTable = this._tables[0];
  17916. const decTable = this._tables[1];
  17917. const sbox = encTable[4];
  17918. const sboxInv = decTable[4];
  17919. const d = [];
  17920. const th = [];
  17921. let xInv, x2, x4, x8;
  17922. // Compute double and third tables
  17923. for (let i = 0; i < 256; i++) {
  17924. th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;
  17925. }
  17926. for (let x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
  17927. // Compute sbox
  17928. let s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
  17929. s = s >> 8 ^ s & 255 ^ 99;
  17930. sbox[x] = s;
  17931. sboxInv[s] = x;
  17932. // Compute MixColumns
  17933. x8 = d[x4 = d[x2 = d[x]]];
  17934. let tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;
  17935. let tEnc = d[s] * 0x101 ^ s * 0x1010100;
  17936. for (let i = 0; i < 4; i++) {
  17937. encTable[i][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;
  17938. decTable[i][s] = tDec = tDec << 24 ^ tDec >>> 8;
  17939. }
  17940. }
  17941. // Compactify. Considerable speedup on Firefox.
  17942. for (let i = 0; i < 5; i++) {
  17943. encTable[i] = encTable[i].slice(0);
  17944. decTable[i] = decTable[i].slice(0);
  17945. }
  17946. }
  17947. /**
  17948. * Encryption and decryption core.
  17949. * @param {Array} input Four words to be encrypted or decrypted.
  17950. * @param dir The direction, 0 for encrypt and 1 for decrypt.
  17951. * @return {Array} The four encrypted or decrypted words.
  17952. * @private
  17953. */
  17954. _crypt(input, dir) {
  17955. if (input.length !== 4) {
  17956. throw new Error$1("invalid aes block size");
  17957. }
  17958. const key = this._key[dir];
  17959. const nInnerRounds = key.length / 4 - 2;
  17960. const out = [0, 0, 0, 0];
  17961. const table = this._tables[dir];
  17962. // load up the tables
  17963. const t0 = table[0];
  17964. const t1 = table[1];
  17965. const t2 = table[2];
  17966. const t3 = table[3];
  17967. const sbox = table[4];
  17968. // state variables a,b,c,d are loaded with pre-whitened data
  17969. let a = input[0] ^ key[0];
  17970. let b = input[dir ? 3 : 1] ^ key[1];
  17971. let c = input[2] ^ key[2];
  17972. let d = input[dir ? 1 : 3] ^ key[3];
  17973. let kIndex = 4;
  17974. let a2, b2, c2;
  17975. // Inner rounds. Cribbed from OpenSSL.
  17976. for (let i = 0; i < nInnerRounds; i++) {
  17977. a2 = t0[a >>> 24] ^ t1[b >> 16 & 255] ^ t2[c >> 8 & 255] ^ t3[d & 255] ^ key[kIndex];
  17978. b2 = t0[b >>> 24] ^ t1[c >> 16 & 255] ^ t2[d >> 8 & 255] ^ t3[a & 255] ^ key[kIndex + 1];
  17979. c2 = t0[c >>> 24] ^ t1[d >> 16 & 255] ^ t2[a >> 8 & 255] ^ t3[b & 255] ^ key[kIndex + 2];
  17980. d = t0[d >>> 24] ^ t1[a >> 16 & 255] ^ t2[b >> 8 & 255] ^ t3[c & 255] ^ key[kIndex + 3];
  17981. kIndex += 4;
  17982. a = a2; b = b2; c = c2;
  17983. }
  17984. // Last round.
  17985. for (let i = 0; i < 4; i++) {
  17986. out[dir ? 3 & -i : i] =
  17987. sbox[a >>> 24] << 24 ^
  17988. sbox[b >> 16 & 255] << 16 ^
  17989. sbox[c >> 8 & 255] << 8 ^
  17990. sbox[d & 255] ^
  17991. key[kIndex++];
  17992. a2 = a; a = b; b = c; c = d; d = a2;
  17993. }
  17994. return out;
  17995. }
  17996. };
  17997. /**
  17998. * Random values
  17999. * @namespace
  18000. */
  18001. const random = {
  18002. /**
  18003. * Generate random words with pure js, cryptographically not as strong & safe as native implementation.
  18004. * @param {TypedArray} typedArray The array to fill.
  18005. * @return {TypedArray} The random values.
  18006. */
  18007. getRandomValues(typedArray) {
  18008. const words = new Uint32Array$1(typedArray.buffer);
  18009. const r = (m_w) => {
  18010. let m_z = 0x3ade68b1;
  18011. const mask = 0xffffffff;
  18012. return function () {
  18013. m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
  18014. m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
  18015. const result = ((((m_z << 0x10) + m_w) & mask) / 0x100000000) + .5;
  18016. return result * (Math$1.random() > .5 ? 1 : -1);
  18017. };
  18018. };
  18019. for (let i = 0, rcache; i < typedArray.length; i += 4) {
  18020. const _r = r((rcache || Math$1.random()) * 0x100000000);
  18021. rcache = _r() * 0x3ade67b7;
  18022. words[i / 4] = (_r() * 0x100000000) | 0;
  18023. }
  18024. return typedArray;
  18025. }
  18026. };
  18027. /** @fileOverview CTR mode implementation.
  18028. *
  18029. * Special thanks to Roy Nicholson for pointing out a bug in our
  18030. * implementation.
  18031. *
  18032. * @author Emily Stark
  18033. * @author Mike Hamburg
  18034. * @author Dan Boneh
  18035. */
  18036. /** Brian Gladman's CTR Mode.
  18037. * @constructor
  18038. * @param {Object} _prf The aes instance to generate key.
  18039. * @param {bitArray} _iv The iv for ctr mode, it must be 128 bits.
  18040. */
  18041. const mode = {};
  18042. /**
  18043. * Brian Gladman's CTR Mode.
  18044. * @namespace
  18045. */
  18046. mode.ctrGladman = class {
  18047. constructor(prf, iv) {
  18048. this._prf = prf;
  18049. this._initIv = iv;
  18050. this._iv = iv;
  18051. }
  18052. reset() {
  18053. this._iv = this._initIv;
  18054. }
  18055. /** Input some data to calculate.
  18056. * @param {bitArray} data the data to process, it must be intergral multiple of 128 bits unless it's the last.
  18057. */
  18058. update(data) {
  18059. return this.calculate(this._prf, data, this._iv);
  18060. }
  18061. incWord(word) {
  18062. if (((word >> 24) & 0xff) === 0xff) { //overflow
  18063. let b1 = (word >> 16) & 0xff;
  18064. let b2 = (word >> 8) & 0xff;
  18065. let b3 = word & 0xff;
  18066. if (b1 === 0xff) { // overflow b1
  18067. b1 = 0;
  18068. if (b2 === 0xff) {
  18069. b2 = 0;
  18070. if (b3 === 0xff) {
  18071. b3 = 0;
  18072. } else {
  18073. ++b3;
  18074. }
  18075. } else {
  18076. ++b2;
  18077. }
  18078. } else {
  18079. ++b1;
  18080. }
  18081. word = 0;
  18082. word += (b1 << 16);
  18083. word += (b2 << 8);
  18084. word += b3;
  18085. } else {
  18086. word += (0x01 << 24);
  18087. }
  18088. return word;
  18089. }
  18090. incCounter(counter) {
  18091. if ((counter[0] = this.incWord(counter[0])) === 0) {
  18092. // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
  18093. counter[1] = this.incWord(counter[1]);
  18094. }
  18095. }
  18096. calculate(prf, data, iv) {
  18097. let l;
  18098. if (!(l = data.length)) {
  18099. return [];
  18100. }
  18101. const bl = bitArray.bitLength(data);
  18102. for (let i = 0; i < l; i += 4) {
  18103. this.incCounter(iv);
  18104. const e = prf.encrypt(iv);
  18105. data[i] ^= e[0];
  18106. data[i + 1] ^= e[1];
  18107. data[i + 2] ^= e[2];
  18108. data[i + 3] ^= e[3];
  18109. }
  18110. return bitArray.clamp(data, bl);
  18111. }
  18112. };
  18113. const misc = {
  18114. importKey(password) {
  18115. return new misc.hmacSha1(codec.bytes.toBits(password));
  18116. },
  18117. pbkdf2(prf, salt, count, length) {
  18118. count = count || 10000;
  18119. if (length < 0 || count < 0) {
  18120. throw new Error$1("invalid params to pbkdf2");
  18121. }
  18122. const byteLength = ((length >> 5) + 1) << 2;
  18123. let u, ui, i, j, k;
  18124. const arrayBuffer = new ArrayBuffer(byteLength);
  18125. const out = new DataView$1(arrayBuffer);
  18126. let outLength = 0;
  18127. const b = bitArray;
  18128. salt = codec.bytes.toBits(salt);
  18129. for (k = 1; outLength < (byteLength || 1); k++) {
  18130. u = ui = prf.encrypt(b.concat(salt, [k]));
  18131. for (i = 1; i < count; i++) {
  18132. ui = prf.encrypt(ui);
  18133. for (j = 0; j < ui.length; j++) {
  18134. u[j] ^= ui[j];
  18135. }
  18136. }
  18137. for (i = 0; outLength < (byteLength || 1) && i < u.length; i++) {
  18138. out.setInt32(outLength, u[i]);
  18139. outLength += 4;
  18140. }
  18141. }
  18142. return arrayBuffer.slice(0, length / 8);
  18143. }
  18144. };
  18145. /** @fileOverview HMAC implementation.
  18146. *
  18147. * @author Emily Stark
  18148. * @author Mike Hamburg
  18149. * @author Dan Boneh
  18150. */
  18151. /** HMAC with the specified hash function.
  18152. * @constructor
  18153. * @param {bitArray} key the key for HMAC.
  18154. * @param {Object} [Hash=hash.sha1] The hash function to use.
  18155. */
  18156. misc.hmacSha1 = class {
  18157. constructor(key) {
  18158. const hmac = this;
  18159. const Hash = hmac._hash = hash.sha1;
  18160. const exKey = [[], []];
  18161. hmac._baseHash = [new Hash(), new Hash()];
  18162. const bs = hmac._baseHash[0].blockSize / 32;
  18163. if (key.length > bs) {
  18164. key = new Hash().update(key).finalize();
  18165. }
  18166. for (let i = 0; i < bs; i++) {
  18167. exKey[0][i] = key[i] ^ 0x36363636;
  18168. exKey[1][i] = key[i] ^ 0x5C5C5C5C;
  18169. }
  18170. hmac._baseHash[0].update(exKey[0]);
  18171. hmac._baseHash[1].update(exKey[1]);
  18172. hmac._resultHash = new Hash(hmac._baseHash[0]);
  18173. }
  18174. reset() {
  18175. const hmac = this;
  18176. hmac._resultHash = new hmac._hash(hmac._baseHash[0]);
  18177. hmac._updated = false;
  18178. }
  18179. update(data) {
  18180. const hmac = this;
  18181. hmac._updated = true;
  18182. hmac._resultHash.update(data);
  18183. }
  18184. digest() {
  18185. const hmac = this;
  18186. const w = hmac._resultHash.finalize();
  18187. const result = new (hmac._hash)(hmac._baseHash[1]).update(w).finalize();
  18188. hmac.reset();
  18189. return result;
  18190. }
  18191. encrypt(data) {
  18192. if (!this._updated) {
  18193. this.update(data);
  18194. return this.digest(data);
  18195. } else {
  18196. throw new Error$1("encrypt on already updated hmac called!");
  18197. }
  18198. }
  18199. };
  18200. /*
  18201. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  18202. Redistribution and use in source and binary forms, with or without
  18203. modification, are permitted provided that the following conditions are met:
  18204. 1. Redistributions of source code must retain the above copyright notice,
  18205. this list of conditions and the following disclaimer.
  18206. 2. Redistributions in binary form must reproduce the above copyright
  18207. notice, this list of conditions and the following disclaimer in
  18208. the documentation and/or other materials provided with the distribution.
  18209. 3. The names of the authors may not be used to endorse or promote products
  18210. derived from this software without specific prior written permission.
  18211. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  18212. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  18213. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  18214. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  18215. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  18216. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  18217. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  18218. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  18219. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  18220. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  18221. */
  18222. const GET_RANDOM_VALUES_SUPPORTED = typeof crypto != "undefined" && typeof crypto.getRandomValues == "function";
  18223. const ERR_INVALID_PASSWORD = "Invalid password";
  18224. const ERR_INVALID_SIGNATURE = "Invalid signature";
  18225. const ERR_ABORT_CHECK_PASSWORD = "zipjs-abort-check-password";
  18226. function getRandomValues(array) {
  18227. if (GET_RANDOM_VALUES_SUPPORTED) {
  18228. return crypto.getRandomValues(array);
  18229. } else {
  18230. return random.getRandomValues(array);
  18231. }
  18232. }
  18233. /*
  18234. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  18235. Redistribution and use in source and binary forms, with or without
  18236. modification, are permitted provided that the following conditions are met:
  18237. 1. Redistributions of source code must retain the above copyright notice,
  18238. this list of conditions and the following disclaimer.
  18239. 2. Redistributions in binary form must reproduce the above copyright
  18240. notice, this list of conditions and the following disclaimer in
  18241. the documentation and/or other materials provided with the distribution.
  18242. 3. The names of the authors may not be used to endorse or promote products
  18243. derived from this software without specific prior written permission.
  18244. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  18245. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  18246. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  18247. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  18248. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  18249. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  18250. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  18251. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  18252. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  18253. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  18254. */
  18255. const BLOCK_LENGTH = 16;
  18256. const RAW_FORMAT = "raw";
  18257. const PBKDF2_ALGORITHM = { name: "PBKDF2" };
  18258. const HASH_ALGORITHM = { name: "HMAC" };
  18259. const HASH_FUNCTION = "SHA-1";
  18260. const BASE_KEY_ALGORITHM = Object$1.assign({ hash: HASH_ALGORITHM }, PBKDF2_ALGORITHM);
  18261. const DERIVED_BITS_ALGORITHM = Object$1.assign({ iterations: 1000, hash: { name: HASH_FUNCTION } }, PBKDF2_ALGORITHM);
  18262. const DERIVED_BITS_USAGE = ["deriveBits"];
  18263. const SALT_LENGTH = [8, 12, 16];
  18264. const KEY_LENGTH = [16, 24, 32];
  18265. const SIGNATURE_LENGTH = 10;
  18266. const COUNTER_DEFAULT_VALUE = [0, 0, 0, 0];
  18267. const UNDEFINED_TYPE = "undefined";
  18268. const FUNCTION_TYPE = "function";
  18269. // deno-lint-ignore valid-typeof
  18270. const CRYPTO_API_SUPPORTED = typeof crypto != UNDEFINED_TYPE;
  18271. const subtle = CRYPTO_API_SUPPORTED && crypto.subtle;
  18272. const SUBTLE_API_SUPPORTED = CRYPTO_API_SUPPORTED && typeof subtle != UNDEFINED_TYPE;
  18273. const codecBytes = codec.bytes;
  18274. const Aes = cipher.aes;
  18275. const CtrGladman = mode.ctrGladman;
  18276. const HmacSha1 = misc.hmacSha1;
  18277. let IMPORT_KEY_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && typeof subtle.importKey == FUNCTION_TYPE;
  18278. let DERIVE_BITS_SUPPORTED = CRYPTO_API_SUPPORTED && SUBTLE_API_SUPPORTED && typeof subtle.deriveBits == FUNCTION_TYPE;
  18279. class AESDecryptionStream extends TransformStream {
  18280. constructor({ password, signed, encryptionStrength, checkPasswordOnly }) {
  18281. super({
  18282. start() {
  18283. Object$1.assign(this, {
  18284. ready: new Promise$1(resolve => this.resolveReady = resolve),
  18285. password,
  18286. signed,
  18287. strength: encryptionStrength - 1,
  18288. pending: new Uint8Array$1()
  18289. });
  18290. },
  18291. async transform(chunk, controller) {
  18292. const aesCrypto = this;
  18293. const {
  18294. password,
  18295. strength,
  18296. resolveReady,
  18297. ready
  18298. } = aesCrypto;
  18299. if (password) {
  18300. await createDecryptionKeys(aesCrypto, strength, password, subarray(chunk, 0, SALT_LENGTH[strength] + 2));
  18301. chunk = subarray(chunk, SALT_LENGTH[strength] + 2);
  18302. if (checkPasswordOnly) {
  18303. controller.error(new Error$1(ERR_ABORT_CHECK_PASSWORD));
  18304. } else {
  18305. resolveReady();
  18306. }
  18307. } else {
  18308. await ready;
  18309. }
  18310. const output = new Uint8Array$1(chunk.length - SIGNATURE_LENGTH - ((chunk.length - SIGNATURE_LENGTH) % BLOCK_LENGTH));
  18311. controller.enqueue(append(aesCrypto, chunk, output, 0, SIGNATURE_LENGTH, true));
  18312. },
  18313. async flush(controller) {
  18314. const {
  18315. signed,
  18316. ctr,
  18317. hmac,
  18318. pending,
  18319. ready
  18320. } = this;
  18321. if (hmac && ctr) {
  18322. await ready;
  18323. const chunkToDecrypt = subarray(pending, 0, pending.length - SIGNATURE_LENGTH);
  18324. const originalSignature = subarray(pending, pending.length - SIGNATURE_LENGTH);
  18325. let decryptedChunkArray = new Uint8Array$1();
  18326. if (chunkToDecrypt.length) {
  18327. const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
  18328. hmac.update(encryptedChunk);
  18329. const decryptedChunk = ctr.update(encryptedChunk);
  18330. decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
  18331. }
  18332. if (signed) {
  18333. const signature = subarray(fromBits(codecBytes, hmac.digest()), 0, SIGNATURE_LENGTH);
  18334. for (let indexSignature = 0; indexSignature < SIGNATURE_LENGTH; indexSignature++) {
  18335. if (signature[indexSignature] != originalSignature[indexSignature]) {
  18336. throw new Error$1(ERR_INVALID_SIGNATURE);
  18337. }
  18338. }
  18339. }
  18340. controller.enqueue(decryptedChunkArray);
  18341. }
  18342. }
  18343. });
  18344. }
  18345. }
  18346. class AESEncryptionStream extends TransformStream {
  18347. constructor({ password, encryptionStrength }) {
  18348. // deno-lint-ignore prefer-const
  18349. let stream;
  18350. super({
  18351. start() {
  18352. Object$1.assign(this, {
  18353. ready: new Promise$1(resolve => this.resolveReady = resolve),
  18354. password,
  18355. strength: encryptionStrength - 1,
  18356. pending: new Uint8Array$1()
  18357. });
  18358. },
  18359. async transform(chunk, controller) {
  18360. const aesCrypto = this;
  18361. const {
  18362. password,
  18363. strength,
  18364. resolveReady,
  18365. ready
  18366. } = aesCrypto;
  18367. let preamble = new Uint8Array$1();
  18368. if (password) {
  18369. preamble = await createEncryptionKeys(aesCrypto, strength, password);
  18370. resolveReady();
  18371. } else {
  18372. await ready;
  18373. }
  18374. const output = new Uint8Array$1(preamble.length + chunk.length - (chunk.length % BLOCK_LENGTH));
  18375. output.set(preamble, 0);
  18376. controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0));
  18377. },
  18378. async flush(controller) {
  18379. const {
  18380. ctr,
  18381. hmac,
  18382. pending,
  18383. ready
  18384. } = this;
  18385. if (hmac && ctr) {
  18386. await ready;
  18387. let encryptedChunkArray = new Uint8Array$1();
  18388. if (pending.length) {
  18389. const encryptedChunk = ctr.update(toBits(codecBytes, pending));
  18390. hmac.update(encryptedChunk);
  18391. encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
  18392. }
  18393. stream.signature = fromBits(codecBytes, hmac.digest()).slice(0, SIGNATURE_LENGTH);
  18394. controller.enqueue(concat(encryptedChunkArray, stream.signature));
  18395. }
  18396. }
  18397. });
  18398. stream = this;
  18399. }
  18400. }
  18401. function append(aesCrypto, input, output, paddingStart, paddingEnd, verifySignature) {
  18402. const {
  18403. ctr,
  18404. hmac,
  18405. pending
  18406. } = aesCrypto;
  18407. const inputLength = input.length - paddingEnd;
  18408. if (pending.length) {
  18409. input = concat(pending, input);
  18410. output = expand(output, inputLength - (inputLength % BLOCK_LENGTH));
  18411. }
  18412. let offset;
  18413. for (offset = 0; offset <= inputLength - BLOCK_LENGTH; offset += BLOCK_LENGTH) {
  18414. const inputChunk = toBits(codecBytes, subarray(input, offset, offset + BLOCK_LENGTH));
  18415. if (verifySignature) {
  18416. hmac.update(inputChunk);
  18417. }
  18418. const outputChunk = ctr.update(inputChunk);
  18419. if (!verifySignature) {
  18420. hmac.update(outputChunk);
  18421. }
  18422. output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
  18423. }
  18424. aesCrypto.pending = subarray(input, offset);
  18425. return output;
  18426. }
  18427. async function createDecryptionKeys(decrypt, strength, password, preamble) {
  18428. const passwordVerificationKey = await createKeys$1(decrypt, strength, password, subarray(preamble, 0, SALT_LENGTH[strength]));
  18429. const passwordVerification = subarray(preamble, SALT_LENGTH[strength]);
  18430. if (passwordVerificationKey[0] != passwordVerification[0] || passwordVerificationKey[1] != passwordVerification[1]) {
  18431. throw new Error$1(ERR_INVALID_PASSWORD);
  18432. }
  18433. }
  18434. async function createEncryptionKeys(encrypt, strength, password) {
  18435. const salt = getRandomValues(new Uint8Array$1(SALT_LENGTH[strength]));
  18436. const passwordVerification = await createKeys$1(encrypt, strength, password, salt);
  18437. return concat(salt, passwordVerification);
  18438. }
  18439. async function createKeys$1(aesCrypto, strength, password, salt) {
  18440. aesCrypto.password = null;
  18441. const encodedPassword = encodeText(password);
  18442. const baseKey = await importKey(RAW_FORMAT, encodedPassword, BASE_KEY_ALGORITHM, false, DERIVED_BITS_USAGE);
  18443. const derivedBits = await deriveBits(Object$1.assign({ salt }, DERIVED_BITS_ALGORITHM), baseKey, 8 * ((KEY_LENGTH[strength] * 2) + 2));
  18444. const compositeKey = new Uint8Array$1(derivedBits);
  18445. const key = toBits(codecBytes, subarray(compositeKey, 0, KEY_LENGTH[strength]));
  18446. const authentication = toBits(codecBytes, subarray(compositeKey, KEY_LENGTH[strength], KEY_LENGTH[strength] * 2));
  18447. const passwordVerification = subarray(compositeKey, KEY_LENGTH[strength] * 2);
  18448. Object$1.assign(aesCrypto, {
  18449. keys: {
  18450. key,
  18451. authentication,
  18452. passwordVerification
  18453. },
  18454. ctr: new CtrGladman(new Aes(key), Array$1.from(COUNTER_DEFAULT_VALUE)),
  18455. hmac: new HmacSha1(authentication)
  18456. });
  18457. return passwordVerification;
  18458. }
  18459. async function importKey(format, password, algorithm, extractable, keyUsages) {
  18460. if (IMPORT_KEY_SUPPORTED) {
  18461. try {
  18462. return await subtle.importKey(format, password, algorithm, extractable, keyUsages);
  18463. } catch (_error) {
  18464. IMPORT_KEY_SUPPORTED = false;
  18465. return misc.importKey(password);
  18466. }
  18467. } else {
  18468. return misc.importKey(password);
  18469. }
  18470. }
  18471. async function deriveBits(algorithm, baseKey, length) {
  18472. if (DERIVE_BITS_SUPPORTED) {
  18473. try {
  18474. return await subtle.deriveBits(algorithm, baseKey, length);
  18475. } catch (_error) {
  18476. DERIVE_BITS_SUPPORTED = false;
  18477. return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
  18478. }
  18479. } else {
  18480. return misc.pbkdf2(baseKey, algorithm.salt, DERIVED_BITS_ALGORITHM.iterations, length);
  18481. }
  18482. }
  18483. function concat(leftArray, rightArray) {
  18484. let array = leftArray;
  18485. if (leftArray.length + rightArray.length) {
  18486. array = new Uint8Array$1(leftArray.length + rightArray.length);
  18487. array.set(leftArray, 0);
  18488. array.set(rightArray, leftArray.length);
  18489. }
  18490. return array;
  18491. }
  18492. function expand(inputArray, length) {
  18493. if (length && length > inputArray.length) {
  18494. const array = inputArray;
  18495. inputArray = new Uint8Array$1(length);
  18496. inputArray.set(array, 0);
  18497. }
  18498. return inputArray;
  18499. }
  18500. function subarray(array, begin, end) {
  18501. return array.subarray(begin, end);
  18502. }
  18503. function fromBits(codecBytes, chunk) {
  18504. return codecBytes.fromBits(chunk);
  18505. }
  18506. function toBits(codecBytes, chunk) {
  18507. return codecBytes.toBits(chunk);
  18508. }
  18509. /*
  18510. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  18511. Redistribution and use in source and binary forms, with or without
  18512. modification, are permitted provided that the following conditions are met:
  18513. 1. Redistributions of source code must retain the above copyright notice,
  18514. this list of conditions and the following disclaimer.
  18515. 2. Redistributions in binary form must reproduce the above copyright
  18516. notice, this list of conditions and the following disclaimer in
  18517. the documentation and/or other materials provided with the distribution.
  18518. 3. The names of the authors may not be used to endorse or promote products
  18519. derived from this software without specific prior written permission.
  18520. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  18521. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  18522. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  18523. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  18524. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  18525. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  18526. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  18527. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  18528. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  18529. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  18530. */
  18531. const HEADER_LENGTH = 12;
  18532. class ZipCryptoDecryptionStream extends TransformStream {
  18533. constructor({ password, passwordVerification, checkPasswordOnly }) {
  18534. super({
  18535. start() {
  18536. Object$1.assign(this, {
  18537. password,
  18538. passwordVerification
  18539. });
  18540. createKeys(this, password);
  18541. },
  18542. transform(chunk, controller) {
  18543. const zipCrypto = this;
  18544. if (zipCrypto.password) {
  18545. const decryptedHeader = decrypt(zipCrypto, chunk.subarray(0, HEADER_LENGTH));
  18546. zipCrypto.password = null;
  18547. if (decryptedHeader[HEADER_LENGTH - 1] != zipCrypto.passwordVerification) {
  18548. throw new Error$1(ERR_INVALID_PASSWORD);
  18549. }
  18550. chunk = chunk.subarray(HEADER_LENGTH);
  18551. }
  18552. if (checkPasswordOnly) {
  18553. controller.error(new Error$1(ERR_ABORT_CHECK_PASSWORD));
  18554. } else {
  18555. controller.enqueue(decrypt(zipCrypto, chunk));
  18556. }
  18557. }
  18558. });
  18559. }
  18560. }
  18561. class ZipCryptoEncryptionStream extends TransformStream {
  18562. constructor({ password, passwordVerification }) {
  18563. super({
  18564. start() {
  18565. Object$1.assign(this, {
  18566. password,
  18567. passwordVerification
  18568. });
  18569. createKeys(this, password);
  18570. },
  18571. transform(chunk, controller) {
  18572. const zipCrypto = this;
  18573. let output;
  18574. let offset;
  18575. if (zipCrypto.password) {
  18576. zipCrypto.password = null;
  18577. const header = getRandomValues(new Uint8Array$1(HEADER_LENGTH));
  18578. header[HEADER_LENGTH - 1] = zipCrypto.passwordVerification;
  18579. output = new Uint8Array$1(chunk.length + header.length);
  18580. output.set(encrypt(zipCrypto, header), 0);
  18581. offset = HEADER_LENGTH;
  18582. } else {
  18583. output = new Uint8Array$1(chunk.length);
  18584. offset = 0;
  18585. }
  18586. output.set(encrypt(zipCrypto, chunk), offset);
  18587. controller.enqueue(output);
  18588. }
  18589. });
  18590. }
  18591. }
  18592. function decrypt(target, input) {
  18593. const output = new Uint8Array$1(input.length);
  18594. for (let index = 0; index < input.length; index++) {
  18595. output[index] = getByte(target) ^ input[index];
  18596. updateKeys(target, output[index]);
  18597. }
  18598. return output;
  18599. }
  18600. function encrypt(target, input) {
  18601. const output = new Uint8Array$1(input.length);
  18602. for (let index = 0; index < input.length; index++) {
  18603. output[index] = getByte(target) ^ input[index];
  18604. updateKeys(target, input[index]);
  18605. }
  18606. return output;
  18607. }
  18608. function createKeys(target, password) {
  18609. const keys = [0x12345678, 0x23456789, 0x34567890];
  18610. Object$1.assign(target, {
  18611. keys,
  18612. crcKey0: new Crc32(keys[0]),
  18613. crcKey2: new Crc32(keys[2]),
  18614. });
  18615. for (let index = 0; index < password.length; index++) {
  18616. updateKeys(target, password.charCodeAt(index));
  18617. }
  18618. }
  18619. function updateKeys(target, byte) {
  18620. let [key0, key1, key2] = target.keys;
  18621. target.crcKey0.append([byte]);
  18622. key0 = ~target.crcKey0.get();
  18623. key1 = getInt32(Math$1.imul(getInt32(key1 + getInt8(key0)), 134775813) + 1);
  18624. target.crcKey2.append([key1 >>> 24]);
  18625. key2 = ~target.crcKey2.get();
  18626. target.keys = [key0, key1, key2];
  18627. }
  18628. function getByte(target) {
  18629. const temp = target.keys[2] | 2;
  18630. return getInt8(Math$1.imul(temp, (temp ^ 1)) >>> 8);
  18631. }
  18632. function getInt8(number) {
  18633. return number & 0xFF;
  18634. }
  18635. function getInt32(number) {
  18636. return number & 0xFFFFFFFF;
  18637. }
  18638. /*
  18639. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  18640. Redistribution and use in source and binary forms, with or without
  18641. modification, are permitted provided that the following conditions are met:
  18642. 1. Redistributions of source code must retain the above copyright notice,
  18643. this list of conditions and the following disclaimer.
  18644. 2. Redistributions in binary form must reproduce the above copyright
  18645. notice, this list of conditions and the following disclaimer in
  18646. the documentation and/or other materials provided with the distribution.
  18647. 3. The names of the authors may not be used to endorse or promote products
  18648. derived from this software without specific prior written permission.
  18649. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  18650. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  18651. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  18652. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  18653. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  18654. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  18655. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  18656. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  18657. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  18658. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  18659. */
  18660. const COMPRESSION_FORMAT = "deflate-raw";
  18661. class DeflateStream extends TransformStream {
  18662. constructor(options, { chunkSize, CompressionStream, CompressionStreamNative }) {
  18663. super({});
  18664. const { compressed, encrypted, useCompressionStream, zipCrypto, signed, level } = options;
  18665. const stream = this;
  18666. let crc32Stream, encryptionStream;
  18667. let readable = filterEmptyChunks(super.readable);
  18668. if ((!encrypted || zipCrypto) && signed) {
  18669. crc32Stream = new Crc32Stream();
  18670. readable = pipeThrough(readable, crc32Stream);
  18671. }
  18672. if (compressed) {
  18673. readable = pipeThroughCommpressionStream(readable, useCompressionStream, { level, chunkSize }, CompressionStreamNative, CompressionStream);
  18674. }
  18675. if (encrypted) {
  18676. if (zipCrypto) {
  18677. readable = pipeThrough(readable, new ZipCryptoEncryptionStream(options));
  18678. } else {
  18679. encryptionStream = new AESEncryptionStream(options);
  18680. readable = pipeThrough(readable, encryptionStream);
  18681. }
  18682. }
  18683. setReadable(stream, readable, () => {
  18684. let signature;
  18685. if (encrypted && !zipCrypto) {
  18686. signature = encryptionStream.signature;
  18687. }
  18688. if ((!encrypted || zipCrypto) && signed) {
  18689. signature = new DataView$1(crc32Stream.value.buffer).getUint32(0);
  18690. }
  18691. stream.signature = signature;
  18692. });
  18693. }
  18694. }
  18695. class InflateStream extends TransformStream {
  18696. constructor(options, { chunkSize, DecompressionStream, DecompressionStreamNative }) {
  18697. super({});
  18698. const { zipCrypto, encrypted, signed, signature, compressed, useCompressionStream } = options;
  18699. let crc32Stream, decryptionStream;
  18700. let readable = filterEmptyChunks(super.readable);
  18701. if (encrypted) {
  18702. if (zipCrypto) {
  18703. readable = pipeThrough(readable, new ZipCryptoDecryptionStream(options));
  18704. } else {
  18705. decryptionStream = new AESDecryptionStream(options);
  18706. readable = pipeThrough(readable, decryptionStream);
  18707. }
  18708. }
  18709. if (compressed) {
  18710. readable = pipeThroughCommpressionStream(readable, useCompressionStream, { chunkSize }, DecompressionStreamNative, DecompressionStream);
  18711. }
  18712. if ((!encrypted || zipCrypto) && signed) {
  18713. crc32Stream = new Crc32Stream();
  18714. readable = pipeThrough(readable, crc32Stream);
  18715. }
  18716. setReadable(this, readable, () => {
  18717. if ((!encrypted || zipCrypto) && signed) {
  18718. const dataViewSignature = new DataView$1(crc32Stream.value.buffer);
  18719. if (signature != dataViewSignature.getUint32(0, false)) {
  18720. throw new Error$1(ERR_INVALID_SIGNATURE);
  18721. }
  18722. }
  18723. });
  18724. }
  18725. }
  18726. function filterEmptyChunks(readable) {
  18727. return pipeThrough(readable, new TransformStream({
  18728. transform(chunk, controller) {
  18729. if (chunk && chunk.length) {
  18730. controller.enqueue(chunk);
  18731. }
  18732. }
  18733. }));
  18734. }
  18735. function setReadable(stream, readable, flush) {
  18736. readable = pipeThrough(readable, new TransformStream({ flush }));
  18737. Object$1.defineProperty(stream, "readable", {
  18738. get() {
  18739. return readable;
  18740. }
  18741. });
  18742. }
  18743. function pipeThroughCommpressionStream(readable, useCompressionStream, options, CodecStreamNative, CodecStream) {
  18744. try {
  18745. const CompressionStream = useCompressionStream && CodecStreamNative ? CodecStreamNative : CodecStream;
  18746. readable = pipeThrough(readable, new CompressionStream(COMPRESSION_FORMAT, options));
  18747. } catch (error) {
  18748. if (useCompressionStream) {
  18749. readable = pipeThrough(readable, new CodecStream(COMPRESSION_FORMAT, options));
  18750. } else {
  18751. throw error;
  18752. }
  18753. }
  18754. return readable;
  18755. }
  18756. function pipeThrough(readable, transformStream) {
  18757. return readable.pipeThrough(transformStream);
  18758. }
  18759. /*
  18760. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  18761. Redistribution and use in source and binary forms, with or without
  18762. modification, are permitted provided that the following conditions are met:
  18763. 1. Redistributions of source code must retain the above copyright notice,
  18764. this list of conditions and the following disclaimer.
  18765. 2. Redistributions in binary form must reproduce the above copyright
  18766. notice, this list of conditions and the following disclaimer in
  18767. the documentation and/or other materials provided with the distribution.
  18768. 3. The names of the authors may not be used to endorse or promote products
  18769. derived from this software without specific prior written permission.
  18770. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  18771. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  18772. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  18773. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  18774. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  18775. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  18776. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  18777. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  18778. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  18779. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  18780. */
  18781. const MESSAGE_EVENT_TYPE = "message";
  18782. const MESSAGE_START = "start";
  18783. const MESSAGE_PULL = "pull";
  18784. const MESSAGE_DATA = "data";
  18785. const MESSAGE_ACK_DATA = "ack";
  18786. const MESSAGE_CLOSE = "close";
  18787. const CODEC_DEFLATE = "deflate";
  18788. const CODEC_INFLATE = "inflate";
  18789. class CodecStream extends TransformStream {
  18790. constructor(options, config) {
  18791. super({});
  18792. const codec = this;
  18793. const { codecType } = options;
  18794. let Stream;
  18795. if (codecType.startsWith(CODEC_DEFLATE)) {
  18796. Stream = DeflateStream;
  18797. } else if (codecType.startsWith(CODEC_INFLATE)) {
  18798. Stream = InflateStream;
  18799. }
  18800. let size = 0;
  18801. const stream = new Stream(options, config);
  18802. const readable = super.readable;
  18803. const transformStream = new TransformStream({
  18804. transform(chunk, controller) {
  18805. if (chunk && chunk.length) {
  18806. size += chunk.length;
  18807. controller.enqueue(chunk);
  18808. }
  18809. },
  18810. flush() {
  18811. const { signature } = stream;
  18812. Object$1.assign(codec, {
  18813. signature,
  18814. size
  18815. });
  18816. }
  18817. });
  18818. Object$1.defineProperty(codec, "readable", {
  18819. get() {
  18820. return readable.pipeThrough(stream).pipeThrough(transformStream);
  18821. }
  18822. });
  18823. }
  18824. }
  18825. /*
  18826. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  18827. Redistribution and use in source and binary forms, with or without
  18828. modification, are permitted provided that the following conditions are met:
  18829. 1. Redistributions of source code must retain the above copyright notice,
  18830. this list of conditions and the following disclaimer.
  18831. 2. Redistributions in binary form must reproduce the above copyright
  18832. notice, this list of conditions and the following disclaimer in
  18833. the documentation and/or other materials provided with the distribution.
  18834. 3. The names of the authors may not be used to endorse or promote products
  18835. derived from this software without specific prior written permission.
  18836. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  18837. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  18838. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  18839. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  18840. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  18841. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  18842. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  18843. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  18844. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  18845. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  18846. */
  18847. // deno-lint-ignore valid-typeof
  18848. const WEB_WORKERS_SUPPORTED = typeof Worker != UNDEFINED_TYPE$1;
  18849. class CodecWorker {
  18850. constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, scripts }, onTaskFinished) {
  18851. const { signal } = streamOptions;
  18852. Object$1.assign(workerData, {
  18853. busy: true,
  18854. readable: readable.pipeThrough(new ProgressWatcherStream(readable, streamOptions, config), { signal }),
  18855. writable,
  18856. options: Object$1.assign({}, options),
  18857. scripts,
  18858. transferStreams,
  18859. terminate() {
  18860. const { worker, busy } = workerData;
  18861. if (worker && !busy) {
  18862. worker.terminate();
  18863. workerData.interface = null;
  18864. }
  18865. },
  18866. onTaskFinished() {
  18867. workerData.busy = false;
  18868. onTaskFinished(workerData);
  18869. }
  18870. });
  18871. return (useWebWorkers && WEB_WORKERS_SUPPORTED ? createWebWorkerInterface : createWorkerInterface)(workerData, config);
  18872. }
  18873. }
  18874. class ProgressWatcherStream extends TransformStream {
  18875. constructor(readableSource, { onstart, onprogress, size, onend }, { chunkSize }) {
  18876. let chunkOffset = 0;
  18877. super({
  18878. start() {
  18879. if (onstart) {
  18880. callHandler(onstart, size);
  18881. }
  18882. },
  18883. async transform(chunk, controller) {
  18884. chunkOffset += chunk.length;
  18885. if (onprogress) {
  18886. await callHandler(onprogress, chunkOffset, size);
  18887. }
  18888. controller.enqueue(chunk);
  18889. },
  18890. flush() {
  18891. readableSource.size = chunkOffset;
  18892. if (onend) {
  18893. callHandler(onend, chunkOffset);
  18894. }
  18895. }
  18896. }, { highWaterMark: 1, size: () => chunkSize });
  18897. }
  18898. }
  18899. async function callHandler(handler, ...parameters) {
  18900. try {
  18901. await handler(...parameters);
  18902. } catch (_error) {
  18903. // ignored
  18904. }
  18905. }
  18906. function createWorkerInterface(workerData, config) {
  18907. return {
  18908. run: () => runWorker$1(workerData, config)
  18909. };
  18910. }
  18911. function createWebWorkerInterface(workerData, { baseURL, chunkSize }) {
  18912. if (!workerData.interface) {
  18913. Object$1.assign(workerData, {
  18914. worker: getWebWorker(workerData.scripts[0], baseURL, workerData),
  18915. interface: {
  18916. run: () => runWebWorker(workerData, { chunkSize })
  18917. }
  18918. });
  18919. }
  18920. return workerData.interface;
  18921. }
  18922. async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
  18923. const codecStream = new CodecStream(options, config);
  18924. try {
  18925. await readable.pipeThrough(codecStream).pipeTo(writable, { preventClose: true, preventAbort: true });
  18926. const {
  18927. signature,
  18928. size
  18929. } = codecStream;
  18930. return {
  18931. signature,
  18932. size
  18933. };
  18934. } finally {
  18935. onTaskFinished();
  18936. }
  18937. }
  18938. async function runWebWorker(workerData, config) {
  18939. let resolveResult, rejectResult;
  18940. const result = new Promise$1((resolve, reject) => {
  18941. resolveResult = resolve;
  18942. rejectResult = reject;
  18943. });
  18944. Object$1.assign(workerData, {
  18945. reader: null,
  18946. writer: null,
  18947. resolveResult,
  18948. rejectResult,
  18949. result
  18950. });
  18951. const { readable, options, scripts } = workerData;
  18952. const { writable, closed } = watchClosedStream(workerData.writable);
  18953. const streamsTransferred = sendMessage({
  18954. type: MESSAGE_START,
  18955. scripts: scripts.slice(1),
  18956. options,
  18957. config,
  18958. readable,
  18959. writable
  18960. }, workerData);
  18961. if (!streamsTransferred) {
  18962. Object$1.assign(workerData, {
  18963. reader: readable.getReader(),
  18964. writer: writable.getWriter()
  18965. });
  18966. }
  18967. const resultValue = await result;
  18968. try {
  18969. await writable.getWriter().close();
  18970. } catch (_error) {
  18971. // ignored
  18972. }
  18973. await closed;
  18974. return resultValue;
  18975. }
  18976. function watchClosedStream(writableSource) {
  18977. const writer = writableSource.getWriter();
  18978. let resolveStreamClosed;
  18979. const closed = new Promise$1(resolve => resolveStreamClosed = resolve);
  18980. const writable = new WritableStream({
  18981. async write(chunk) {
  18982. await writer.ready;
  18983. await writer.write(chunk);
  18984. },
  18985. close() {
  18986. writer.releaseLock();
  18987. resolveStreamClosed();
  18988. },
  18989. abort(reason) {
  18990. return writer.abort(reason);
  18991. }
  18992. });
  18993. return { writable, closed };
  18994. }
  18995. let classicWorkersSupported = true;
  18996. let transferStreamsSupported = true;
  18997. function getWebWorker(url, baseURL, workerData) {
  18998. const workerOptions = { type: "module" };
  18999. let scriptUrl, worker;
  19000. // deno-lint-ignore valid-typeof
  19001. if (typeof url == FUNCTION_TYPE$1) {
  19002. url = url();
  19003. }
  19004. try {
  19005. scriptUrl = new URL$2(url, baseURL);
  19006. } catch (_error) {
  19007. scriptUrl = url;
  19008. }
  19009. if (classicWorkersSupported) {
  19010. try {
  19011. worker = new Worker(scriptUrl);
  19012. } catch (_error) {
  19013. classicWorkersSupported = false;
  19014. worker = new Worker(scriptUrl, workerOptions);
  19015. }
  19016. } else {
  19017. worker = new Worker(scriptUrl, workerOptions);
  19018. }
  19019. worker.addEventListener(MESSAGE_EVENT_TYPE, event => onMessage(event, workerData));
  19020. return worker;
  19021. }
  19022. function sendMessage(message, { worker, writer, onTaskFinished, transferStreams }) {
  19023. try {
  19024. let { value, readable, writable } = message;
  19025. const transferables = [];
  19026. if (value) {
  19027. message.value = value.buffer;
  19028. transferables.push(message.value);
  19029. }
  19030. if (transferStreams && transferStreamsSupported) {
  19031. if (readable) {
  19032. transferables.push(readable);
  19033. }
  19034. if (writable) {
  19035. transferables.push(writable);
  19036. }
  19037. } else {
  19038. message.readable = message.writable = null;
  19039. }
  19040. if (transferables.length) {
  19041. try {
  19042. worker.postMessage(message, transferables);
  19043. return true;
  19044. } catch (_error) {
  19045. transferStreamsSupported = false;
  19046. message.readable = message.writable = null;
  19047. worker.postMessage(message);
  19048. }
  19049. } else {
  19050. worker.postMessage(message);
  19051. }
  19052. } catch (error) {
  19053. if (writer) {
  19054. writer.releaseLock();
  19055. }
  19056. onTaskFinished();
  19057. throw error;
  19058. }
  19059. }
  19060. async function onMessage({ data }, workerData) {
  19061. const { type, value, messageId, result, error } = data;
  19062. const { reader, writer, resolveResult, rejectResult, onTaskFinished } = workerData;
  19063. try {
  19064. if (error) {
  19065. const { message, stack, code, name } = error;
  19066. const responseError = new Error$1(message);
  19067. Object$1.assign(responseError, { stack, code, name });
  19068. close(responseError);
  19069. } else {
  19070. if (type == MESSAGE_PULL) {
  19071. const { value, done } = await reader.read();
  19072. sendMessage({ type: MESSAGE_DATA, value, done, messageId }, workerData);
  19073. }
  19074. if (type == MESSAGE_DATA) {
  19075. await writer.ready;
  19076. await writer.write(new Uint8Array$1(value));
  19077. sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
  19078. }
  19079. if (type == MESSAGE_CLOSE) {
  19080. close(null, result);
  19081. }
  19082. }
  19083. } catch (error) {
  19084. close(error);
  19085. }
  19086. function close(error, result) {
  19087. if (error) {
  19088. rejectResult(error);
  19089. } else {
  19090. resolveResult(result);
  19091. }
  19092. if (writer) {
  19093. writer.releaseLock();
  19094. }
  19095. onTaskFinished();
  19096. }
  19097. }
  19098. /*
  19099. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  19100. Redistribution and use in source and binary forms, with or without
  19101. modification, are permitted provided that the following conditions are met:
  19102. 1. Redistributions of source code must retain the above copyright notice,
  19103. this list of conditions and the following disclaimer.
  19104. 2. Redistributions in binary form must reproduce the above copyright
  19105. notice, this list of conditions and the following disclaimer in
  19106. the documentation and/or other materials provided with the distribution.
  19107. 3. The names of the authors may not be used to endorse or promote products
  19108. derived from this software without specific prior written permission.
  19109. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  19110. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  19111. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  19112. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  19113. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  19114. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  19115. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  19116. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  19117. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  19118. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  19119. */
  19120. let pool = [];
  19121. const pendingRequests = [];
  19122. let indexWorker = 0;
  19123. async function runWorker(stream, workerOptions) {
  19124. const { options, config } = workerOptions;
  19125. const { transferStreams, useWebWorkers, useCompressionStream, codecType, compressed, signed, encrypted } = options;
  19126. const { workerScripts, maxWorkers, terminateWorkerTimeout } = config;
  19127. workerOptions.transferStreams = transferStreams || transferStreams === UNDEFINED_VALUE;
  19128. const streamCopy = !compressed && !signed && !encrypted && !workerOptions.transferStreams;
  19129. workerOptions.useWebWorkers = !streamCopy && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
  19130. workerOptions.scripts = workerOptions.useWebWorkers && workerScripts ? workerScripts[codecType] : [];
  19131. options.useCompressionStream = useCompressionStream || (useCompressionStream === UNDEFINED_VALUE && config.useCompressionStream);
  19132. let worker;
  19133. const workerData = pool.find(workerData => !workerData.busy);
  19134. if (workerData) {
  19135. clearTerminateTimeout(workerData);
  19136. worker = new CodecWorker(workerData, stream, workerOptions, onTaskFinished);
  19137. } else if (pool.length < maxWorkers) {
  19138. const workerData = { indexWorker };
  19139. indexWorker++;
  19140. pool.push(workerData);
  19141. worker = new CodecWorker(workerData, stream, workerOptions, onTaskFinished);
  19142. } else {
  19143. worker = await new Promise$1(resolve => pendingRequests.push({ resolve, stream, workerOptions }));
  19144. }
  19145. return worker.run();
  19146. function onTaskFinished(workerData) {
  19147. if (pendingRequests.length) {
  19148. const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
  19149. resolve(new CodecWorker(workerData, stream, workerOptions, onTaskFinished));
  19150. } else if (workerData.worker) {
  19151. clearTerminateTimeout(workerData);
  19152. if (Number$1.isFinite(terminateWorkerTimeout) && terminateWorkerTimeout >= 0) {
  19153. workerData.terminateTimeout = setTimeout(() => {
  19154. pool = pool.filter(data => data != workerData);
  19155. workerData.terminate();
  19156. }, terminateWorkerTimeout);
  19157. }
  19158. } else {
  19159. pool = pool.filter(data => data != workerData);
  19160. }
  19161. }
  19162. }
  19163. function clearTerminateTimeout(workerData) {
  19164. const { terminateTimeout } = workerData;
  19165. if (terminateTimeout) {
  19166. clearTimeout(terminateTimeout);
  19167. workerData.terminateTimeout = null;
  19168. }
  19169. }
  19170. function terminateWorkers() {
  19171. pool.forEach(workerData => {
  19172. clearTerminateTimeout(workerData);
  19173. workerData.terminate();
  19174. });
  19175. }
  19176. /*
  19177. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  19178. Redistribution and use in source and binary forms, with or without
  19179. modification, are permitted provided that the following conditions are met:
  19180. 1. Redistributions of source code must retain the above copyright notice,
  19181. this list of conditions and the following disclaimer.
  19182. 2. Redistributions in binary form must reproduce the above copyright
  19183. notice, this list of conditions and the following disclaimer in
  19184. the documentation and/or other materials provided with the distribution.
  19185. 3. The names of the authors may not be used to endorse or promote products
  19186. derived from this software without specific prior written permission.
  19187. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  19188. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  19189. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  19190. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  19191. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  19192. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  19193. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  19194. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  19195. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  19196. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  19197. */
  19198. const ERR_HTTP_STATUS = "HTTP error ";
  19199. const ERR_HTTP_RANGE = "HTTP Range not supported";
  19200. const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
  19201. const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
  19202. const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
  19203. const HTTP_HEADER_CONTENT_RANGE = "Content-Range";
  19204. const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
  19205. const HTTP_HEADER_RANGE = "Range";
  19206. const HTTP_HEADER_CONTENT_TYPE = "Content-Type";
  19207. const HTTP_METHOD_HEAD = "HEAD";
  19208. const HTTP_METHOD_GET = "GET";
  19209. const HTTP_RANGE_UNIT = "bytes";
  19210. const DEFAULT_CHUNK_SIZE = 64 * 1024;
  19211. const PROPERTY_NAME_WRITABLE = "writable";
  19212. class Stream {
  19213. constructor() {
  19214. this.size = 0;
  19215. }
  19216. init() {
  19217. this.initialized = true;
  19218. }
  19219. }
  19220. class Reader extends Stream {
  19221. get readable() {
  19222. const reader = this;
  19223. const { chunkSize = DEFAULT_CHUNK_SIZE } = reader;
  19224. const readable = new ReadableStream({
  19225. start() {
  19226. this.chunkOffset = 0;
  19227. },
  19228. async pull(controller) {
  19229. const { offset = 0, size, diskNumberStart } = readable;
  19230. const { chunkOffset } = this;
  19231. controller.enqueue(await readUint8Array(reader, offset + chunkOffset, Math$1.min(chunkSize, size - chunkOffset), diskNumberStart));
  19232. if (chunkOffset + chunkSize > size) {
  19233. controller.close();
  19234. } else {
  19235. this.chunkOffset += chunkSize;
  19236. }
  19237. }
  19238. });
  19239. return readable;
  19240. }
  19241. }
  19242. class Writer extends Stream {
  19243. constructor() {
  19244. super();
  19245. const writer = this;
  19246. const writable = new WritableStream({
  19247. write(chunk) {
  19248. return writer.writeUint8Array(chunk);
  19249. }
  19250. });
  19251. Object$1.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
  19252. get() {
  19253. return writable;
  19254. }
  19255. });
  19256. }
  19257. writeUint8Array() {
  19258. // abstract
  19259. }
  19260. }
  19261. class Data64URIReader extends Reader {
  19262. constructor(dataURI) {
  19263. super();
  19264. let dataEnd = dataURI.length;
  19265. while (dataURI.charAt(dataEnd - 1) == "=") {
  19266. dataEnd--;
  19267. }
  19268. const dataStart = dataURI.indexOf(",") + 1;
  19269. Object$1.assign(this, {
  19270. dataURI,
  19271. dataStart,
  19272. size: Math$1.floor((dataEnd - dataStart) * 0.75)
  19273. });
  19274. }
  19275. readUint8Array(offset, length) {
  19276. const {
  19277. dataStart,
  19278. dataURI
  19279. } = this;
  19280. const dataArray = new Uint8Array$1(length);
  19281. const start = Math$1.floor(offset / 3) * 4;
  19282. const bytes = atob(dataURI.substring(start + dataStart, Math$1.ceil((offset + length) / 3) * 4 + dataStart));
  19283. const delta = offset - Math$1.floor(start / 4) * 3;
  19284. for (let indexByte = delta; indexByte < delta + length; indexByte++) {
  19285. dataArray[indexByte - delta] = bytes.charCodeAt(indexByte);
  19286. }
  19287. return dataArray;
  19288. }
  19289. }
  19290. class Data64URIWriter extends Writer {
  19291. constructor(contentType) {
  19292. super();
  19293. Object$1.assign(this, {
  19294. data: "data:" + (contentType || "") + ";base64,",
  19295. pending: []
  19296. });
  19297. }
  19298. writeUint8Array(array) {
  19299. const writer = this;
  19300. let indexArray = 0;
  19301. let dataString = writer.pending;
  19302. const delta = writer.pending.length;
  19303. writer.pending = "";
  19304. for (indexArray = 0; indexArray < (Math$1.floor((delta + array.length) / 3) * 3) - delta; indexArray++) {
  19305. dataString += String$1.fromCharCode(array[indexArray]);
  19306. }
  19307. for (; indexArray < array.length; indexArray++) {
  19308. writer.pending += String$1.fromCharCode(array[indexArray]);
  19309. }
  19310. if (dataString.length > 2) {
  19311. writer.data += btoa(dataString);
  19312. } else {
  19313. writer.pending = dataString;
  19314. }
  19315. }
  19316. getData() {
  19317. return this.data + btoa(this.pending);
  19318. }
  19319. }
  19320. class BlobReader extends Reader {
  19321. constructor(blob) {
  19322. super();
  19323. Object$1.assign(this, {
  19324. blob,
  19325. size: blob.size
  19326. });
  19327. }
  19328. async readUint8Array(offset, length) {
  19329. const reader = this;
  19330. const offsetEnd = offset + length;
  19331. const blob = offset || offsetEnd < reader.size ? reader.blob.slice(offset, offsetEnd) : reader.blob;
  19332. let arrayBuffer = await blob.arrayBuffer();
  19333. if (arrayBuffer.byteLength > length) {
  19334. arrayBuffer = arrayBuffer.slice(offset, offsetEnd);
  19335. }
  19336. return new Uint8Array$1(arrayBuffer);
  19337. }
  19338. }
  19339. class BlobWriter extends Stream {
  19340. constructor(contentType) {
  19341. super();
  19342. const writer = this;
  19343. const transformStream = new TransformStream();
  19344. const headers = [];
  19345. if (contentType) {
  19346. headers.push([HTTP_HEADER_CONTENT_TYPE, contentType]);
  19347. }
  19348. Object$1.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
  19349. get() {
  19350. return transformStream.writable;
  19351. }
  19352. });
  19353. writer.blob = new Response(transformStream.readable, { headers }).blob();
  19354. }
  19355. getData() {
  19356. return this.blob;
  19357. }
  19358. }
  19359. class TextReader extends BlobReader {
  19360. constructor(text) {
  19361. super(new Blob$2([text], { type: CONTENT_TYPE_TEXT_PLAIN }));
  19362. }
  19363. }
  19364. class TextWriter extends BlobWriter {
  19365. constructor(encoding) {
  19366. super(encoding);
  19367. Object$1.assign(this, {
  19368. encoding,
  19369. utf8: !encoding || encoding.toLowerCase() == "utf-8"
  19370. });
  19371. }
  19372. async getData() {
  19373. const {
  19374. encoding,
  19375. utf8
  19376. } = this;
  19377. const blob = await super.getData();
  19378. if (blob.text && utf8) {
  19379. return blob.text();
  19380. } else {
  19381. const reader = new FileReader();
  19382. return new Promise$1((resolve, reject) => {
  19383. Object$1.assign(reader, {
  19384. onload: ({ target }) => resolve(target.result),
  19385. onerror: () => reject(reader.error)
  19386. });
  19387. reader.readAsText(blob, encoding);
  19388. });
  19389. }
  19390. }
  19391. }
  19392. class FetchReader extends Reader {
  19393. constructor(url, options) {
  19394. super();
  19395. createHtpReader(this, url, options);
  19396. }
  19397. async init() {
  19398. await initHttpReader(this, sendFetchRequest, getFetchRequestData);
  19399. super.init();
  19400. }
  19401. readUint8Array(index, length) {
  19402. return readUint8ArrayHttpReader(this, index, length, sendFetchRequest, getFetchRequestData);
  19403. }
  19404. }
  19405. class XHRReader extends Reader {
  19406. constructor(url, options) {
  19407. super();
  19408. createHtpReader(this, url, options);
  19409. }
  19410. async init() {
  19411. await initHttpReader(this, sendXMLHttpRequest, getXMLHttpRequestData);
  19412. super.init();
  19413. }
  19414. readUint8Array(index, length) {
  19415. return readUint8ArrayHttpReader(this, index, length, sendXMLHttpRequest, getXMLHttpRequestData);
  19416. }
  19417. }
  19418. function createHtpReader(httpReader, url, options) {
  19419. const {
  19420. preventHeadRequest,
  19421. useRangeHeader,
  19422. forceRangeRequests
  19423. } = options;
  19424. options = Object$1.assign({}, options);
  19425. delete options.preventHeadRequest;
  19426. delete options.useRangeHeader;
  19427. delete options.forceRangeRequests;
  19428. delete options.useXHR;
  19429. Object$1.assign(httpReader, {
  19430. url,
  19431. options,
  19432. preventHeadRequest,
  19433. useRangeHeader,
  19434. forceRangeRequests
  19435. });
  19436. }
  19437. async function initHttpReader(httpReader, sendRequest, getRequestData) {
  19438. const {
  19439. url,
  19440. useRangeHeader,
  19441. forceRangeRequests
  19442. } = httpReader;
  19443. if (isHttpFamily(url) && (useRangeHeader || forceRangeRequests)) {
  19444. const { headers } = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader));
  19445. if (!forceRangeRequests && headers.get(HTTP_HEADER_ACCEPT_RANGES) != HTTP_RANGE_UNIT) {
  19446. throw new Error$1(ERR_HTTP_RANGE);
  19447. } else {
  19448. let contentSize;
  19449. const contentRangeHeader = headers.get(HTTP_HEADER_CONTENT_RANGE);
  19450. if (contentRangeHeader) {
  19451. const splitHeader = contentRangeHeader.trim().split(/\s*\/\s*/);
  19452. if (splitHeader.length) {
  19453. const headerValue = splitHeader[1];
  19454. if (headerValue && headerValue != "*") {
  19455. contentSize = Number$1(headerValue);
  19456. }
  19457. }
  19458. }
  19459. if (contentSize === UNDEFINED_VALUE) {
  19460. await getContentLength(httpReader, sendRequest, getRequestData);
  19461. } else {
  19462. httpReader.size = contentSize;
  19463. }
  19464. }
  19465. } else {
  19466. await getContentLength(httpReader, sendRequest, getRequestData);
  19467. }
  19468. }
  19469. async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest, getRequestData) {
  19470. const {
  19471. useRangeHeader,
  19472. forceRangeRequests,
  19473. options
  19474. } = httpReader;
  19475. if (useRangeHeader || forceRangeRequests) {
  19476. const response = await sendRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, index, length));
  19477. if (response.status != 206) {
  19478. throw new Error$1(ERR_HTTP_RANGE);
  19479. }
  19480. return new Uint8Array$1(await response.arrayBuffer());
  19481. } else {
  19482. const { data } = httpReader;
  19483. if (!data) {
  19484. await getRequestData(httpReader, options);
  19485. }
  19486. return new Uint8Array$1(httpReader.data.subarray(index, index + length));
  19487. }
  19488. }
  19489. function getRangeHeaders(httpReader, index = 0, length = 1) {
  19490. return Object$1.assign({}, getHeaders(httpReader), { [HTTP_HEADER_RANGE]: HTTP_RANGE_UNIT + "=" + index + "-" + (index + length - 1) });
  19491. }
  19492. function getHeaders({ options }) {
  19493. const { headers } = options;
  19494. if (headers) {
  19495. if (Symbol.iterator in headers) {
  19496. return Object$1.fromEntries(headers);
  19497. } else {
  19498. return headers;
  19499. }
  19500. }
  19501. }
  19502. async function getFetchRequestData(httpReader) {
  19503. await getRequestData(httpReader, sendFetchRequest);
  19504. }
  19505. async function getXMLHttpRequestData(httpReader) {
  19506. await getRequestData(httpReader, sendXMLHttpRequest);
  19507. }
  19508. async function getRequestData(httpReader, sendRequest) {
  19509. const response = await sendRequest(HTTP_METHOD_GET, httpReader, getHeaders(httpReader));
  19510. httpReader.data = new Uint8Array$1(await response.arrayBuffer());
  19511. if (!httpReader.size) {
  19512. httpReader.size = httpReader.data.length;
  19513. }
  19514. }
  19515. async function getContentLength(httpReader, sendRequest, getRequestData) {
  19516. if (httpReader.preventHeadRequest) {
  19517. await getRequestData(httpReader, httpReader.options);
  19518. } else {
  19519. const response = await sendRequest(HTTP_METHOD_HEAD, httpReader, getHeaders(httpReader));
  19520. const contentLength = response.headers.get(HTTP_HEADER_CONTENT_LENGTH);
  19521. if (contentLength) {
  19522. httpReader.size = Number$1(contentLength);
  19523. } else {
  19524. await getRequestData(httpReader, httpReader.options);
  19525. }
  19526. }
  19527. }
  19528. async function sendFetchRequest(method, { options, url }, headers) {
  19529. const response = await fetch(url, Object$1.assign({}, options, { method, headers }));
  19530. if (response.status < 400) {
  19531. return response;
  19532. } else {
  19533. throw response.status == 416 ? new Error$1(ERR_HTTP_RANGE) : new Error$1(ERR_HTTP_STATUS + (response.statusText || response.status));
  19534. }
  19535. }
  19536. function sendXMLHttpRequest(method, { url }, headers) {
  19537. return new Promise$1((resolve, reject) => {
  19538. const request = new XMLHttpRequest();
  19539. request.addEventListener("load", () => {
  19540. if (request.status < 400) {
  19541. const headers = [];
  19542. request.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(header => {
  19543. const splitHeader = header.trim().split(/\s*:\s*/);
  19544. splitHeader[0] = splitHeader[0].trim().replace(/^[a-z]|-[a-z]/g, value => value.toUpperCase());
  19545. headers.push(splitHeader);
  19546. });
  19547. resolve({
  19548. status: request.status,
  19549. arrayBuffer: () => request.response,
  19550. headers: new Map$1(headers)
  19551. });
  19552. } else {
  19553. reject(request.status == 416 ? new Error$1(ERR_HTTP_RANGE) : new Error$1(ERR_HTTP_STATUS + (request.statusText || request.status)));
  19554. }
  19555. }, false);
  19556. request.addEventListener("error", event => reject(event.detail ? event.detail.error : new Error$1("Network error")), false);
  19557. request.open(method, url);
  19558. if (headers) {
  19559. for (const entry of Object$1.entries(headers)) {
  19560. request.setRequestHeader(entry[0], entry[1]);
  19561. }
  19562. }
  19563. request.responseType = "arraybuffer";
  19564. request.send();
  19565. });
  19566. }
  19567. class HttpReader extends Reader {
  19568. constructor(url, options = {}) {
  19569. super();
  19570. Object$1.assign(this, {
  19571. url,
  19572. reader: options.useXHR ? new XHRReader(url, options) : new FetchReader(url, options)
  19573. });
  19574. }
  19575. set size(value) {
  19576. // ignored
  19577. }
  19578. get size() {
  19579. return this.reader.size;
  19580. }
  19581. async init() {
  19582. await this.reader.init();
  19583. super.init();
  19584. }
  19585. readUint8Array(index, length) {
  19586. return this.reader.readUint8Array(index, length);
  19587. }
  19588. }
  19589. class HttpRangeReader extends HttpReader {
  19590. constructor(url, options = {}) {
  19591. options.useRangeHeader = true;
  19592. super(url, options);
  19593. }
  19594. }
  19595. class Uint8ArrayReader extends Reader {
  19596. constructor(array) {
  19597. super();
  19598. Object$1.assign(this, {
  19599. array,
  19600. size: array.length
  19601. });
  19602. }
  19603. readUint8Array(index, length) {
  19604. return this.array.slice(index, index + length);
  19605. }
  19606. }
  19607. class Uint8ArrayWriter extends Writer {
  19608. init(initSize = 0) {
  19609. Object$1.assign(this, {
  19610. offset: 0,
  19611. array: new Uint8Array$1(initSize)
  19612. });
  19613. super.init();
  19614. }
  19615. writeUint8Array(array) {
  19616. const writer = this;
  19617. if (writer.offset + array.length > writer.array.length) {
  19618. const previousArray = writer.array;
  19619. writer.array = new Uint8Array$1(previousArray.length + array.length);
  19620. writer.array.set(previousArray);
  19621. }
  19622. writer.array.set(array, writer.offset);
  19623. writer.offset += array.length;
  19624. }
  19625. getData() {
  19626. return this.array;
  19627. }
  19628. }
  19629. class SplitDataReader extends Reader {
  19630. constructor(readers) {
  19631. super();
  19632. this.readers = readers;
  19633. }
  19634. async init() {
  19635. const reader = this;
  19636. const { readers } = reader;
  19637. reader.lastDiskNumber = 0;
  19638. reader.lastDiskOffset = 0;
  19639. await Promise$1.all(readers.map(async (diskReader, indexDiskReader) => {
  19640. await diskReader.init();
  19641. if (indexDiskReader != readers.length - 1) {
  19642. reader.lastDiskOffset += diskReader.size;
  19643. }
  19644. reader.size += diskReader.size;
  19645. }));
  19646. super.init();
  19647. }
  19648. async readUint8Array(offset, length, diskNumber = 0) {
  19649. const reader = this;
  19650. const { readers } = this;
  19651. let result;
  19652. let currentDiskNumber = diskNumber;
  19653. if (currentDiskNumber == -1) {
  19654. currentDiskNumber = readers.length - 1;
  19655. }
  19656. let currentReaderOffset = offset;
  19657. while (currentReaderOffset >= readers[currentDiskNumber].size) {
  19658. currentReaderOffset -= readers[currentDiskNumber].size;
  19659. currentDiskNumber++;
  19660. }
  19661. const currentReader = readers[currentDiskNumber];
  19662. const currentReaderSize = currentReader.size;
  19663. if (currentReaderOffset + length <= currentReaderSize) {
  19664. result = await readUint8Array(currentReader, currentReaderOffset, length);
  19665. } else {
  19666. const chunkLength = currentReaderSize - currentReaderOffset;
  19667. result = new Uint8Array$1(length);
  19668. result.set(await readUint8Array(currentReader, currentReaderOffset, chunkLength));
  19669. result.set(await reader.readUint8Array(offset + chunkLength, length - chunkLength, diskNumber), chunkLength);
  19670. }
  19671. reader.lastDiskNumber = Math$1.max(currentDiskNumber, reader.lastDiskNumber);
  19672. return result;
  19673. }
  19674. }
  19675. class SplitDataWriter extends Stream {
  19676. constructor(writerGenerator, maxSize = 4294967295) {
  19677. super();
  19678. const zipWriter = this;
  19679. Object$1.assign(zipWriter, {
  19680. diskNumber: 0,
  19681. diskOffset: 0,
  19682. size: 0,
  19683. maxSize,
  19684. availableSize: maxSize
  19685. });
  19686. let diskSourceWriter, diskWritable, diskWriter;
  19687. const writable = new WritableStream({
  19688. async write(chunk) {
  19689. const { availableSize } = zipWriter;
  19690. if (!diskWriter) {
  19691. const { value, done } = await writerGenerator.next();
  19692. if (done && !value) {
  19693. throw new Error$1(ERR_ITERATOR_COMPLETED_TOO_SOON);
  19694. } else {
  19695. diskSourceWriter = value;
  19696. diskSourceWriter.size = 0;
  19697. if (diskSourceWriter.maxSize) {
  19698. zipWriter.maxSize = diskSourceWriter.maxSize;
  19699. }
  19700. zipWriter.availableSize = zipWriter.maxSize;
  19701. await initStream(diskSourceWriter);
  19702. diskWritable = value.writable;
  19703. diskWriter = diskWritable.getWriter();
  19704. }
  19705. await this.write(chunk);
  19706. } else if (chunk.length >= availableSize) {
  19707. await writeChunk(chunk.slice(0, availableSize));
  19708. await closeDisk();
  19709. zipWriter.diskOffset += diskSourceWriter.size;
  19710. zipWriter.diskNumber++;
  19711. diskWriter = null;
  19712. await this.write(chunk.slice(availableSize));
  19713. } else {
  19714. await writeChunk(chunk);
  19715. }
  19716. },
  19717. async close() {
  19718. await diskWriter.ready;
  19719. await closeDisk();
  19720. }
  19721. });
  19722. Object$1.defineProperty(zipWriter, PROPERTY_NAME_WRITABLE, {
  19723. get() {
  19724. return writable;
  19725. }
  19726. });
  19727. async function writeChunk(chunk) {
  19728. const chunkLength = chunk.length;
  19729. if (chunkLength) {
  19730. await diskWriter.ready;
  19731. await diskWriter.write(chunk);
  19732. diskSourceWriter.size += chunkLength;
  19733. zipWriter.size += chunkLength;
  19734. zipWriter.availableSize -= chunkLength;
  19735. }
  19736. }
  19737. async function closeDisk() {
  19738. diskWritable.size = diskSourceWriter.size;
  19739. await diskWriter.close();
  19740. }
  19741. }
  19742. }
  19743. function isHttpFamily(url) {
  19744. const { baseURL } = getConfiguration();
  19745. const { protocol } = new URL$2(url, baseURL);
  19746. return protocol == "http:" || protocol == "https:";
  19747. }
  19748. async function initStream(stream, initSize) {
  19749. if (stream.init && !stream.initialized) {
  19750. await stream.init(initSize);
  19751. }
  19752. }
  19753. function initReader(reader) {
  19754. if (Array$1.isArray(reader)) {
  19755. reader = new SplitDataReader(reader);
  19756. }
  19757. if (reader instanceof ReadableStream) {
  19758. reader = {
  19759. readable: reader
  19760. };
  19761. }
  19762. return reader;
  19763. }
  19764. function initWriter(writer) {
  19765. if (writer.writable === UNDEFINED_VALUE && typeof writer.next == FUNCTION_TYPE$1) {
  19766. writer = new SplitDataWriter(writer);
  19767. }
  19768. if (writer instanceof WritableStream) {
  19769. writer = {
  19770. writable: writer
  19771. };
  19772. }
  19773. const { writable } = writer;
  19774. if (writable.size === UNDEFINED_VALUE) {
  19775. writable.size = 0;
  19776. }
  19777. const splitZipFile = writer instanceof SplitDataWriter;
  19778. if (!splitZipFile) {
  19779. Object$1.assign(writer, {
  19780. diskNumber: 0,
  19781. diskOffset: 0,
  19782. availableSize: Infinity,
  19783. maxSize: Infinity
  19784. });
  19785. }
  19786. return writer;
  19787. }
  19788. function readUint8Array(reader, offset, size, diskNumber) {
  19789. return reader.readUint8Array(offset, size, diskNumber);
  19790. }
  19791. const SplitZipReader = SplitDataReader;
  19792. const SplitZipWriter = SplitDataWriter;
  19793. /*
  19794. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  19795. Redistribution and use in source and binary forms, with or without
  19796. modification, are permitted provided that the following conditions are met:
  19797. 1. Redistributions of source code must retain the above copyright notice,
  19798. this list of conditions and the following disclaimer.
  19799. 2. Redistributions in binary form must reproduce the above copyright
  19800. notice, this list of conditions and the following disclaimer in
  19801. the documentation and/or other materials provided with the distribution.
  19802. 3. The names of the authors may not be used to endorse or promote products
  19803. derived from this software without specific prior written permission.
  19804. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  19805. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  19806. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  19807. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  19808. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  19809. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  19810. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  19811. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  19812. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  19813. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  19814. */
  19815. /* global TextDecoder */
  19816. const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
  19817. const VALID_CP437 = CP437.length == 256;
  19818. function decodeCP437(stringValue) {
  19819. if (VALID_CP437) {
  19820. let result = "";
  19821. for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
  19822. result += CP437[stringValue[indexCharacter]];
  19823. }
  19824. return result;
  19825. } else {
  19826. return new TextDecoder$1().decode(stringValue);
  19827. }
  19828. }
  19829. /*
  19830. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  19831. Redistribution and use in source and binary forms, with or without
  19832. modification, are permitted provided that the following conditions are met:
  19833. 1. Redistributions of source code must retain the above copyright notice,
  19834. this list of conditions and the following disclaimer.
  19835. 2. Redistributions in binary form must reproduce the above copyright
  19836. notice, this list of conditions and the following disclaimer in
  19837. the documentation and/or other materials provided with the distribution.
  19838. 3. The names of the authors may not be used to endorse or promote products
  19839. derived from this software without specific prior written permission.
  19840. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  19841. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  19842. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  19843. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  19844. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  19845. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  19846. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  19847. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  19848. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  19849. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  19850. */
  19851. function decodeText(value, encoding) {
  19852. if (encoding && encoding.trim().toLowerCase() == "cp437") {
  19853. return decodeCP437(value);
  19854. } else {
  19855. return new TextDecoder$1(encoding).decode(value);
  19856. }
  19857. }
  19858. /*
  19859. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  19860. Redistribution and use in source and binary forms, with or without
  19861. modification, are permitted provided that the following conditions are met:
  19862. 1. Redistributions of source code must retain the above copyright notice,
  19863. this list of conditions and the following disclaimer.
  19864. 2. Redistributions in binary form must reproduce the above copyright
  19865. notice, this list of conditions and the following disclaimer in
  19866. the documentation and/or other materials provided with the distribution.
  19867. 3. The names of the authors may not be used to endorse or promote products
  19868. derived from this software without specific prior written permission.
  19869. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  19870. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  19871. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  19872. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  19873. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  19874. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  19875. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  19876. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  19877. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  19878. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  19879. */
  19880. const PROPERTY_NAME_FILENAME = "filename";
  19881. const PROPERTY_NAME_RAW_FILENAME = "rawFilename";
  19882. const PROPERTY_NAME_COMMENT = "comment";
  19883. const PROPERTY_NAME_RAW_COMMENT = "rawComment";
  19884. const PROPERTY_NAME_UNCOMPPRESSED_SIZE = "uncompressedSize";
  19885. const PROPERTY_NAME_COMPPRESSED_SIZE = "compressedSize";
  19886. const PROPERTY_NAME_OFFSET = "offset";
  19887. const PROPERTY_NAME_DISK_NUMBER_START = "diskNumberStart";
  19888. const PROPERTY_NAME_LAST_MODIFICATION_DATE = "lastModDate";
  19889. const PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE = "rawLastModDate";
  19890. const PROPERTY_NAME_LAST_ACCESS_DATE = "lastAccessDate";
  19891. const PROPERTY_NAME_RAW_LAST_ACCESS_DATE = "rawLastAccessDate";
  19892. const PROPERTY_NAME_CREATION_DATE = "creationDate";
  19893. const PROPERTY_NAME_RAW_CREATION_DATE = "rawCreationDate";
  19894. const PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTE = "internalFileAttribute";
  19895. const PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTE = "externalFileAttribute";
  19896. const PROPERTY_NAME_MS_DOS_COMPATIBLE = "msDosCompatible";
  19897. const PROPERTY_NAME_ZIP64 = "zip64";
  19898. const PROPERTY_NAMES = [
  19899. PROPERTY_NAME_FILENAME, PROPERTY_NAME_RAW_FILENAME, PROPERTY_NAME_COMPPRESSED_SIZE, PROPERTY_NAME_UNCOMPPRESSED_SIZE,
  19900. PROPERTY_NAME_LAST_MODIFICATION_DATE, PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE, PROPERTY_NAME_COMMENT, PROPERTY_NAME_RAW_COMMENT,
  19901. PROPERTY_NAME_LAST_ACCESS_DATE, PROPERTY_NAME_CREATION_DATE, PROPERTY_NAME_OFFSET, PROPERTY_NAME_DISK_NUMBER_START,
  19902. PROPERTY_NAME_DISK_NUMBER_START, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTE, PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTE,
  19903. PROPERTY_NAME_MS_DOS_COMPATIBLE, PROPERTY_NAME_ZIP64,
  19904. "directory", "bitFlag", "encrypted", "signature", "filenameUTF8", "commentUTF8", "compressionMethod", "version", "versionMadeBy",
  19905. "extraField", "rawExtraField", "extraFieldZip64", "extraFieldUnicodePath", "extraFieldUnicodeComment", "extraFieldAES", "extraFieldNTFS",
  19906. "extraFieldExtendedTimestamp"];
  19907. class Entry {
  19908. constructor(data) {
  19909. PROPERTY_NAMES.forEach(name => this[name] = data[name]);
  19910. }
  19911. }
  19912. /*
  19913. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  19914. Redistribution and use in source and binary forms, with or without
  19915. modification, are permitted provided that the following conditions are met:
  19916. 1. Redistributions of source code must retain the above copyright notice,
  19917. this list of conditions and the following disclaimer.
  19918. 2. Redistributions in binary form must reproduce the above copyright
  19919. notice, this list of conditions and the following disclaimer in
  19920. the documentation and/or other materials provided with the distribution.
  19921. 3. The names of the authors may not be used to endorse or promote products
  19922. derived from this software without specific prior written permission.
  19923. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  19924. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  19925. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  19926. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  19927. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  19928. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  19929. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  19930. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  19931. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  19932. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  19933. */
  19934. const ERR_BAD_FORMAT = "File format is not recognized";
  19935. const ERR_EOCDR_NOT_FOUND = "End of central directory not found";
  19936. const ERR_EOCDR_ZIP64_NOT_FOUND = "End of Zip64 central directory not found";
  19937. const ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = "End of Zip64 central directory locator not found";
  19938. const ERR_CENTRAL_DIRECTORY_NOT_FOUND = "Central directory header not found";
  19939. const ERR_LOCAL_FILE_HEADER_NOT_FOUND = "Local file header not found";
  19940. const ERR_EXTRAFIELD_ZIP64_NOT_FOUND = "Zip64 extra field not found";
  19941. const ERR_ENCRYPTED = "File contains encrypted entry";
  19942. const ERR_UNSUPPORTED_ENCRYPTION = "Encryption method not supported";
  19943. const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
  19944. const ERR_SPLIT_ZIP_FILE = "Split zip file";
  19945. const CHARSET_UTF8 = "utf-8";
  19946. const CHARSET_CP437 = "cp437";
  19947. const ZIP64_PROPERTIES = [
  19948. [PROPERTY_NAME_UNCOMPPRESSED_SIZE, MAX_32_BITS],
  19949. [PROPERTY_NAME_COMPPRESSED_SIZE, MAX_32_BITS],
  19950. [PROPERTY_NAME_OFFSET, MAX_32_BITS],
  19951. [PROPERTY_NAME_DISK_NUMBER_START, MAX_16_BITS]
  19952. ];
  19953. const ZIP64_EXTRACTION = {
  19954. [MAX_16_BITS]: {
  19955. getValue: getUint32,
  19956. bytes: 4
  19957. },
  19958. [MAX_32_BITS]: {
  19959. getValue: getBigUint64,
  19960. bytes: 8
  19961. }
  19962. };
  19963. class ZipReader {
  19964. constructor(reader, options = {}) {
  19965. Object$1.assign(this, {
  19966. reader: initReader(reader),
  19967. options,
  19968. config: getConfiguration()
  19969. });
  19970. }
  19971. async* getEntriesGenerator(options = {}) {
  19972. const zipReader = this;
  19973. let { reader } = zipReader;
  19974. const { config } = zipReader;
  19975. await initStream(reader);
  19976. if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
  19977. reader = new BlobReader(await new Response(reader.readable).blob());
  19978. await initStream(reader);
  19979. }
  19980. if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
  19981. throw new Error$1(ERR_BAD_FORMAT);
  19982. }
  19983. reader.chunkSize = getChunkSize(config);
  19984. const endOfDirectoryInfo = await seekSignature(reader, END_OF_CENTRAL_DIR_SIGNATURE, reader.size, END_OF_CENTRAL_DIR_LENGTH, MAX_16_BITS * 16);
  19985. if (!endOfDirectoryInfo) {
  19986. const signatureArray = await readUint8Array(reader, 0, 4);
  19987. const signatureView = getDataView$1(signatureArray);
  19988. if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
  19989. throw new Error$1(ERR_SPLIT_ZIP_FILE);
  19990. } else {
  19991. throw new Error$1(ERR_EOCDR_NOT_FOUND);
  19992. }
  19993. }
  19994. const endOfDirectoryView = getDataView$1(endOfDirectoryInfo);
  19995. let directoryDataLength = getUint32(endOfDirectoryView, 12);
  19996. let directoryDataOffset = getUint32(endOfDirectoryView, 16);
  19997. const commentOffset = endOfDirectoryInfo.offset;
  19998. const commentLength = getUint16(endOfDirectoryView, 20);
  19999. const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
  20000. let lastDiskNumber = getUint16(endOfDirectoryView, 4);
  20001. const expectedLastDiskNumber = reader.lastDiskNumber || 0;
  20002. let diskNumber = getUint16(endOfDirectoryView, 6);
  20003. let filesLength = getUint16(endOfDirectoryView, 8);
  20004. let prependedDataLength = 0;
  20005. let startOffset = 0;
  20006. if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS) {
  20007. const endOfDirectoryLocatorArray = await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH);
  20008. const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
  20009. if (getUint32(endOfDirectoryLocatorView, 0) != ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
  20010. throw new Error$1(ERR_EOCDR_ZIP64_NOT_FOUND);
  20011. }
  20012. directoryDataOffset = getBigUint64(endOfDirectoryLocatorView, 8);
  20013. let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
  20014. let endOfDirectoryView = getDataView$1(endOfDirectoryArray);
  20015. const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
  20016. if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE && directoryDataOffset != expectedDirectoryDataOffset) {
  20017. const originalDirectoryDataOffset = directoryDataOffset;
  20018. directoryDataOffset = expectedDirectoryDataOffset;
  20019. prependedDataLength = directoryDataOffset - originalDirectoryDataOffset;
  20020. endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
  20021. endOfDirectoryView = getDataView$1(endOfDirectoryArray);
  20022. }
  20023. if (getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
  20024. throw new Error$1(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
  20025. }
  20026. if (lastDiskNumber == MAX_16_BITS) {
  20027. lastDiskNumber = getUint32(endOfDirectoryView, 16);
  20028. }
  20029. if (diskNumber == MAX_16_BITS) {
  20030. diskNumber = getUint32(endOfDirectoryView, 20);
  20031. }
  20032. if (filesLength == MAX_16_BITS) {
  20033. filesLength = getBigUint64(endOfDirectoryView, 32);
  20034. }
  20035. if (directoryDataLength == MAX_32_BITS) {
  20036. directoryDataLength = getBigUint64(endOfDirectoryView, 40);
  20037. }
  20038. directoryDataOffset -= directoryDataLength;
  20039. }
  20040. if (directoryDataOffset >= reader.size) {
  20041. prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
  20042. directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
  20043. }
  20044. if (expectedLastDiskNumber != lastDiskNumber) {
  20045. throw new Error$1(ERR_SPLIT_ZIP_FILE);
  20046. }
  20047. if (directoryDataOffset < 0) {
  20048. throw new Error$1(ERR_BAD_FORMAT);
  20049. }
  20050. let offset = 0;
  20051. let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
  20052. let directoryView = getDataView$1(directoryArray);
  20053. if (directoryDataLength) {
  20054. const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - directoryDataLength;
  20055. if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE && directoryDataOffset != expectedDirectoryDataOffset) {
  20056. const originalDirectoryDataOffset = directoryDataOffset;
  20057. directoryDataOffset = expectedDirectoryDataOffset;
  20058. prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
  20059. directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
  20060. directoryView = getDataView$1(directoryArray);
  20061. }
  20062. }
  20063. const expectedDirectoryDataLength = endOfDirectoryInfo.offset - directoryDataOffset - (reader.lastDiskOffset || 0);
  20064. if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0) {
  20065. directoryDataLength = expectedDirectoryDataLength;
  20066. directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
  20067. directoryView = getDataView$1(directoryArray);
  20068. }
  20069. if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
  20070. throw new Error$1(ERR_BAD_FORMAT);
  20071. }
  20072. const filenameEncoding = getOptionValue$1(zipReader, options, "filenameEncoding");
  20073. const commentEncoding = getOptionValue$1(zipReader, options, "commentEncoding");
  20074. for (let indexFile = 0; indexFile < filesLength; indexFile++) {
  20075. const fileEntry = new ZipEntry(reader, config, zipReader.options);
  20076. if (getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
  20077. throw new Error$1(ERR_CENTRAL_DIRECTORY_NOT_FOUND);
  20078. }
  20079. readCommonHeader(fileEntry, directoryView, offset + 6);
  20080. const languageEncodingFlag = Boolean(fileEntry.bitFlag.languageEncodingFlag);
  20081. const filenameOffset = offset + 46;
  20082. const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
  20083. const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
  20084. const versionMadeBy = getUint16(directoryView, offset + 4);
  20085. const msDosCompatible = (versionMadeBy & 0) == 0;
  20086. const rawFilename = directoryArray.subarray(filenameOffset, extraFieldOffset);
  20087. const commentLength = getUint16(directoryView, offset + 32);
  20088. const endOffset = commentOffset + commentLength;
  20089. const rawComment = directoryArray.subarray(commentOffset, endOffset);
  20090. const filenameUTF8 = languageEncodingFlag;
  20091. const commentUTF8 = languageEncodingFlag;
  20092. const directory = msDosCompatible && ((getUint8(directoryView, offset + 38) & FILE_ATTR_MSDOS_DIR_MASK) == FILE_ATTR_MSDOS_DIR_MASK);
  20093. const offsetFileEntry = getUint32(directoryView, offset + 42) + prependedDataLength;
  20094. Object$1.assign(fileEntry, {
  20095. versionMadeBy,
  20096. msDosCompatible,
  20097. compressedSize: 0,
  20098. uncompressedSize: 0,
  20099. commentLength,
  20100. directory,
  20101. offset: offsetFileEntry,
  20102. diskNumberStart: getUint16(directoryView, offset + 34),
  20103. internalFileAttribute: getUint16(directoryView, offset + 36),
  20104. externalFileAttribute: getUint32(directoryView, offset + 38),
  20105. rawFilename,
  20106. filenameUTF8,
  20107. commentUTF8,
  20108. rawExtraField: directoryArray.subarray(extraFieldOffset, commentOffset)
  20109. });
  20110. const [filename, comment] = await Promise$1.all([
  20111. decodeText(rawFilename, filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437),
  20112. decodeText(rawComment, commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437)
  20113. ]);
  20114. Object$1.assign(fileEntry, {
  20115. rawComment,
  20116. filename,
  20117. comment,
  20118. directory: directory || filename.endsWith(DIRECTORY_SIGNATURE)
  20119. });
  20120. startOffset = Math$1.max(offsetFileEntry, startOffset);
  20121. await readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
  20122. const entry = new Entry(fileEntry);
  20123. entry.getData = (writer, options) => fileEntry.getData(writer, entry, options);
  20124. offset = endOffset;
  20125. const { onprogress } = options;
  20126. if (onprogress) {
  20127. try {
  20128. await onprogress(indexFile + 1, filesLength, new Entry(fileEntry));
  20129. } catch (_error) {
  20130. // ignored
  20131. }
  20132. }
  20133. yield entry;
  20134. }
  20135. const extractPrependedData = getOptionValue$1(zipReader, options, "extractPrependedData");
  20136. const extractAppendedData = getOptionValue$1(zipReader, options, "extractAppendedData");
  20137. if (extractPrependedData) {
  20138. zipReader.prependedData = startOffset > 0 ? await readUint8Array(reader, 0, startOffset) : new Uint8Array$1();
  20139. }
  20140. zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : new Uint8Array$1();
  20141. if (extractAppendedData) {
  20142. zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : new Uint8Array$1();
  20143. }
  20144. return true;
  20145. }
  20146. async getEntries(options = {}) {
  20147. const entries = [];
  20148. for await (const entry of this.getEntriesGenerator(options)) {
  20149. entries.push(entry);
  20150. }
  20151. return entries;
  20152. }
  20153. async close() {
  20154. }
  20155. }
  20156. class ZipEntry {
  20157. constructor(reader, config, options) {
  20158. Object$1.assign(this, {
  20159. reader,
  20160. config,
  20161. options
  20162. });
  20163. }
  20164. async getData(writer, fileEntry, options = {}) {
  20165. const zipEntry = this;
  20166. const {
  20167. reader,
  20168. offset,
  20169. diskNumberStart,
  20170. extraFieldAES,
  20171. compressionMethod,
  20172. config,
  20173. bitFlag,
  20174. signature,
  20175. rawLastModDate,
  20176. uncompressedSize,
  20177. compressedSize
  20178. } = zipEntry;
  20179. const localDirectory = fileEntry.localDirectory = {};
  20180. const dataArray = await readUint8Array(reader, offset, 30, diskNumberStart);
  20181. const dataView = getDataView$1(dataArray);
  20182. let password = getOptionValue$1(zipEntry, options, "password");
  20183. password = password && password.length && password;
  20184. if (extraFieldAES) {
  20185. if (extraFieldAES.originalCompressionMethod != COMPRESSION_METHOD_AES) {
  20186. throw new Error$1(ERR_UNSUPPORTED_COMPRESSION);
  20187. }
  20188. }
  20189. if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE) {
  20190. throw new Error$1(ERR_UNSUPPORTED_COMPRESSION);
  20191. }
  20192. if (getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
  20193. throw new Error$1(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
  20194. }
  20195. readCommonHeader(localDirectory, dataView, 4);
  20196. localDirectory.rawExtraField = localDirectory.extraFieldLength ?
  20197. await readUint8Array(reader, offset + 30 + localDirectory.filenameLength, localDirectory.extraFieldLength, diskNumberStart) :
  20198. new Uint8Array$1();
  20199. await readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
  20200. Object$1.assign(fileEntry, {
  20201. lastAccessDate: localDirectory.lastAccessDate,
  20202. creationDate: localDirectory.creationDate
  20203. });
  20204. const encrypted = zipEntry.encrypted && localDirectory.encrypted;
  20205. const zipCrypto = encrypted && !extraFieldAES;
  20206. if (encrypted) {
  20207. if (!zipCrypto && extraFieldAES.strength === UNDEFINED_VALUE) {
  20208. throw new Error$1(ERR_UNSUPPORTED_ENCRYPTION);
  20209. } else if (!password) {
  20210. throw new Error$1(ERR_ENCRYPTED);
  20211. }
  20212. }
  20213. const dataOffset = offset + 30 + localDirectory.filenameLength + localDirectory.extraFieldLength;
  20214. const size = compressedSize;
  20215. const readable = reader.readable;
  20216. Object$1.assign(readable, {
  20217. diskNumberStart,
  20218. offset: dataOffset,
  20219. size
  20220. });
  20221. const signal = getOptionValue$1(zipEntry, options, "signal");
  20222. const checkPasswordOnly = getOptionValue$1(zipEntry, options, "checkPasswordOnly");
  20223. if (checkPasswordOnly) {
  20224. writer = new WritableStream();
  20225. }
  20226. writer = initWriter(writer);
  20227. await initStream(writer, uncompressedSize);
  20228. const { writable } = writer;
  20229. const { onstart, onprogress, onend } = options;
  20230. const workerOptions = {
  20231. options: {
  20232. codecType: CODEC_INFLATE,
  20233. password,
  20234. zipCrypto,
  20235. encryptionStrength: extraFieldAES && extraFieldAES.strength,
  20236. signed: getOptionValue$1(zipEntry, options, "checkSignature"),
  20237. passwordVerification: zipCrypto && (bitFlag.dataDescriptor ? ((rawLastModDate >>> 8) & 0xFF) : ((signature >>> 24) & 0xFF)),
  20238. signature,
  20239. compressed: compressionMethod != 0,
  20240. encrypted,
  20241. useWebWorkers: getOptionValue$1(zipEntry, options, "useWebWorkers"),
  20242. useCompressionStream: getOptionValue$1(zipEntry, options, "useCompressionStream"),
  20243. transferStreams: getOptionValue$1(zipEntry, options, "transferStreams"),
  20244. checkPasswordOnly
  20245. },
  20246. config,
  20247. streamOptions: { signal, size, onstart, onprogress, onend }
  20248. };
  20249. let outputSize = 0;
  20250. try {
  20251. ({ outputSize } = (await runWorker({ readable, writable }, workerOptions)));
  20252. } catch (error) {
  20253. if (!checkPasswordOnly || error.message != ERR_ABORT_CHECK_PASSWORD) {
  20254. throw error;
  20255. }
  20256. } finally {
  20257. const preventClose = getOptionValue$1(zipEntry, options, "preventClose");
  20258. writable.size += outputSize;
  20259. if (!preventClose && !writable.locked) {
  20260. await writable.getWriter().close();
  20261. }
  20262. }
  20263. return checkPasswordOnly ? undefined : writer.getData ? writer.getData() : writable;
  20264. }
  20265. }
  20266. function readCommonHeader(directory, dataView, offset) {
  20267. const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
  20268. const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
  20269. const rawLastModDate = getUint32(dataView, offset + 6);
  20270. Object$1.assign(directory, {
  20271. encrypted,
  20272. version: getUint16(dataView, offset),
  20273. bitFlag: {
  20274. level: (rawBitFlag & BITFLAG_LEVEL) >> 1,
  20275. dataDescriptor: (rawBitFlag & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR,
  20276. languageEncodingFlag: (rawBitFlag & BITFLAG_LANG_ENCODING_FLAG) == BITFLAG_LANG_ENCODING_FLAG
  20277. },
  20278. rawLastModDate,
  20279. lastModDate: getDate(rawLastModDate),
  20280. filenameLength: getUint16(dataView, offset + 22),
  20281. extraFieldLength: getUint16(dataView, offset + 24)
  20282. });
  20283. }
  20284. async function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory) {
  20285. const { rawExtraField } = directory;
  20286. const extraField = directory.extraField = new Map$1();
  20287. const rawExtraFieldView = getDataView$1(new Uint8Array$1(rawExtraField));
  20288. let offsetExtraField = 0;
  20289. try {
  20290. while (offsetExtraField < rawExtraField.length) {
  20291. const type = getUint16(rawExtraFieldView, offsetExtraField);
  20292. const size = getUint16(rawExtraFieldView, offsetExtraField + 2);
  20293. extraField.set(type, {
  20294. type,
  20295. data: rawExtraField.slice(offsetExtraField + 4, offsetExtraField + 4 + size)
  20296. });
  20297. offsetExtraField += 4 + size;
  20298. }
  20299. } catch (_error) {
  20300. // ignored
  20301. }
  20302. const compressionMethod = getUint16(dataView, offset + 4);
  20303. Object$1.assign(directory, {
  20304. signature: getUint32(dataView, offset + 10),
  20305. uncompressedSize: getUint32(dataView, offset + 18),
  20306. compressedSize: getUint32(dataView, offset + 14)
  20307. });
  20308. const extraFieldZip64 = extraField.get(EXTRAFIELD_TYPE_ZIP64);
  20309. if (extraFieldZip64) {
  20310. readExtraFieldZip64(extraFieldZip64, directory);
  20311. directory.extraFieldZip64 = extraFieldZip64;
  20312. }
  20313. const extraFieldUnicodePath = extraField.get(EXTRAFIELD_TYPE_UNICODE_PATH);
  20314. if (extraFieldUnicodePath) {
  20315. await readExtraFieldUnicode(extraFieldUnicodePath, PROPERTY_NAME_FILENAME, PROPERTY_NAME_RAW_FILENAME, directory, fileEntry);
  20316. directory.extraFieldUnicodePath = extraFieldUnicodePath;
  20317. }
  20318. const extraFieldUnicodeComment = extraField.get(EXTRAFIELD_TYPE_UNICODE_COMMENT);
  20319. if (extraFieldUnicodeComment) {
  20320. await readExtraFieldUnicode(extraFieldUnicodeComment, PROPERTY_NAME_COMMENT, PROPERTY_NAME_RAW_COMMENT, directory, fileEntry);
  20321. directory.extraFieldUnicodeComment = extraFieldUnicodeComment;
  20322. }
  20323. const extraFieldAES = extraField.get(EXTRAFIELD_TYPE_AES);
  20324. if (extraFieldAES) {
  20325. readExtraFieldAES(extraFieldAES, directory, compressionMethod);
  20326. directory.extraFieldAES = extraFieldAES;
  20327. } else {
  20328. directory.compressionMethod = compressionMethod;
  20329. }
  20330. const extraFieldNTFS = extraField.get(EXTRAFIELD_TYPE_NTFS);
  20331. if (extraFieldNTFS) {
  20332. readExtraFieldNTFS(extraFieldNTFS, directory);
  20333. directory.extraFieldNTFS = extraFieldNTFS;
  20334. }
  20335. const extraFieldExtendedTimestamp = extraField.get(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
  20336. if (extraFieldExtendedTimestamp) {
  20337. readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory);
  20338. directory.extraFieldExtendedTimestamp = extraFieldExtendedTimestamp;
  20339. }
  20340. const extraFieldUSDZ = extraField.get(EXTRAFIELD_TYPE_USDZ);
  20341. if (extraFieldUSDZ) {
  20342. directory.extraFieldUSDZ = extraFieldUSDZ;
  20343. }
  20344. }
  20345. function readExtraFieldZip64(extraFieldZip64, directory) {
  20346. directory.zip64 = true;
  20347. const extraFieldView = getDataView$1(extraFieldZip64.data);
  20348. const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
  20349. for (let indexMissingProperty = 0, offset = 0; indexMissingProperty < missingProperties.length; indexMissingProperty++) {
  20350. const [propertyName, max] = missingProperties[indexMissingProperty];
  20351. if (directory[propertyName] == max) {
  20352. const extraction = ZIP64_EXTRACTION[max];
  20353. directory[propertyName] = extraFieldZip64[propertyName] = extraction.getValue(extraFieldView, offset);
  20354. offset += extraction.bytes;
  20355. } else if (extraFieldZip64[propertyName]) {
  20356. throw new Error$1(ERR_EXTRAFIELD_ZIP64_NOT_FOUND);
  20357. }
  20358. }
  20359. }
  20360. async function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName, directory, fileEntry) {
  20361. const extraFieldView = getDataView$1(extraFieldUnicode.data);
  20362. const crc32 = new Crc32();
  20363. crc32.append(fileEntry[rawPropertyName]);
  20364. const dataViewSignature = getDataView$1(new Uint8Array$1(4));
  20365. dataViewSignature.setUint32(0, crc32.get(), true);
  20366. const signature = getUint32(extraFieldView, 1);
  20367. Object$1.assign(extraFieldUnicode, {
  20368. version: getUint8(extraFieldView, 0),
  20369. [propertyName]: decodeText(extraFieldUnicode.data.subarray(5)),
  20370. valid: !fileEntry.bitFlag.languageEncodingFlag && signature == getUint32(dataViewSignature, 0)
  20371. });
  20372. if (extraFieldUnicode.valid) {
  20373. directory[propertyName] = extraFieldUnicode[propertyName];
  20374. directory[propertyName + "UTF8"] = true;
  20375. }
  20376. }
  20377. function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
  20378. const extraFieldView = getDataView$1(extraFieldAES.data);
  20379. const strength = getUint8(extraFieldView, 4);
  20380. Object$1.assign(extraFieldAES, {
  20381. vendorVersion: getUint8(extraFieldView, 0),
  20382. vendorId: getUint8(extraFieldView, 2),
  20383. strength,
  20384. originalCompressionMethod: compressionMethod,
  20385. compressionMethod: getUint16(extraFieldView, 5)
  20386. });
  20387. directory.compressionMethod = extraFieldAES.compressionMethod;
  20388. }
  20389. function readExtraFieldNTFS(extraFieldNTFS, directory) {
  20390. const extraFieldView = getDataView$1(extraFieldNTFS.data);
  20391. let offsetExtraField = 4;
  20392. let tag1Data;
  20393. try {
  20394. while (offsetExtraField < extraFieldNTFS.data.length && !tag1Data) {
  20395. const tagValue = getUint16(extraFieldView, offsetExtraField);
  20396. const attributeSize = getUint16(extraFieldView, offsetExtraField + 2);
  20397. if (tagValue == EXTRAFIELD_TYPE_NTFS_TAG1) {
  20398. tag1Data = extraFieldNTFS.data.slice(offsetExtraField + 4, offsetExtraField + 4 + attributeSize);
  20399. }
  20400. offsetExtraField += 4 + attributeSize;
  20401. }
  20402. } catch (_error) {
  20403. // ignored
  20404. }
  20405. try {
  20406. if (tag1Data && tag1Data.length == 24) {
  20407. const tag1View = getDataView$1(tag1Data);
  20408. const rawLastModDate = tag1View.getBigUint64(0, true);
  20409. const rawLastAccessDate = tag1View.getBigUint64(8, true);
  20410. const rawCreationDate = tag1View.getBigUint64(16, true);
  20411. Object$1.assign(extraFieldNTFS, {
  20412. rawLastModDate,
  20413. rawLastAccessDate,
  20414. rawCreationDate
  20415. });
  20416. const lastModDate = getDateNTFS(rawLastModDate);
  20417. const lastAccessDate = getDateNTFS(rawLastAccessDate);
  20418. const creationDate = getDateNTFS(rawCreationDate);
  20419. const extraFieldData = { lastModDate, lastAccessDate, creationDate };
  20420. Object$1.assign(extraFieldNTFS, extraFieldData);
  20421. Object$1.assign(directory, extraFieldData);
  20422. }
  20423. } catch (_error) {
  20424. // ignored
  20425. }
  20426. }
  20427. function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory, localDirectory) {
  20428. const extraFieldView = getDataView$1(extraFieldExtendedTimestamp.data);
  20429. const flags = getUint8(extraFieldView, 0);
  20430. const timeProperties = [];
  20431. const timeRawProperties = [];
  20432. if (localDirectory) {
  20433. if ((flags & 0x1) == 0x1) {
  20434. timeProperties.push(PROPERTY_NAME_LAST_MODIFICATION_DATE);
  20435. timeRawProperties.push(PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE);
  20436. }
  20437. if ((flags & 0x2) == 0x2) {
  20438. timeProperties.push(PROPERTY_NAME_LAST_ACCESS_DATE);
  20439. timeRawProperties.push(PROPERTY_NAME_RAW_LAST_ACCESS_DATE);
  20440. }
  20441. if ((flags & 0x4) == 0x4) {
  20442. timeProperties.push(PROPERTY_NAME_CREATION_DATE);
  20443. timeRawProperties.push(PROPERTY_NAME_RAW_CREATION_DATE);
  20444. }
  20445. } else if (extraFieldExtendedTimestamp.data.length >= 5) {
  20446. timeProperties.push(PROPERTY_NAME_LAST_MODIFICATION_DATE);
  20447. timeRawProperties.push(PROPERTY_NAME_RAW_LAST_MODIFICATION_DATE);
  20448. }
  20449. let offset = 1;
  20450. timeProperties.forEach((propertyName, indexProperty) => {
  20451. if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
  20452. const time = getUint32(extraFieldView, offset);
  20453. directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date$1(time * 1000);
  20454. const rawPropertyName = timeRawProperties[indexProperty];
  20455. extraFieldExtendedTimestamp[rawPropertyName] = time;
  20456. }
  20457. offset += 4;
  20458. });
  20459. }
  20460. async function seekSignature(reader, signature, startOffset, minimumBytes, maximumLength) {
  20461. const signatureArray = new Uint8Array$1(4);
  20462. const signatureView = getDataView$1(signatureArray);
  20463. setUint32$1(signatureView, 0, signature);
  20464. const maximumBytes = minimumBytes + maximumLength;
  20465. return (await seek(minimumBytes)) || await seek(Math$1.min(maximumBytes, startOffset));
  20466. async function seek(length) {
  20467. const offset = startOffset - length;
  20468. const bytes = await readUint8Array(reader, offset, length);
  20469. for (let indexByte = bytes.length - minimumBytes; indexByte >= 0; indexByte--) {
  20470. if (bytes[indexByte] == signatureArray[0] && bytes[indexByte + 1] == signatureArray[1] &&
  20471. bytes[indexByte + 2] == signatureArray[2] && bytes[indexByte + 3] == signatureArray[3]) {
  20472. return {
  20473. offset: offset + indexByte,
  20474. buffer: bytes.slice(indexByte, indexByte + minimumBytes).buffer
  20475. };
  20476. }
  20477. }
  20478. }
  20479. }
  20480. function getOptionValue$1(zipReader, options, name) {
  20481. return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
  20482. }
  20483. function getDate(timeRaw) {
  20484. const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & 0x0000ffff;
  20485. try {
  20486. return new Date$1(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
  20487. } catch (_error) {
  20488. // ignored
  20489. }
  20490. }
  20491. function getDateNTFS(timeRaw) {
  20492. return new Date$1((Number$1((timeRaw / BigInt(10000)) - BigInt(11644473600000))));
  20493. }
  20494. function getUint8(view, offset) {
  20495. return view.getUint8(offset);
  20496. }
  20497. function getUint16(view, offset) {
  20498. return view.getUint16(offset, true);
  20499. }
  20500. function getUint32(view, offset) {
  20501. return view.getUint32(offset, true);
  20502. }
  20503. function getBigUint64(view, offset) {
  20504. return Number$1(view.getBigUint64(offset, true));
  20505. }
  20506. function setUint32$1(view, offset, value) {
  20507. view.setUint32(offset, value, true);
  20508. }
  20509. function getDataView$1(array) {
  20510. return new DataView$1(array.buffer);
  20511. }
  20512. /*
  20513. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  20514. Redistribution and use in source and binary forms, with or without
  20515. modification, are permitted provided that the following conditions are met:
  20516. 1. Redistributions of source code must retain the above copyright notice,
  20517. this list of conditions and the following disclaimer.
  20518. 2. Redistributions in binary form must reproduce the above copyright
  20519. notice, this list of conditions and the following disclaimer in
  20520. the documentation and/or other materials provided with the distribution.
  20521. 3. The names of the authors may not be used to endorse or promote products
  20522. derived from this software without specific prior written permission.
  20523. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  20524. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  20525. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  20526. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  20527. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  20528. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  20529. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  20530. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  20531. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  20532. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  20533. */
  20534. const ERR_DUPLICATED_NAME = "File already exists";
  20535. const ERR_INVALID_COMMENT = "Zip file comment exceeds 64KB";
  20536. const ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB";
  20537. const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB";
  20538. const ERR_INVALID_VERSION = "Version exceeds 65535";
  20539. const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
  20540. const ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535";
  20541. const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
  20542. const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (make sure 'keepOrder' is set to 'true')";
  20543. const EXTRAFIELD_DATA_AES = new Uint8Array$1([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
  20544. let workers = 0;
  20545. const pendingEntries = [];
  20546. class ZipWriter {
  20547. constructor(writer, options = {}) {
  20548. writer = initWriter(writer);
  20549. Object$1.assign(this, {
  20550. writer,
  20551. addSplitZipSignature: writer instanceof SplitDataWriter,
  20552. options,
  20553. config: getConfiguration(),
  20554. files: new Map$1(),
  20555. filenames: new Set$1(),
  20556. offset: writer.writable.size,
  20557. pendingEntriesSize: 0,
  20558. pendingAddFileCalls: new Set$1(),
  20559. bufferedWrites: 0
  20560. });
  20561. }
  20562. async add(name = "", reader, options = {}) {
  20563. const zipWriter = this;
  20564. const {
  20565. pendingAddFileCalls,
  20566. config
  20567. } = zipWriter;
  20568. if (workers < config.maxWorkers) {
  20569. workers++;
  20570. } else {
  20571. await new Promise$1(resolve => pendingEntries.push(resolve));
  20572. }
  20573. let promiseAddFile;
  20574. try {
  20575. name = name.trim();
  20576. if (zipWriter.filenames.has(name)) {
  20577. throw new Error$1(ERR_DUPLICATED_NAME);
  20578. }
  20579. zipWriter.filenames.add(name);
  20580. promiseAddFile = addFile(zipWriter, name, reader, options);
  20581. pendingAddFileCalls.add(promiseAddFile);
  20582. return await promiseAddFile;
  20583. } catch (error) {
  20584. zipWriter.filenames.delete(name);
  20585. throw error;
  20586. } finally {
  20587. pendingAddFileCalls.delete(promiseAddFile);
  20588. const pendingEntry = pendingEntries.shift();
  20589. if (pendingEntry) {
  20590. pendingEntry();
  20591. } else {
  20592. workers--;
  20593. }
  20594. }
  20595. }
  20596. async close(comment = new Uint8Array$1(), options = {}) {
  20597. const zipWriter = this;
  20598. const { pendingAddFileCalls, writer } = this;
  20599. const { writable } = writer;
  20600. while (pendingAddFileCalls.size) {
  20601. await Promise$1.all(Array$1.from(pendingAddFileCalls));
  20602. }
  20603. await closeFile(this, comment, options);
  20604. const preventClose = getOptionValue(zipWriter, options, "preventClose");
  20605. if (!preventClose) {
  20606. await writable.getWriter().close();
  20607. }
  20608. return writer.getData ? writer.getData() : writable;
  20609. }
  20610. }
  20611. async function addFile(zipWriter, name, reader, options) {
  20612. name = name.trim();
  20613. if (options.directory && (!name.endsWith(DIRECTORY_SIGNATURE))) {
  20614. name += DIRECTORY_SIGNATURE;
  20615. } else {
  20616. options.directory = name.endsWith(DIRECTORY_SIGNATURE);
  20617. }
  20618. const rawFilename = encodeText(name);
  20619. if (getLength(rawFilename) > MAX_16_BITS) {
  20620. throw new Error$1(ERR_INVALID_ENTRY_NAME);
  20621. }
  20622. const comment = options.comment || "";
  20623. const rawComment = encodeText(comment);
  20624. if (getLength(rawComment) > MAX_16_BITS) {
  20625. throw new Error$1(ERR_INVALID_ENTRY_COMMENT);
  20626. }
  20627. const version = getOptionValue(zipWriter, options, "version", VERSION_DEFLATE);
  20628. if (version > MAX_16_BITS) {
  20629. throw new Error$1(ERR_INVALID_VERSION);
  20630. }
  20631. const versionMadeBy = getOptionValue(zipWriter, options, "versionMadeBy", 20);
  20632. if (versionMadeBy > MAX_16_BITS) {
  20633. throw new Error$1(ERR_INVALID_VERSION);
  20634. }
  20635. const lastModDate = getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE, new Date$1());
  20636. const lastAccessDate = getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
  20637. const creationDate = getOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
  20638. const msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE, true);
  20639. const internalFileAttribute = getOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTE, 0);
  20640. const externalFileAttribute = getOptionValue(zipWriter, options, PROPERTY_NAME_EXTERNAL_FILE_ATTRIBUTE, 0);
  20641. const password = getOptionValue(zipWriter, options, "password");
  20642. const encryptionStrength = getOptionValue(zipWriter, options, "encryptionStrength", 3);
  20643. const zipCrypto = getOptionValue(zipWriter, options, "zipCrypto");
  20644. const extendedTimestamp = getOptionValue(zipWriter, options, "extendedTimestamp", true);
  20645. const keepOrder = getOptionValue(zipWriter, options, "keepOrder", true);
  20646. const level = getOptionValue(zipWriter, options, "level");
  20647. const useWebWorkers = getOptionValue(zipWriter, options, "useWebWorkers");
  20648. const bufferedWrite = getOptionValue(zipWriter, options, "bufferedWrite");
  20649. const dataDescriptorSignature = getOptionValue(zipWriter, options, "dataDescriptorSignature", false);
  20650. const signal = getOptionValue(zipWriter, options, "signal");
  20651. const useCompressionStream = getOptionValue(zipWriter, options, "useCompressionStream");
  20652. let dataDescriptor = getOptionValue(zipWriter, options, "dataDescriptor", true);
  20653. let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
  20654. if (password !== UNDEFINED_VALUE && encryptionStrength !== UNDEFINED_VALUE && (encryptionStrength < 1 || encryptionStrength > 3)) {
  20655. throw new Error$1(ERR_INVALID_ENCRYPTION_STRENGTH);
  20656. }
  20657. let rawExtraField = new Uint8Array$1();
  20658. const { extraField } = options;
  20659. if (extraField) {
  20660. let extraFieldSize = 0;
  20661. let offset = 0;
  20662. extraField.forEach(data => extraFieldSize += 4 + getLength(data));
  20663. rawExtraField = new Uint8Array$1(extraFieldSize);
  20664. extraField.forEach((data, type) => {
  20665. if (type > MAX_16_BITS) {
  20666. throw new Error$1(ERR_INVALID_EXTRAFIELD_TYPE);
  20667. }
  20668. if (getLength(data) > MAX_16_BITS) {
  20669. throw new Error$1(ERR_INVALID_EXTRAFIELD_DATA);
  20670. }
  20671. arraySet(rawExtraField, new Uint16Array([type]), offset);
  20672. arraySet(rawExtraField, new Uint16Array([getLength(data)]), offset + 2);
  20673. arraySet(rawExtraField, data, offset + 4);
  20674. offset += 4 + getLength(data);
  20675. });
  20676. }
  20677. let maximumCompressedSize = 0;
  20678. let maximumEntrySize = 0;
  20679. let uncompressedSize = 0;
  20680. const zip64Enabled = zip64 === true;
  20681. if (reader) {
  20682. reader = initReader(reader);
  20683. await initStream(reader);
  20684. if (reader.size === UNDEFINED_VALUE) {
  20685. dataDescriptor = true;
  20686. if (zip64 || zip64 === UNDEFINED_VALUE) {
  20687. zip64 = true;
  20688. uncompressedSize = maximumCompressedSize = MAX_32_BITS;
  20689. }
  20690. } else {
  20691. uncompressedSize = reader.size;
  20692. maximumCompressedSize = getMaximumCompressedSize(uncompressedSize);
  20693. }
  20694. }
  20695. const { diskOffset, diskNumber, maxSize } = zipWriter.writer;
  20696. const zip64UncompressedSize = zip64Enabled || uncompressedSize >= MAX_32_BITS;
  20697. const zip64CompressedSize = zip64Enabled || maximumCompressedSize >= MAX_32_BITS;
  20698. const zip64Offset = zip64Enabled || zipWriter.offset + zipWriter.pendingEntriesSize - diskOffset >= MAX_32_BITS;
  20699. const supportZip64SplitFile = getOptionValue(zipWriter, options, "supportZip64SplitFile", true);
  20700. const zip64DiskNumberStart = (supportZip64SplitFile && zip64Enabled) || diskNumber + Math$1.ceil(zipWriter.pendingEntriesSize / maxSize) >= MAX_16_BITS;
  20701. if (zip64Offset || zip64UncompressedSize || zip64CompressedSize || zip64DiskNumberStart) {
  20702. if (zip64 === false || !keepOrder) {
  20703. throw new Error$1(ERR_UNSUPPORTED_FORMAT);
  20704. } else {
  20705. zip64 = true;
  20706. }
  20707. }
  20708. zip64 = zip64 || false;
  20709. options = Object$1.assign({}, options, {
  20710. rawFilename,
  20711. rawComment,
  20712. version,
  20713. versionMadeBy,
  20714. lastModDate,
  20715. lastAccessDate,
  20716. creationDate,
  20717. rawExtraField,
  20718. zip64,
  20719. zip64UncompressedSize,
  20720. zip64CompressedSize,
  20721. zip64Offset,
  20722. zip64DiskNumberStart,
  20723. password,
  20724. level,
  20725. useWebWorkers,
  20726. encryptionStrength,
  20727. extendedTimestamp,
  20728. zipCrypto,
  20729. bufferedWrite,
  20730. keepOrder,
  20731. dataDescriptor,
  20732. dataDescriptorSignature,
  20733. signal,
  20734. msDosCompatible,
  20735. internalFileAttribute,
  20736. externalFileAttribute,
  20737. useCompressionStream
  20738. });
  20739. const headerInfo = getHeaderInfo(options);
  20740. const dataDescriptorInfo = getDataDescriptorInfo(options);
  20741. const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
  20742. maximumEntrySize = metadataSize + maximumCompressedSize;
  20743. if (zipWriter.options.usdz) {
  20744. maximumEntrySize += maximumEntrySize + 64;
  20745. }
  20746. zipWriter.pendingEntriesSize += maximumEntrySize;
  20747. let fileEntry;
  20748. try {
  20749. fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
  20750. } finally {
  20751. zipWriter.pendingEntriesSize -= maximumEntrySize;
  20752. }
  20753. Object$1.assign(fileEntry, { name, comment, extraField });
  20754. return new Entry(fileEntry);
  20755. }
  20756. async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
  20757. const {
  20758. files,
  20759. writer
  20760. } = zipWriter;
  20761. const {
  20762. keepOrder,
  20763. dataDescriptor,
  20764. signal
  20765. } = options;
  20766. const {
  20767. headerInfo
  20768. } = entryInfo;
  20769. const { usdz } = zipWriter.options;
  20770. const previousFileEntry = Array$1.from(files.values()).pop();
  20771. let fileEntry = {};
  20772. let bufferedWrite;
  20773. let releaseLockWriter;
  20774. let releaseLockCurrentFileEntry;
  20775. let writingBufferedEntryData;
  20776. let writingEntryData;
  20777. let fileWriter;
  20778. files.set(name, fileEntry);
  20779. try {
  20780. let lockPreviousFileEntry;
  20781. if (keepOrder) {
  20782. lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
  20783. requestLockCurrentFileEntry();
  20784. }
  20785. if ((options.bufferedWrite || zipWriter.writerLocked || (zipWriter.bufferedWrites && keepOrder) || !dataDescriptor) && !usdz) {
  20786. fileWriter = new BlobWriter();
  20787. fileWriter.writable.size = 0;
  20788. bufferedWrite = true;
  20789. zipWriter.bufferedWrites++;
  20790. await initStream(writer);
  20791. } else {
  20792. fileWriter = writer;
  20793. await requestLockWriter();
  20794. }
  20795. await initStream(fileWriter);
  20796. const { writable } = writer;
  20797. let { diskOffset } = writer;
  20798. if (zipWriter.addSplitZipSignature) {
  20799. delete zipWriter.addSplitZipSignature;
  20800. const signatureArray = new Uint8Array$1(4);
  20801. const signatureArrayView = getDataView(signatureArray);
  20802. setUint32(signatureArrayView, 0, SPLIT_ZIP_FILE_SIGNATURE);
  20803. await writeData(writable, signatureArray);
  20804. zipWriter.offset += 4;
  20805. }
  20806. if (usdz) {
  20807. appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
  20808. }
  20809. if (!bufferedWrite) {
  20810. await lockPreviousFileEntry;
  20811. await skipDiskIfNeeded(writable);
  20812. }
  20813. const { diskNumber } = writer;
  20814. writingEntryData = true;
  20815. fileEntry.diskNumberStart = diskNumber;
  20816. fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, zipWriter.config, options);
  20817. writingEntryData = false;
  20818. files.set(name, fileEntry);
  20819. fileEntry.filename = name;
  20820. if (bufferedWrite) {
  20821. await fileWriter.writable.getWriter().close();
  20822. let blob = await fileWriter.getData();
  20823. await lockPreviousFileEntry;
  20824. await requestLockWriter();
  20825. writingBufferedEntryData = true;
  20826. if (!dataDescriptor) {
  20827. blob = await writeExtraHeaderInfo(fileEntry, blob, writable, options);
  20828. }
  20829. await skipDiskIfNeeded(writable);
  20830. fileEntry.diskNumberStart = writer.diskNumber;
  20831. diskOffset = writer.diskOffset;
  20832. await blob.stream().pipeTo(writable, { preventClose: true, preventAbort: true, signal });
  20833. writable.size += blob.size;
  20834. writingBufferedEntryData = false;
  20835. }
  20836. fileEntry.offset = zipWriter.offset - diskOffset;
  20837. if (fileEntry.zip64) {
  20838. setZip64ExtraInfo(fileEntry, options);
  20839. } else if (fileEntry.offset >= MAX_32_BITS) {
  20840. throw new Error$1(ERR_UNSUPPORTED_FORMAT);
  20841. }
  20842. zipWriter.offset += fileEntry.length;
  20843. return fileEntry;
  20844. } catch (error) {
  20845. if ((bufferedWrite && writingBufferedEntryData) || (!bufferedWrite && writingEntryData)) {
  20846. zipWriter.hasCorruptedEntries = true;
  20847. if (error) {
  20848. try {
  20849. error.corruptedEntry = true;
  20850. } catch (_error) {
  20851. // ignored
  20852. }
  20853. }
  20854. if (bufferedWrite) {
  20855. zipWriter.offset += fileWriter.writable.size;
  20856. } else {
  20857. zipWriter.offset = fileWriter.writable.size;
  20858. }
  20859. }
  20860. files.delete(name);
  20861. throw error;
  20862. } finally {
  20863. if (bufferedWrite) {
  20864. zipWriter.bufferedWrites--;
  20865. }
  20866. if (releaseLockCurrentFileEntry) {
  20867. releaseLockCurrentFileEntry();
  20868. }
  20869. if (releaseLockWriter) {
  20870. releaseLockWriter();
  20871. }
  20872. }
  20873. function requestLockCurrentFileEntry() {
  20874. fileEntry.lock = new Promise$1(resolve => releaseLockCurrentFileEntry = resolve);
  20875. }
  20876. async function requestLockWriter() {
  20877. zipWriter.writerLocked = true;
  20878. const { lockWriter } = zipWriter;
  20879. zipWriter.lockWriter = new Promise$1(resolve => releaseLockWriter = () => {
  20880. zipWriter.writerLocked = false;
  20881. resolve();
  20882. });
  20883. await lockWriter;
  20884. }
  20885. async function skipDiskIfNeeded(writable) {
  20886. if (headerInfo.localHeaderArray.length > writer.availableSize) {
  20887. writer.availableSize = 0;
  20888. await writeData(writable, new Uint8Array$1());
  20889. }
  20890. }
  20891. }
  20892. async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryInfo, config, options) {
  20893. const {
  20894. headerInfo,
  20895. dataDescriptorInfo,
  20896. metadataSize
  20897. } = entryInfo;
  20898. const {
  20899. localHeaderArray,
  20900. headerArray,
  20901. lastModDate,
  20902. rawLastModDate,
  20903. encrypted,
  20904. compressed,
  20905. version,
  20906. compressionMethod,
  20907. rawExtraFieldExtendedTimestamp,
  20908. extraFieldExtendedTimestampFlag,
  20909. rawExtraFieldNTFS,
  20910. rawExtraFieldAES
  20911. } = headerInfo;
  20912. const { dataDescriptorArray } = dataDescriptorInfo;
  20913. const {
  20914. rawFilename,
  20915. lastAccessDate,
  20916. creationDate,
  20917. password,
  20918. level,
  20919. zip64,
  20920. zip64UncompressedSize,
  20921. zip64CompressedSize,
  20922. zip64Offset,
  20923. zip64DiskNumberStart,
  20924. zipCrypto,
  20925. dataDescriptor,
  20926. directory,
  20927. versionMadeBy,
  20928. rawComment,
  20929. rawExtraField,
  20930. useWebWorkers,
  20931. onstart,
  20932. onprogress,
  20933. onend,
  20934. signal,
  20935. encryptionStrength,
  20936. extendedTimestamp,
  20937. msDosCompatible,
  20938. internalFileAttribute,
  20939. externalFileAttribute,
  20940. useCompressionStream
  20941. } = options;
  20942. const fileEntry = {
  20943. lock,
  20944. versionMadeBy,
  20945. zip64,
  20946. directory: Boolean(directory),
  20947. filenameUTF8: true,
  20948. rawFilename,
  20949. commentUTF8: true,
  20950. rawComment,
  20951. rawExtraFieldExtendedTimestamp,
  20952. rawExtraFieldNTFS,
  20953. rawExtraFieldAES,
  20954. rawExtraField,
  20955. extendedTimestamp,
  20956. msDosCompatible,
  20957. internalFileAttribute,
  20958. externalFileAttribute,
  20959. diskNumberStart
  20960. };
  20961. let compressedSize = 0;
  20962. let uncompressedSize = 0;
  20963. let signature;
  20964. const { writable } = writer;
  20965. if (reader) {
  20966. reader.chunkSize = getChunkSize(config);
  20967. await writeData(writable, localHeaderArray);
  20968. const readable = reader.readable;
  20969. const size = readable.size = reader.size;
  20970. const workerOptions = {
  20971. options: {
  20972. codecType: CODEC_DEFLATE,
  20973. level,
  20974. password,
  20975. encryptionStrength,
  20976. zipCrypto: encrypted && zipCrypto,
  20977. passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & 0xFF,
  20978. signed: true,
  20979. compressed,
  20980. encrypted,
  20981. useWebWorkers,
  20982. useCompressionStream,
  20983. transferStreams: false
  20984. },
  20985. config,
  20986. streamOptions: { signal, size, onstart, onprogress, onend }
  20987. };
  20988. const result = await runWorker({ readable, writable }, workerOptions);
  20989. writable.size += result.size;
  20990. signature = result.signature;
  20991. uncompressedSize = reader.size = readable.size;
  20992. compressedSize = result.size;
  20993. } else {
  20994. await writeData(writable, localHeaderArray);
  20995. }
  20996. let rawExtraFieldZip64;
  20997. if (zip64) {
  20998. let rawExtraFieldZip64Length = 4;
  20999. if (zip64UncompressedSize) {
  21000. rawExtraFieldZip64Length += 8;
  21001. }
  21002. if (zip64CompressedSize) {
  21003. rawExtraFieldZip64Length += 8;
  21004. }
  21005. if (zip64Offset) {
  21006. rawExtraFieldZip64Length += 8;
  21007. }
  21008. if (zip64DiskNumberStart) {
  21009. rawExtraFieldZip64Length += 4;
  21010. }
  21011. rawExtraFieldZip64 = new Uint8Array$1(rawExtraFieldZip64Length);
  21012. } else {
  21013. rawExtraFieldZip64 = new Uint8Array$1();
  21014. }
  21015. setEntryInfo({
  21016. signature,
  21017. rawExtraFieldZip64,
  21018. compressedSize,
  21019. uncompressedSize,
  21020. headerInfo,
  21021. dataDescriptorInfo
  21022. }, options);
  21023. if (dataDescriptor) {
  21024. await writeData(writable, dataDescriptorArray);
  21025. }
  21026. Object$1.assign(fileEntry, {
  21027. uncompressedSize,
  21028. compressedSize,
  21029. lastModDate,
  21030. rawLastModDate,
  21031. creationDate,
  21032. lastAccessDate,
  21033. encrypted,
  21034. length: metadataSize + compressedSize,
  21035. compressionMethod,
  21036. version,
  21037. headerArray,
  21038. signature,
  21039. rawExtraFieldZip64,
  21040. extraFieldExtendedTimestampFlag,
  21041. zip64UncompressedSize,
  21042. zip64CompressedSize,
  21043. zip64Offset,
  21044. zip64DiskNumberStart
  21045. });
  21046. return fileEntry;
  21047. }
  21048. function getHeaderInfo(options) {
  21049. const {
  21050. rawFilename,
  21051. lastModDate,
  21052. lastAccessDate,
  21053. creationDate,
  21054. password,
  21055. level,
  21056. zip64,
  21057. zipCrypto,
  21058. dataDescriptor,
  21059. directory,
  21060. rawExtraField,
  21061. encryptionStrength,
  21062. extendedTimestamp
  21063. } = options;
  21064. const compressed = level !== 0 && !directory;
  21065. const encrypted = Boolean(password && getLength(password));
  21066. let version = options.version;
  21067. let rawExtraFieldAES;
  21068. if (encrypted && !zipCrypto) {
  21069. rawExtraFieldAES = new Uint8Array$1(getLength(EXTRAFIELD_DATA_AES) + 2);
  21070. const extraFieldAESView = getDataView(rawExtraFieldAES);
  21071. setUint16(extraFieldAESView, 0, EXTRAFIELD_TYPE_AES);
  21072. arraySet(rawExtraFieldAES, EXTRAFIELD_DATA_AES, 2);
  21073. setUint8(extraFieldAESView, 8, encryptionStrength);
  21074. } else {
  21075. rawExtraFieldAES = new Uint8Array$1();
  21076. }
  21077. let rawExtraFieldNTFS;
  21078. let rawExtraFieldExtendedTimestamp;
  21079. let extraFieldExtendedTimestampFlag;
  21080. if (extendedTimestamp) {
  21081. rawExtraFieldExtendedTimestamp = new Uint8Array$1(9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0));
  21082. const extraFieldExtendedTimestampView = getDataView(rawExtraFieldExtendedTimestamp);
  21083. setUint16(extraFieldExtendedTimestampView, 0, EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
  21084. setUint16(extraFieldExtendedTimestampView, 2, getLength(rawExtraFieldExtendedTimestamp) - 4);
  21085. extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
  21086. setUint8(extraFieldExtendedTimestampView, 4, extraFieldExtendedTimestampFlag);
  21087. let offset = 5;
  21088. setUint32(extraFieldExtendedTimestampView, offset, Math$1.floor(lastModDate.getTime() / 1000));
  21089. offset += 4;
  21090. if (lastAccessDate) {
  21091. setUint32(extraFieldExtendedTimestampView, offset, Math$1.floor(lastAccessDate.getTime() / 1000));
  21092. offset += 4;
  21093. }
  21094. if (creationDate) {
  21095. setUint32(extraFieldExtendedTimestampView, offset, Math$1.floor(creationDate.getTime() / 1000));
  21096. }
  21097. try {
  21098. rawExtraFieldNTFS = new Uint8Array$1(36);
  21099. const extraFieldNTFSView = getDataView(rawExtraFieldNTFS);
  21100. const lastModTimeNTFS = getTimeNTFS(lastModDate);
  21101. setUint16(extraFieldNTFSView, 0, EXTRAFIELD_TYPE_NTFS);
  21102. setUint16(extraFieldNTFSView, 2, 32);
  21103. setUint16(extraFieldNTFSView, 8, EXTRAFIELD_TYPE_NTFS_TAG1);
  21104. setUint16(extraFieldNTFSView, 10, 24);
  21105. setBigUint64(extraFieldNTFSView, 12, lastModTimeNTFS);
  21106. setBigUint64(extraFieldNTFSView, 20, getTimeNTFS(lastAccessDate) || lastModTimeNTFS);
  21107. setBigUint64(extraFieldNTFSView, 28, getTimeNTFS(creationDate) || lastModTimeNTFS);
  21108. } catch (_error) {
  21109. rawExtraFieldNTFS = new Uint8Array$1();
  21110. }
  21111. } else {
  21112. rawExtraFieldNTFS = rawExtraFieldExtendedTimestamp = new Uint8Array$1();
  21113. }
  21114. let bitFlag = BITFLAG_LANG_ENCODING_FLAG;
  21115. if (dataDescriptor) {
  21116. bitFlag = bitFlag | BITFLAG_DATA_DESCRIPTOR;
  21117. }
  21118. let compressionMethod = COMPRESSION_METHOD_STORE;
  21119. if (compressed) {
  21120. compressionMethod = COMPRESSION_METHOD_DEFLATE;
  21121. }
  21122. if (zip64) {
  21123. version = version > VERSION_ZIP64 ? version : VERSION_ZIP64;
  21124. }
  21125. if (encrypted) {
  21126. bitFlag = bitFlag | BITFLAG_ENCRYPTED;
  21127. if (!zipCrypto) {
  21128. version = version > VERSION_AES ? version : VERSION_AES;
  21129. compressionMethod = COMPRESSION_METHOD_AES;
  21130. if (compressed) {
  21131. rawExtraFieldAES[9] = COMPRESSION_METHOD_DEFLATE;
  21132. }
  21133. }
  21134. }
  21135. const headerArray = new Uint8Array$1(26);
  21136. const headerView = getDataView(headerArray);
  21137. setUint16(headerView, 0, version);
  21138. setUint16(headerView, 2, bitFlag);
  21139. setUint16(headerView, 4, compressionMethod);
  21140. const dateArray = new Uint32Array$1(1);
  21141. const dateView = getDataView(dateArray);
  21142. let lastModDateMsDos;
  21143. if (lastModDate < MIN_DATE) {
  21144. lastModDateMsDos = MIN_DATE;
  21145. } else if (lastModDate > MAX_DATE) {
  21146. lastModDateMsDos = MAX_DATE;
  21147. } else {
  21148. lastModDateMsDos = lastModDate;
  21149. }
  21150. setUint16(dateView, 0, (((lastModDateMsDos.getHours() << 6) | lastModDateMsDos.getMinutes()) << 5) | lastModDateMsDos.getSeconds() / 2);
  21151. setUint16(dateView, 2, ((((lastModDateMsDos.getFullYear() - 1980) << 4) | (lastModDateMsDos.getMonth() + 1)) << 5) | lastModDateMsDos.getDate());
  21152. const rawLastModDate = dateArray[0];
  21153. setUint32(headerView, 6, rawLastModDate);
  21154. setUint16(headerView, 22, getLength(rawFilename));
  21155. const extraFieldLength = getLength(rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraField);
  21156. setUint16(headerView, 24, extraFieldLength);
  21157. const localHeaderArray = new Uint8Array$1(30 + getLength(rawFilename) + extraFieldLength);
  21158. const localHeaderView = getDataView(localHeaderArray);
  21159. setUint32(localHeaderView, 0, LOCAL_FILE_HEADER_SIGNATURE);
  21160. arraySet(localHeaderArray, headerArray, 4);
  21161. arraySet(localHeaderArray, rawFilename, 30);
  21162. arraySet(localHeaderArray, rawExtraFieldAES, 30 + getLength(rawFilename));
  21163. arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + getLength(rawFilename, rawExtraFieldAES));
  21164. arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + getLength(rawFilename, rawExtraFieldAES, rawExtraFieldExtendedTimestamp));
  21165. arraySet(localHeaderArray, rawExtraField, 30 + getLength(rawFilename, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS));
  21166. return {
  21167. localHeaderArray,
  21168. headerArray,
  21169. headerView,
  21170. lastModDate,
  21171. rawLastModDate,
  21172. encrypted,
  21173. compressed,
  21174. version,
  21175. compressionMethod,
  21176. extraFieldExtendedTimestampFlag,
  21177. rawExtraFieldExtendedTimestamp,
  21178. rawExtraFieldNTFS,
  21179. rawExtraFieldAES,
  21180. extraFieldLength
  21181. };
  21182. }
  21183. function appendExtraFieldUSDZ(entryInfo, zipWriterOffset) {
  21184. const { headerInfo } = entryInfo;
  21185. let { localHeaderArray, extraFieldLength } = headerInfo;
  21186. let localHeaderArrayView = getDataView(localHeaderArray);
  21187. let extraBytesLength = 64 - ((zipWriterOffset + localHeaderArray.length) % 64);
  21188. if (extraBytesLength < 4) {
  21189. extraBytesLength += 64;
  21190. }
  21191. const rawExtraFieldUSDZ = new Uint8Array$1(extraBytesLength);
  21192. const extraFieldUSDZView = getDataView(rawExtraFieldUSDZ);
  21193. setUint16(extraFieldUSDZView, 0, EXTRAFIELD_TYPE_USDZ);
  21194. setUint16(extraFieldUSDZView, 2, extraBytesLength - 2);
  21195. const previousLocalHeaderArray = localHeaderArray;
  21196. headerInfo.localHeaderArray = localHeaderArray = new Uint8Array$1(previousLocalHeaderArray.length + extraBytesLength);
  21197. arraySet(localHeaderArray, previousLocalHeaderArray);
  21198. arraySet(localHeaderArray, rawExtraFieldUSDZ, previousLocalHeaderArray.length);
  21199. localHeaderArrayView = getDataView(localHeaderArray);
  21200. setUint16(localHeaderArrayView, 28, extraFieldLength + extraBytesLength);
  21201. entryInfo.metadataSize += extraBytesLength;
  21202. }
  21203. function getDataDescriptorInfo(options) {
  21204. const {
  21205. zip64,
  21206. dataDescriptor,
  21207. dataDescriptorSignature
  21208. } = options;
  21209. let dataDescriptorArray = new Uint8Array$1();
  21210. let dataDescriptorView, dataDescriptorOffset = 0;
  21211. if (dataDescriptor) {
  21212. dataDescriptorArray = new Uint8Array$1(zip64 ? (dataDescriptorSignature ? 24 : 20) : (dataDescriptorSignature ? 16 : 12));
  21213. dataDescriptorView = getDataView(dataDescriptorArray);
  21214. if (dataDescriptorSignature) {
  21215. dataDescriptorOffset = 4;
  21216. setUint32(dataDescriptorView, 0, DATA_DESCRIPTOR_RECORD_SIGNATURE);
  21217. }
  21218. }
  21219. return {
  21220. dataDescriptorArray,
  21221. dataDescriptorView,
  21222. dataDescriptorOffset
  21223. };
  21224. }
  21225. function setEntryInfo(entryInfo, options) {
  21226. const {
  21227. signature,
  21228. rawExtraFieldZip64,
  21229. compressedSize,
  21230. uncompressedSize,
  21231. headerInfo,
  21232. dataDescriptorInfo
  21233. } = entryInfo;
  21234. const {
  21235. headerView,
  21236. encrypted
  21237. } = headerInfo;
  21238. const {
  21239. dataDescriptorView,
  21240. dataDescriptorOffset
  21241. } = dataDescriptorInfo;
  21242. const {
  21243. zip64,
  21244. zip64UncompressedSize,
  21245. zip64CompressedSize,
  21246. zipCrypto,
  21247. dataDescriptor
  21248. } = options;
  21249. if ((!encrypted || zipCrypto) && signature !== UNDEFINED_VALUE) {
  21250. setUint32(headerView, 10, signature);
  21251. if (dataDescriptor) {
  21252. setUint32(dataDescriptorView, dataDescriptorOffset, signature);
  21253. }
  21254. }
  21255. if (zip64) {
  21256. const rawExtraFieldZip64View = getDataView(rawExtraFieldZip64);
  21257. setUint16(rawExtraFieldZip64View, 0, EXTRAFIELD_TYPE_ZIP64);
  21258. setUint16(rawExtraFieldZip64View, 2, rawExtraFieldZip64.length - 4);
  21259. let rawExtraFieldZip64Offset = 4;
  21260. if (zip64UncompressedSize) {
  21261. setUint32(headerView, 18, MAX_32_BITS);
  21262. setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(uncompressedSize));
  21263. rawExtraFieldZip64Offset += 8;
  21264. }
  21265. if (zip64CompressedSize) {
  21266. setUint32(headerView, 14, MAX_32_BITS);
  21267. setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(compressedSize));
  21268. }
  21269. if (dataDescriptor) {
  21270. setBigUint64(dataDescriptorView, dataDescriptorOffset + 4, BigInt(compressedSize));
  21271. setBigUint64(dataDescriptorView, dataDescriptorOffset + 12, BigInt(uncompressedSize));
  21272. }
  21273. } else {
  21274. setUint32(headerView, 14, compressedSize);
  21275. setUint32(headerView, 18, uncompressedSize);
  21276. if (dataDescriptor) {
  21277. setUint32(dataDescriptorView, dataDescriptorOffset + 4, compressedSize);
  21278. setUint32(dataDescriptorView, dataDescriptorOffset + 8, uncompressedSize);
  21279. }
  21280. }
  21281. }
  21282. async function writeExtraHeaderInfo(fileEntry, entryData, writable, { zipCrypto }) {
  21283. let arrayBuffer;
  21284. arrayBuffer = await entryData.slice(0, 26).arrayBuffer();
  21285. if (arrayBuffer.byteLength != 26) {
  21286. arrayBuffer = arrayBuffer.slice(0, 26);
  21287. }
  21288. const arrayBufferView = new DataView$1(arrayBuffer);
  21289. if (!fileEntry.encrypted || zipCrypto) {
  21290. setUint32(arrayBufferView, 14, fileEntry.signature);
  21291. }
  21292. if (fileEntry.zip64) {
  21293. setUint32(arrayBufferView, 18, MAX_32_BITS);
  21294. setUint32(arrayBufferView, 22, MAX_32_BITS);
  21295. } else {
  21296. setUint32(arrayBufferView, 18, fileEntry.compressedSize);
  21297. setUint32(arrayBufferView, 22, fileEntry.uncompressedSize);
  21298. }
  21299. await writeData(writable, new Uint8Array$1(arrayBuffer));
  21300. return entryData.slice(arrayBuffer.byteLength);
  21301. }
  21302. function setZip64ExtraInfo(fileEntry, options) {
  21303. const { rawExtraFieldZip64, offset, diskNumberStart } = fileEntry;
  21304. const { zip64UncompressedSize, zip64CompressedSize, zip64Offset, zip64DiskNumberStart } = options;
  21305. const rawExtraFieldZip64View = getDataView(rawExtraFieldZip64);
  21306. let rawExtraFieldZip64Offset = 4;
  21307. if (zip64UncompressedSize) {
  21308. rawExtraFieldZip64Offset += 8;
  21309. }
  21310. if (zip64CompressedSize) {
  21311. rawExtraFieldZip64Offset += 8;
  21312. }
  21313. if (zip64Offset) {
  21314. setBigUint64(rawExtraFieldZip64View, rawExtraFieldZip64Offset, BigInt(offset));
  21315. rawExtraFieldZip64Offset += 8;
  21316. }
  21317. if (zip64DiskNumberStart) {
  21318. setUint32(rawExtraFieldZip64View, rawExtraFieldZip64Offset, diskNumberStart);
  21319. }
  21320. }
  21321. async function closeFile(zipWriter, comment, options) {
  21322. const { files, writer } = zipWriter;
  21323. const { diskOffset, writable } = writer;
  21324. let { diskNumber } = writer;
  21325. let offset = 0;
  21326. let directoryDataLength = 0;
  21327. let directoryOffset = zipWriter.offset - diskOffset;
  21328. let filesLength = files.size;
  21329. for (const [, fileEntry] of files) {
  21330. const {
  21331. rawFilename,
  21332. rawExtraFieldZip64,
  21333. rawExtraFieldAES,
  21334. rawComment,
  21335. rawExtraFieldNTFS,
  21336. rawExtraField,
  21337. extendedTimestamp,
  21338. extraFieldExtendedTimestampFlag,
  21339. lastModDate
  21340. } = fileEntry;
  21341. let rawExtraFieldTimestamp;
  21342. if (extendedTimestamp) {
  21343. rawExtraFieldTimestamp = new Uint8Array$1(9);
  21344. const extraFieldExtendedTimestampView = getDataView(rawExtraFieldTimestamp);
  21345. setUint16(extraFieldExtendedTimestampView, 0, EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
  21346. setUint16(extraFieldExtendedTimestampView, 2, 5);
  21347. setUint8(extraFieldExtendedTimestampView, 4, extraFieldExtendedTimestampFlag);
  21348. setUint32(extraFieldExtendedTimestampView, 5, Math$1.floor(lastModDate.getTime() / 1000));
  21349. } else {
  21350. rawExtraFieldTimestamp = new Uint8Array$1();
  21351. }
  21352. fileEntry.rawExtraFieldCDExtendedTimestamp = rawExtraFieldTimestamp;
  21353. directoryDataLength += 46 +
  21354. getLength(
  21355. rawFilename,
  21356. rawComment,
  21357. rawExtraFieldZip64,
  21358. rawExtraFieldAES,
  21359. rawExtraFieldNTFS,
  21360. rawExtraFieldTimestamp,
  21361. rawExtraField);
  21362. }
  21363. const directoryArray = new Uint8Array$1(directoryDataLength);
  21364. const directoryView = getDataView(directoryArray);
  21365. await initStream(writer);
  21366. let directoryDiskOffset = 0;
  21367. for (const [indexFileEntry, fileEntry] of Array$1.from(files.values()).entries()) {
  21368. const {
  21369. offset: fileEntryOffset,
  21370. rawFilename,
  21371. rawExtraFieldZip64,
  21372. rawExtraFieldAES,
  21373. rawExtraFieldCDExtendedTimestamp,
  21374. rawExtraFieldNTFS,
  21375. rawExtraField,
  21376. rawComment,
  21377. versionMadeBy,
  21378. headerArray,
  21379. directory,
  21380. zip64,
  21381. zip64UncompressedSize,
  21382. zip64CompressedSize,
  21383. zip64DiskNumberStart,
  21384. zip64Offset,
  21385. msDosCompatible,
  21386. internalFileAttribute,
  21387. externalFileAttribute,
  21388. diskNumberStart,
  21389. uncompressedSize,
  21390. compressedSize
  21391. } = fileEntry;
  21392. const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldCDExtendedTimestamp, rawExtraFieldNTFS, rawExtraField);
  21393. setUint32(directoryView, offset, CENTRAL_FILE_HEADER_SIGNATURE);
  21394. setUint16(directoryView, offset + 4, versionMadeBy);
  21395. const headerView = getDataView(headerArray);
  21396. if (!zip64UncompressedSize) {
  21397. setUint32(headerView, 18, uncompressedSize);
  21398. }
  21399. if (!zip64CompressedSize) {
  21400. setUint32(headerView, 14, compressedSize);
  21401. }
  21402. arraySet(directoryArray, headerArray, offset + 6);
  21403. setUint16(directoryView, offset + 30, extraFieldLength);
  21404. setUint16(directoryView, offset + 32, getLength(rawComment));
  21405. setUint16(directoryView, offset + 34, zip64 && zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
  21406. setUint16(directoryView, offset + 36, internalFileAttribute);
  21407. if (externalFileAttribute) {
  21408. setUint32(directoryView, offset + 38, externalFileAttribute);
  21409. } else if (directory && msDosCompatible) {
  21410. setUint8(directoryView, offset + 38, FILE_ATTR_MSDOS_DIR_MASK);
  21411. }
  21412. setUint32(directoryView, offset + 42, zip64 && zip64Offset ? MAX_32_BITS : fileEntryOffset);
  21413. arraySet(directoryArray, rawFilename, offset + 46);
  21414. arraySet(directoryArray, rawExtraFieldZip64, offset + 46 + getLength(rawFilename));
  21415. arraySet(directoryArray, rawExtraFieldAES, offset + 46 + getLength(rawFilename, rawExtraFieldZip64));
  21416. arraySet(directoryArray, rawExtraFieldCDExtendedTimestamp, offset + 46 + getLength(rawFilename, rawExtraFieldZip64, rawExtraFieldAES));
  21417. arraySet(directoryArray, rawExtraFieldNTFS, offset + 46 + getLength(rawFilename, rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldCDExtendedTimestamp));
  21418. arraySet(directoryArray, rawExtraField, offset + 46 + getLength(rawFilename, rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldCDExtendedTimestamp, rawExtraFieldNTFS));
  21419. arraySet(directoryArray, rawComment, offset + 46 + getLength(rawFilename) + extraFieldLength);
  21420. const directoryEntryLength = 46 + getLength(rawFilename, rawComment) + extraFieldLength;
  21421. if (offset - directoryDiskOffset > writer.availableSize) {
  21422. writer.availableSize = 0;
  21423. await writeData(writable, directoryArray.slice(directoryDiskOffset, offset));
  21424. directoryDiskOffset = offset;
  21425. }
  21426. offset += directoryEntryLength;
  21427. if (options.onprogress) {
  21428. try {
  21429. await options.onprogress(indexFileEntry + 1, files.size, new Entry(fileEntry));
  21430. } catch (_error) {
  21431. // ignored
  21432. }
  21433. }
  21434. }
  21435. await writeData(writable, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
  21436. let lastDiskNumber = writer.diskNumber;
  21437. const { availableSize } = writer;
  21438. if (availableSize < END_OF_CENTRAL_DIR_LENGTH) {
  21439. lastDiskNumber++;
  21440. }
  21441. let zip64 = getOptionValue(zipWriter, options, "zip64");
  21442. if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || filesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
  21443. if (zip64 === false) {
  21444. throw new Error$1(ERR_UNSUPPORTED_FORMAT);
  21445. } else {
  21446. zip64 = true;
  21447. }
  21448. }
  21449. const endOfdirectoryArray = new Uint8Array$1(zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
  21450. const endOfdirectoryView = getDataView(endOfdirectoryArray);
  21451. offset = 0;
  21452. if (zip64) {
  21453. setUint32(endOfdirectoryView, 0, ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
  21454. setBigUint64(endOfdirectoryView, 4, BigInt(44));
  21455. setUint16(endOfdirectoryView, 12, 45);
  21456. setUint16(endOfdirectoryView, 14, 45);
  21457. setUint32(endOfdirectoryView, 16, lastDiskNumber);
  21458. setUint32(endOfdirectoryView, 20, diskNumber);
  21459. setBigUint64(endOfdirectoryView, 24, BigInt(filesLength));
  21460. setBigUint64(endOfdirectoryView, 32, BigInt(filesLength));
  21461. setBigUint64(endOfdirectoryView, 40, BigInt(directoryDataLength));
  21462. setBigUint64(endOfdirectoryView, 48, BigInt(directoryOffset));
  21463. setUint32(endOfdirectoryView, 56, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
  21464. setBigUint64(endOfdirectoryView, 64, BigInt(directoryOffset) + BigInt(directoryDataLength));
  21465. setUint32(endOfdirectoryView, 72, lastDiskNumber + 1);
  21466. const supportZip64SplitFile = getOptionValue(zipWriter, options, "supportZip64SplitFile", true);
  21467. if (supportZip64SplitFile) {
  21468. lastDiskNumber = MAX_16_BITS;
  21469. diskNumber = MAX_16_BITS;
  21470. }
  21471. filesLength = MAX_16_BITS;
  21472. directoryOffset = MAX_32_BITS;
  21473. directoryDataLength = MAX_32_BITS;
  21474. offset += ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH;
  21475. }
  21476. setUint32(endOfdirectoryView, offset, END_OF_CENTRAL_DIR_SIGNATURE);
  21477. setUint16(endOfdirectoryView, offset + 4, lastDiskNumber);
  21478. setUint16(endOfdirectoryView, offset + 6, diskNumber);
  21479. setUint16(endOfdirectoryView, offset + 8, filesLength);
  21480. setUint16(endOfdirectoryView, offset + 10, filesLength);
  21481. setUint32(endOfdirectoryView, offset + 12, directoryDataLength);
  21482. setUint32(endOfdirectoryView, offset + 16, directoryOffset);
  21483. const commentLength = getLength(comment);
  21484. if (commentLength) {
  21485. if (commentLength <= MAX_16_BITS) {
  21486. setUint16(endOfdirectoryView, offset + 20, commentLength);
  21487. } else {
  21488. throw new Error$1(ERR_INVALID_COMMENT);
  21489. }
  21490. }
  21491. await writeData(writable, endOfdirectoryArray);
  21492. if (commentLength) {
  21493. await writeData(writable, comment);
  21494. }
  21495. }
  21496. async function writeData(writable, array) {
  21497. const streamWriter = writable.getWriter();
  21498. await streamWriter.ready;
  21499. writable.size += getLength(array);
  21500. await streamWriter.write(array);
  21501. streamWriter.releaseLock();
  21502. }
  21503. function getTimeNTFS(date) {
  21504. if (date) {
  21505. return ((BigInt(date.getTime()) + BigInt(11644473600000)) * BigInt(10000));
  21506. }
  21507. }
  21508. function getOptionValue(zipWriter, options, name, defaultValue) {
  21509. const result = options[name] === UNDEFINED_VALUE ? zipWriter.options[name] : options[name];
  21510. return result === UNDEFINED_VALUE ? defaultValue : result;
  21511. }
  21512. function getMaximumCompressedSize(uncompressedSize) {
  21513. return uncompressedSize + (5 * (Math$1.floor(uncompressedSize / 16383) + 1));
  21514. }
  21515. function setUint8(view, offset, value) {
  21516. view.setUint8(offset, value);
  21517. }
  21518. function setUint16(view, offset, value) {
  21519. view.setUint16(offset, value, true);
  21520. }
  21521. function setUint32(view, offset, value) {
  21522. view.setUint32(offset, value, true);
  21523. }
  21524. function setBigUint64(view, offset, value) {
  21525. view.setBigUint64(offset, value, true);
  21526. }
  21527. function arraySet(array, typedArray, offset) {
  21528. array.set(typedArray, offset);
  21529. }
  21530. function getDataView(array) {
  21531. return new DataView$1(array.buffer);
  21532. }
  21533. function getLength(...arrayLikes) {
  21534. let result = 0;
  21535. arrayLikes.forEach(arrayLike => arrayLike && (result += arrayLike.length));
  21536. return result;
  21537. }
  21538. /*
  21539. Copyright (c) 2022 Gildas Lormeau. All rights reserved.
  21540. Redistribution and use in source and binary forms, with or without
  21541. modification, are permitted provided that the following conditions are met:
  21542. 1. Redistributions of source code must retain the above copyright notice,
  21543. this list of conditions and the following disclaimer.
  21544. 2. Redistributions in binary form must reproduce the above copyright
  21545. notice, this list of conditions and the following disclaimer in
  21546. the documentation and/or other materials provided with the distribution.
  21547. 3. The names of the authors may not be used to endorse or promote products
  21548. derived from this software without specific prior written permission.
  21549. THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
  21550. INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WA RRANTIES OF MERCHANTABILITY AND
  21551. FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
  21552. INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
  21553. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  21554. LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  21555. OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  21556. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  21557. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  21558. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  21559. */
  21560. let baseURL;
  21561. try {
  21562. baseURL = (typeof document === 'undefined' && typeof location === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : typeof document === 'undefined' ? location.href : (document.currentScript && document.currentScript.src || new URL('single-file-extension-editor-helper.js', document.baseURI).href));
  21563. } catch (_error) {
  21564. // ignored
  21565. }
  21566. configure({ baseURL });
  21567. e(configure);
  21568. var zip$1 = /*#__PURE__*/Object.freeze({
  21569. __proto__: null,
  21570. BlobReader: BlobReader,
  21571. BlobWriter: BlobWriter,
  21572. Data64URIReader: Data64URIReader,
  21573. Data64URIWriter: Data64URIWriter,
  21574. ERR_BAD_FORMAT: ERR_BAD_FORMAT,
  21575. ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
  21576. ERR_DUPLICATED_NAME: ERR_DUPLICATED_NAME,
  21577. ERR_ENCRYPTED: ERR_ENCRYPTED,
  21578. ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
  21579. ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
  21580. ERR_EOCDR_ZIP64_NOT_FOUND: ERR_EOCDR_ZIP64_NOT_FOUND,
  21581. ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
  21582. ERR_HTTP_RANGE: ERR_HTTP_RANGE,
  21583. ERR_INVALID_COMMENT: ERR_INVALID_COMMENT,
  21584. ERR_INVALID_ENCRYPTION_STRENGTH: ERR_INVALID_ENCRYPTION_STRENGTH,
  21585. ERR_INVALID_ENTRY_COMMENT: ERR_INVALID_ENTRY_COMMENT,
  21586. ERR_INVALID_ENTRY_NAME: ERR_INVALID_ENTRY_NAME,
  21587. ERR_INVALID_EXTRAFIELD_DATA: ERR_INVALID_EXTRAFIELD_DATA,
  21588. ERR_INVALID_EXTRAFIELD_TYPE: ERR_INVALID_EXTRAFIELD_TYPE,
  21589. ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
  21590. ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
  21591. ERR_INVALID_VERSION: ERR_INVALID_VERSION,
  21592. ERR_ITERATOR_COMPLETED_TOO_SOON: ERR_ITERATOR_COMPLETED_TOO_SOON,
  21593. ERR_LOCAL_FILE_HEADER_NOT_FOUND: ERR_LOCAL_FILE_HEADER_NOT_FOUND,
  21594. ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
  21595. ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION,
  21596. ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
  21597. ERR_UNSUPPORTED_FORMAT: ERR_UNSUPPORTED_FORMAT,
  21598. HttpRangeReader: HttpRangeReader,
  21599. HttpReader: HttpReader,
  21600. Reader: Reader,
  21601. SplitDataReader: SplitDataReader,
  21602. SplitDataWriter: SplitDataWriter,
  21603. SplitZipReader: SplitZipReader,
  21604. SplitZipWriter: SplitZipWriter,
  21605. TextReader: TextReader,
  21606. TextWriter: TextWriter,
  21607. Uint8ArrayReader: Uint8ArrayReader,
  21608. Uint8ArrayWriter: Uint8ArrayWriter,
  21609. Writer: Writer,
  21610. ZipReader: ZipReader,
  21611. ZipWriter: ZipWriter,
  21612. configure: configure,
  21613. getMimeType: getMimeType,
  21614. initReader: initReader,
  21615. initShimAsyncCodec: initShimAsyncCodec,
  21616. initStream: initStream,
  21617. initWriter: initWriter,
  21618. readUint8Array: readUint8Array,
  21619. terminateWorkers: terminateWorkers
  21620. });
  21621. // dist/csstree.esm.js from https://github.com/csstree/csstree/tree/612cc5f2922b2304869497d165a0cc65257f7a8b
  21622. /*
  21623. * Copyright (C) 2016-2022 by Roman Dvornov
  21624. *
  21625. * Permission is hereby granted, free of charge, to any person obtaining a copy
  21626. * of this software and associated documentation files (the "Software"), to deal
  21627. * in the Software without restriction, including without limitation the rights
  21628. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  21629. * copies of the Software, and to permit persons to whom the Software is
  21630. * furnished to do so, subject to the following conditions:
  21631. *
  21632. * The above copyright notice and this permission notice shall be included in
  21633. * all copies or substantial portions of the Software.
  21634. *
  21635. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  21636. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21637. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  21638. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21639. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21640. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21641. * THE SOFTWARE.
  21642. */
  21643. var rs=Object.create;var tr=Object.defineProperty;var ns=Object.getOwnPropertyDescriptor;var os=Object.getOwnPropertyNames;var is=Object.getPrototypeOf,as=Object.prototype.hasOwnProperty;var Oe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),b=(e,t)=>{for(var r in t)tr(e,r,{get:t[r],enumerable:!0});},ss=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of os(t))!as.call(e,o)&&o!==r&&tr(e,o,{get:()=>t[o],enumerable:!(n=ns(t,o))||n.enumerable});return e};var ls=(e,t,r)=>(r=e!=null?rs(is(e)):{},ss(t||!e||!e.__esModule?tr(r,"default",{value:e,enumerable:!0}):r,e));var Jo=Oe(ur=>{var Zo="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");ur.encode=function(e){if(0<=e&&e<Zo.length)return Zo[e];throw new TypeError("Must be between 0 and 63: "+e)};ur.decode=function(e){var t=65,r=90,n=97,o=122,i=48,s=57,u=43,c=47,a=26,l=52;return t<=e&&e<=r?e-t:n<=e&&e<=o?e-n+a:i<=e&&e<=s?e-i+l:e==u?62:e==c?63:-1};});var oi=Oe(hr=>{var ei=Jo(),pr=5,ti=1<<pr,ri=ti-1,ni=ti;function ks(e){return e<0?(-e<<1)+1:(e<<1)+0}function ws(e){var t=(e&1)===1,r=e>>1;return t?-r:r}hr.encode=function(t){var r="",n,o=ks(t);do n=o&ri,o>>>=pr,o>0&&(n|=ni),r+=ei.encode(n);while(o>0);return r};hr.decode=function(t,r,n){var o=t.length,i=0,s=0,u,c;do{if(r>=o)throw new Error("Expected more digits in base 64 VLQ value.");if(c=ei.decode(t.charCodeAt(r++)),c===-1)throw new Error("Invalid base64 digit: "+t.charAt(r-1));u=!!(c&ni),c&=ri,i=i+(c<<s),s+=pr;}while(u);n.value=ws(i),n.rest=r;};});var Et=Oe(K=>{function vs(e,t,r){if(t in e)return e[t];if(arguments.length===3)return r;throw new Error('"'+t+'" is a required argument.')}K.getArg=vs;var ii=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/,Ss=/^data:.+\,.+$/;function nt(e){var t=e.match(ii);return t?{scheme:t[1],auth:t[2],host:t[3],port:t[4],path:t[5]}:null}K.urlParse=nt;function Ue(e){var t="";return e.scheme&&(t+=e.scheme+":"),t+="//",e.auth&&(t+=e.auth+"@"),e.host&&(t+=e.host),e.port&&(t+=":"+e.port),e.path&&(t+=e.path),t}K.urlGenerate=Ue;var Cs=32;function As(e){var t=[];return function(r){for(var n=0;n<t.length;n++)if(t[n].input===r){var o=t[0];return t[0]=t[n],t[n]=o,t[0].result}var i=e(r);return t.unshift({input:r,result:i}),t.length>Cs&&t.pop(),i}}var mr=As(function(t){var r=t,n=nt(t);if(n){if(!n.path)return t;r=n.path;}for(var o=K.isAbsolute(r),i=[],s=0,u=0;;)if(s=u,u=r.indexOf("/",s),u===-1){i.push(r.slice(s));break}else for(i.push(r.slice(s,u));u<r.length&&r[u]==="/";)u++;for(var c,a=0,u=i.length-1;u>=0;u--)c=i[u],c==="."?i.splice(u,1):c===".."?a++:a>0&&(c===""?(i.splice(u+1,a),a=0):(i.splice(u,2),a--));return r=i.join("/"),r===""&&(r=o?"/":"."),n?(n.path=r,Ue(n)):r});K.normalize=mr;function ai(e,t){e===""&&(e="."),t===""&&(t=".");var r=nt(t),n=nt(e);if(n&&(e=n.path||"/"),r&&!r.scheme)return n&&(r.scheme=n.scheme),Ue(r);if(r||t.match(Ss))return t;if(n&&!n.host&&!n.path)return n.host=t,Ue(n);var o=t.charAt(0)==="/"?t:mr(e.replace(/\/+$/,"")+"/"+t);return n?(n.path=o,Ue(n)):o}K.join=ai;K.isAbsolute=function(e){return e.charAt(0)==="/"||ii.test(e)};function Ts(e,t){e===""&&(e="."),e=e.replace(/\/$/,"");for(var r=0;t.indexOf(e+"/")!==0;){var n=e.lastIndexOf("/");if(n<0||(e=e.slice(0,n),e.match(/^([^\/]+:\/)?\/*$/)))return t;++r;}return Array(r+1).join("../")+t.substr(e.length+1)}K.relative=Ts;var si=function(){var e=Object.create(null);return !("__proto__"in e)}();function li(e){return e}function Es(e){return ci(e)?"$"+e:e}K.toSetString=si?li:Es;function Ls(e){return ci(e)?e.slice(1):e}K.fromSetString=si?li:Ls;function ci(e){if(!e)return !1;var t=e.length;if(t<9||e.charCodeAt(t-1)!==95||e.charCodeAt(t-2)!==95||e.charCodeAt(t-3)!==111||e.charCodeAt(t-4)!==116||e.charCodeAt(t-5)!==111||e.charCodeAt(t-6)!==114||e.charCodeAt(t-7)!==112||e.charCodeAt(t-8)!==95||e.charCodeAt(t-9)!==95)return !1;for(var r=t-10;r>=0;r--)if(e.charCodeAt(r)!==36)return !1;return !0}function Ps(e,t,r){var n=be(e.source,t.source);return n!==0||(n=e.originalLine-t.originalLine,n!==0)||(n=e.originalColumn-t.originalColumn,n!==0||r)||(n=e.generatedColumn-t.generatedColumn,n!==0)||(n=e.generatedLine-t.generatedLine,n!==0)?n:be(e.name,t.name)}K.compareByOriginalPositions=Ps;function Is(e,t,r){var n;return n=e.originalLine-t.originalLine,n!==0||(n=e.originalColumn-t.originalColumn,n!==0||r)||(n=e.generatedColumn-t.generatedColumn,n!==0)||(n=e.generatedLine-t.generatedLine,n!==0)?n:be(e.name,t.name)}K.compareByOriginalPositionsNoSource=Is;function Ds(e,t,r){var n=e.generatedLine-t.generatedLine;return n!==0||(n=e.generatedColumn-t.generatedColumn,n!==0||r)||(n=be(e.source,t.source),n!==0)||(n=e.originalLine-t.originalLine,n!==0)||(n=e.originalColumn-t.originalColumn,n!==0)?n:be(e.name,t.name)}K.compareByGeneratedPositionsDeflated=Ds;function Os(e,t,r){var n=e.generatedColumn-t.generatedColumn;return n!==0||r||(n=be(e.source,t.source),n!==0)||(n=e.originalLine-t.originalLine,n!==0)||(n=e.originalColumn-t.originalColumn,n!==0)?n:be(e.name,t.name)}K.compareByGeneratedPositionsDeflatedNoLine=Os;function be(e,t){return e===t?0:e===null?1:t===null?-1:e>t?1:-1}function Ns(e,t){var r=e.generatedLine-t.generatedLine;return r!==0||(r=e.generatedColumn-t.generatedColumn,r!==0)||(r=be(e.source,t.source),r!==0)||(r=e.originalLine-t.originalLine,r!==0)||(r=e.originalColumn-t.originalColumn,r!==0)?r:be(e.name,t.name)}K.compareByGeneratedPositionsInflated=Ns;function zs(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))}K.parseSourceMapInput=zs;function Ms(e,t,r){if(t=t||"",e&&(e[e.length-1]!=="/"&&t[0]!=="/"&&(e+="/"),t=e+t),r){var n=nt(r);if(!n)throw new Error("sourceMapURL could not be parsed");if(n.path){var o=n.path.lastIndexOf("/");o>=0&&(n.path=n.path.substring(0,o+1));}t=ai(Ue(n),t);}return mr(t)}K.computeSourceURL=Ms;});var pi=Oe(ui=>{var fr=Et(),dr=Object.prototype.hasOwnProperty,Le=typeof Map<"u";function xe(){this._array=[],this._set=Le?new Map:Object.create(null);}xe.fromArray=function(t,r){for(var n=new xe,o=0,i=t.length;o<i;o++)n.add(t[o],r);return n};xe.prototype.size=function(){return Le?this._set.size:Object.getOwnPropertyNames(this._set).length};xe.prototype.add=function(t,r){var n=Le?t:fr.toSetString(t),o=Le?this.has(t):dr.call(this._set,n),i=this._array.length;(!o||r)&&this._array.push(t),o||(Le?this._set.set(t,i):this._set[n]=i);};xe.prototype.has=function(t){if(Le)return this._set.has(t);var r=fr.toSetString(t);return dr.call(this._set,r)};xe.prototype.indexOf=function(t){if(Le){var r=this._set.get(t);if(r>=0)return r}else {var n=fr.toSetString(t);if(dr.call(this._set,n))return this._set[n]}throw new Error('"'+t+'" is not in the set.')};xe.prototype.at=function(t){if(t>=0&&t<this._array.length)return this._array[t];throw new Error("No element indexed by "+t)};xe.prototype.toArray=function(){return this._array.slice()};ui.ArraySet=xe;});var fi=Oe(mi=>{var hi=Et();function Rs(e,t){var r=e.generatedLine,n=t.generatedLine,o=e.generatedColumn,i=t.generatedColumn;return n>r||n==r&&i>=o||hi.compareByGeneratedPositionsInflated(e,t)<=0}function Lt(){this._array=[],this._sorted=!0,this._last={generatedLine:-1,generatedColumn:0};}Lt.prototype.unsortedForEach=function(t,r){this._array.forEach(t,r);};Lt.prototype.add=function(t){Rs(this._last,t)?(this._last=t,this._array.push(t)):(this._sorted=!1,this._array.push(t));};Lt.prototype.toArray=function(){return this._sorted||(this._array.sort(hi.compareByGeneratedPositionsInflated),this._sorted=!0),this._array};mi.MappingList=Lt;});var gi=Oe(di=>{var ot=oi(),q=Et(),Pt=pi().ArraySet,Fs=fi().MappingList;function oe(e){e||(e={}),this._file=q.getArg(e,"file",null),this._sourceRoot=q.getArg(e,"sourceRoot",null),this._skipValidation=q.getArg(e,"skipValidation",!1),this._sources=new Pt,this._names=new Pt,this._mappings=new Fs,this._sourcesContents=null;}oe.prototype._version=3;oe.fromSourceMap=function(t){var r=t.sourceRoot,n=new oe({file:t.file,sourceRoot:r});return t.eachMapping(function(o){var i={generated:{line:o.generatedLine,column:o.generatedColumn}};o.source!=null&&(i.source=o.source,r!=null&&(i.source=q.relative(r,i.source)),i.original={line:o.originalLine,column:o.originalColumn},o.name!=null&&(i.name=o.name)),n.addMapping(i);}),t.sources.forEach(function(o){var i=o;r!==null&&(i=q.relative(r,o)),n._sources.has(i)||n._sources.add(i);var s=t.sourceContentFor(o);s!=null&&n.setSourceContent(o,s);}),n};oe.prototype.addMapping=function(t){var r=q.getArg(t,"generated"),n=q.getArg(t,"original",null),o=q.getArg(t,"source",null),i=q.getArg(t,"name",null);this._skipValidation||this._validateMapping(r,n,o,i),o!=null&&(o=String(o),this._sources.has(o)||this._sources.add(o)),i!=null&&(i=String(i),this._names.has(i)||this._names.add(i)),this._mappings.add({generatedLine:r.line,generatedColumn:r.column,originalLine:n!=null&&n.line,originalColumn:n!=null&&n.column,source:o,name:i});};oe.prototype.setSourceContent=function(t,r){var n=t;this._sourceRoot!=null&&(n=q.relative(this._sourceRoot,n)),r!=null?(this._sourcesContents||(this._sourcesContents=Object.create(null)),this._sourcesContents[q.toSetString(n)]=r):this._sourcesContents&&(delete this._sourcesContents[q.toSetString(n)],Object.keys(this._sourcesContents).length===0&&(this._sourcesContents=null));};oe.prototype.applySourceMap=function(t,r,n){var o=r;if(r==null){if(t.file==null)throw new Error(`SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, or the source map's "file" property. Both were omitted.`);o=t.file;}var i=this._sourceRoot;i!=null&&(o=q.relative(i,o));var s=new Pt,u=new Pt;this._mappings.unsortedForEach(function(c){if(c.source===o&&c.originalLine!=null){var a=t.originalPositionFor({line:c.originalLine,column:c.originalColumn});a.source!=null&&(c.source=a.source,n!=null&&(c.source=q.join(n,c.source)),i!=null&&(c.source=q.relative(i,c.source)),c.originalLine=a.line,c.originalColumn=a.column,a.name!=null&&(c.name=a.name));}var l=c.source;l!=null&&!s.has(l)&&s.add(l);var p=c.name;p!=null&&!u.has(p)&&u.add(p);},this),this._sources=s,this._names=u,t.sources.forEach(function(c){var a=t.sourceContentFor(c);a!=null&&(n!=null&&(c=q.join(n,c)),i!=null&&(c=q.relative(i,c)),this.setSourceContent(c,a));},this);};oe.prototype._validateMapping=function(t,r,n,o){if(r&&typeof r.line!="number"&&typeof r.column!="number")throw new Error("original.line and original.column are not numbers -- you probably meant to omit the original mapping entirely and only map the generated position. If so, pass null for the original mapping instead of an object with empty or null values.");if(!(t&&"line"in t&&"column"in t&&t.line>0&&t.column>=0&&!r&&!n&&!o)){if(t&&"line"in t&&"column"in t&&r&&"line"in r&&"column"in r&&t.line>0&&t.column>=0&&r.line>0&&r.column>=0&&n)return;throw new Error("Invalid mapping: "+JSON.stringify({generated:t,source:n,original:r,name:o}))}};oe.prototype._serializeMappings=function(){for(var t=0,r=1,n=0,o=0,i=0,s=0,u="",c,a,l,p,m=this._mappings.toArray(),f=0,P=m.length;f<P;f++){if(a=m[f],c="",a.generatedLine!==r)for(t=0;a.generatedLine!==r;)c+=";",r++;else if(f>0){if(!q.compareByGeneratedPositionsInflated(a,m[f-1]))continue;c+=",";}c+=ot.encode(a.generatedColumn-t),t=a.generatedColumn,a.source!=null&&(p=this._sources.indexOf(a.source),c+=ot.encode(p-s),s=p,c+=ot.encode(a.originalLine-1-o),o=a.originalLine-1,c+=ot.encode(a.originalColumn-n),n=a.originalColumn,a.name!=null&&(l=this._names.indexOf(a.name),c+=ot.encode(l-i),i=l)),u+=c;}return u};oe.prototype._generateSourcesContent=function(t,r){return t.map(function(n){if(!this._sourcesContents)return null;r!=null&&(n=q.relative(r,n));var o=q.toSetString(n);return Object.prototype.hasOwnProperty.call(this._sourcesContents,o)?this._sourcesContents[o]:null},this)};oe.prototype.toJSON=function(){var t={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};return this._file!=null&&(t.file=this._file),this._sourceRoot!=null&&(t.sourceRoot=this._sourceRoot),this._sourcesContents&&(t.sourcesContent=this._generateSourcesContent(t.sources,t.sourceRoot)),t};oe.prototype.toString=function(){return JSON.stringify(this.toJSON())};di.SourceMapGenerator=oe;});var $e={};b($e,{AtKeyword:()=>I,BadString:()=>Ae,BadUrl:()=>Y,CDC:()=>j,CDO:()=>ue,Colon:()=>O,Comma:()=>G,Comment:()=>E,Delim:()=>g,Dimension:()=>y,EOF:()=>Xe,Function:()=>x,Hash:()=>v,Ident:()=>h,LeftCurlyBracket:()=>M,LeftParenthesis:()=>T,LeftSquareBracket:()=>U,Number:()=>d,Percentage:()=>A,RightCurlyBracket:()=>H,RightParenthesis:()=>w,RightSquareBracket:()=>V,Semicolon:()=>_,String:()=>W,Url:()=>F,WhiteSpace:()=>k});var Xe=0,h=1,x=2,I=3,v=4,W=5,Ae=6,F=7,Y=8,g=9,d=10,A=11,y=12,k=13,ue=14,j=15,O=16,_=17,G=18,U=19,V=20,T=21,w=22,M=23,H=24,E=25;function B(e){return e>=48&&e<=57}function ee(e){return B(e)||e>=65&&e<=70||e>=97&&e<=102}function yt(e){return e>=65&&e<=90}function cs(e){return e>=97&&e<=122}function us(e){return yt(e)||cs(e)}function ps(e){return e>=128}function xt(e){return us(e)||ps(e)||e===95}function Ne(e){return xt(e)||B(e)||e===45}function hs(e){return e>=0&&e<=8||e===11||e>=14&&e<=31||e===127}function Ze(e){return e===10||e===13||e===12}function pe(e){return Ze(e)||e===32||e===9}function $(e,t){return !(e!==92||Ze(t)||t===0)}function ze(e,t,r){return e===45?xt(t)||t===45||$(t,r):xt(e)?!0:e===92?$(e,t):!1}function kt(e,t,r){return e===43||e===45?B(t)?2:t===46&&B(r)?3:0:e===46?B(t)?2:0:B(e)?1:0}function wt(e){return e===65279||e===65534?1:0}var rr=new Array(128),ms=128,Je=130,nr=131,vt=132,or=133;for(let e=0;e<rr.length;e++)rr[e]=pe(e)&&Je||B(e)&&nr||xt(e)&&vt||hs(e)&&or||e||ms;function St(e){return e<128?rr[e]:vt}function Me(e,t){return t<e.length?e.charCodeAt(t):0}function Ct(e,t,r){return r===13&&Me(e,t+1)===10?2:1}function de(e,t,r){let n=e.charCodeAt(t);return yt(n)&&(n=n|32),n===r}function ge(e,t,r,n){if(r-t!==n.length||t<0||r>e.length)return !1;for(let o=t;o<r;o++){let i=n.charCodeAt(o-t),s=e.charCodeAt(o);if(yt(s)&&(s=s|32),s!==i)return !1}return !0}function Uo(e,t){for(;t>=0&&pe(e.charCodeAt(t));t--);return t+1}function et(e,t){for(;t<e.length&&pe(e.charCodeAt(t));t++);return t}function ir(e,t){for(;t<e.length&&B(e.charCodeAt(t));t++);return t}function se(e,t){if(t+=2,ee(Me(e,t-1))){for(let n=Math.min(e.length,t+5);t<n&&ee(Me(e,t));t++);let r=Me(e,t);pe(r)&&(t+=Ct(e,t,r));}return t}function tt(e,t){for(;t<e.length;t++){let r=e.charCodeAt(t);if(!Ne(r)){if($(r,Me(e,t+1))){t=se(e,t)-1;continue}break}}return t}function Te(e,t){let r=e.charCodeAt(t);if((r===43||r===45)&&(r=e.charCodeAt(t+=1)),B(r)&&(t=ir(e,t+1),r=e.charCodeAt(t)),r===46&&B(e.charCodeAt(t+1))&&(t+=2,t=ir(e,t)),de(e,t,101)){let n=0;r=e.charCodeAt(t+1),(r===45||r===43)&&(n=1,r=e.charCodeAt(t+2)),B(r)&&(t=ir(e,t+1+n+1));}return t}function At(e,t){for(;t<e.length;t++){let r=e.charCodeAt(t);if(r===41){t++;break}$(r,Me(e,t+1))&&(t=se(e,t));}return t}function Re(e){if(e.length===1&&!ee(e.charCodeAt(0)))return e[0];let t=parseInt(e,16);return (t===0||t>=55296&&t<=57343||t>1114111)&&(t=65533),String.fromCodePoint(t)}var Fe=["EOF-token","ident-token","function-token","at-keyword-token","hash-token","string-token","bad-string-token","url-token","bad-url-token","delim-token","number-token","percentage-token","dimension-token","whitespace-token","CDO-token","CDC-token","colon-token","semicolon-token","comma-token","[-token","]-token","(-token",")-token","{-token","}-token","comment-token"];function Be(e=null,t){return e===null||e.length<t?new Uint32Array(Math.max(t+1024,16384)):e}var jo=10,fs=12,qo=13;function Wo(e){let t=e.source,r=t.length,n=t.length>0?wt(t.charCodeAt(0)):0,o=Be(e.lines,r),i=Be(e.columns,r),s=e.startLine,u=e.startColumn;for(let c=n;c<r;c++){let a=t.charCodeAt(c);o[c]=s,i[c]=u++,(a===jo||a===qo||a===fs)&&(a===qo&&c+1<r&&t.charCodeAt(c+1)===jo&&(c++,o[c]=s,i[c]=u),s++,u=1);}o[r]=s,i[r]=u,e.lines=o,e.columns=i,e.computed=!0;}var Tt=class{constructor(){this.lines=null,this.columns=null,this.computed=!1;}setSource(t,r=0,n=1,o=1){this.source=t,this.startOffset=r,this.startLine=n,this.startColumn=o,this.computed=!1;}getLocation(t,r){return this.computed||Wo(this),{source:r,offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]}}getLocationRange(t,r,n){return this.computed||Wo(this),{source:n,start:{offset:this.startOffset+t,line:this.lines[t],column:this.columns[t]},end:{offset:this.startOffset+r,line:this.lines[r],column:this.columns[r]}}}};var ne=16777215,we=24,ds=new Map([[2,22],[21,22],[19,20],[23,24]]),rt=class{constructor(t,r){this.setSource(t,r);}reset(){this.eof=!1,this.tokenIndex=-1,this.tokenType=0,this.tokenStart=this.firstCharOffset,this.tokenEnd=this.firstCharOffset;}setSource(t="",r=()=>{}){t=String(t||"");let n=t.length,o=Be(this.offsetAndType,t.length+1),i=Be(this.balance,t.length+1),s=0,u=0,c=0,a=-1;for(this.offsetAndType=null,this.balance=null,r(t,(l,p,m)=>{switch(l){default:i[s]=n;break;case u:{let f=c&ne;for(c=i[f],u=c>>we,i[s]=f,i[f++]=s;f<s;f++)i[f]===n&&(i[f]=s);break}case 21:case 2:case 19:case 23:i[s]=c,u=ds.get(l),c=u<<we|s;break}o[s++]=l<<we|m,a===-1&&(a=p);}),o[s]=0<<we|n,i[s]=n,i[n]=n;c!==0;){let l=c&ne;c=i[l],i[l]=n;}this.source=t,this.firstCharOffset=a===-1?0:a,this.tokenCount=s,this.offsetAndType=o,this.balance=i,this.reset(),this.next();}lookupType(t){return t+=this.tokenIndex,t<this.tokenCount?this.offsetAndType[t]>>we:0}lookupOffset(t){return t+=this.tokenIndex,t<this.tokenCount?this.offsetAndType[t-1]&ne:this.source.length}lookupValue(t,r){return t+=this.tokenIndex,t<this.tokenCount?ge(this.source,this.offsetAndType[t-1]&ne,this.offsetAndType[t]&ne,r):!1}getTokenStart(t){return t===this.tokenIndex?this.tokenStart:t>0?t<this.tokenCount?this.offsetAndType[t-1]&ne:this.offsetAndType[this.tokenCount]&ne:this.firstCharOffset}substrToCursor(t){return this.source.substring(t,this.tokenStart)}isBalanceEdge(t){return this.balance[this.tokenIndex]<t}isDelim(t,r){return r?this.lookupType(r)===9&&this.source.charCodeAt(this.lookupOffset(r))===t:this.tokenType===9&&this.source.charCodeAt(this.tokenStart)===t}skip(t){let r=this.tokenIndex+t;r<this.tokenCount?(this.tokenIndex=r,this.tokenStart=this.offsetAndType[r-1]&ne,r=this.offsetAndType[r],this.tokenType=r>>we,this.tokenEnd=r&ne):(this.tokenIndex=this.tokenCount,this.next());}next(){let t=this.tokenIndex+1;t<this.tokenCount?(this.tokenIndex=t,this.tokenStart=this.tokenEnd,t=this.offsetAndType[t],this.tokenType=t>>we,this.tokenEnd=t&ne):(this.eof=!0,this.tokenIndex=this.tokenCount,this.tokenType=0,this.tokenStart=this.tokenEnd=this.source.length);}skipSC(){for(;this.tokenType===13||this.tokenType===25;)this.next();}skipUntilBalanced(t,r){let n=t,o,i;e:for(;n<this.tokenCount;n++){if(o=this.balance[n],o<t)break e;switch(i=n>0?this.offsetAndType[n-1]&ne:this.firstCharOffset,r(this.source.charCodeAt(i))){case 1:break e;case 2:n++;break e;default:this.balance[o]===n&&(n=o);}}this.skip(n-this.tokenIndex);}forEachToken(t){for(let r=0,n=this.firstCharOffset;r<this.tokenCount;r++){let o=n,i=this.offsetAndType[r],s=i&ne,u=i>>we;n=s,t(u,o,s,r);}}dump(){let t=new Array(this.tokenCount);return this.forEachToken((r,n,o,i)=>{t[i]={idx:i,type:Fe[r],chunk:this.source.substring(n,o),balance:this.balance[i]};}),t}};function ve(e,t){function r(p){return p<u?e.charCodeAt(p):0}function n(){if(a=Te(e,a),ze(r(a),r(a+1),r(a+2))){l=12,a=tt(e,a);return}if(r(a)===37){l=11,a++;return}l=10;}function o(){let p=a;if(a=tt(e,a),ge(e,p,a,"url")&&r(a)===40){if(a=et(e,a+1),r(a)===34||r(a)===39){l=2,a=p+4;return}s();return}if(r(a)===40){l=2,a++;return}l=1;}function i(p){for(p||(p=r(a++)),l=5;a<e.length;a++){let m=e.charCodeAt(a);switch(St(m)){case p:a++;return;case Je:if(Ze(m)){a+=Ct(e,a,m),l=6;return}break;case 92:if(a===e.length-1)break;let f=r(a+1);Ze(f)?a+=Ct(e,a+1,f):$(m,f)&&(a=se(e,a)-1);break}}}function s(){for(l=7,a=et(e,a);a<e.length;a++){let p=e.charCodeAt(a);switch(St(p)){case 41:a++;return;case Je:if(a=et(e,a),r(a)===41||a>=e.length){a<e.length&&a++;return}a=At(e,a),l=8;return;case 34:case 39:case 40:case or:a=At(e,a),l=8;return;case 92:if($(p,r(a+1))){a=se(e,a)-1;break}a=At(e,a),l=8;return}}}e=String(e||"");let u=e.length,c=wt(r(0)),a=c,l;for(;a<u;){let p=e.charCodeAt(a);switch(St(p)){case Je:l=13,a=et(e,a+1);break;case 34:i();break;case 35:Ne(r(a+1))||$(r(a+1),r(a+2))?(l=4,a=tt(e,a+1)):(l=9,a++);break;case 39:i();break;case 40:l=21,a++;break;case 41:l=22,a++;break;case 43:kt(p,r(a+1),r(a+2))?n():(l=9,a++);break;case 44:l=18,a++;break;case 45:kt(p,r(a+1),r(a+2))?n():r(a+1)===45&&r(a+2)===62?(l=15,a=a+3):ze(p,r(a+1),r(a+2))?o():(l=9,a++);break;case 46:kt(p,r(a+1),r(a+2))?n():(l=9,a++);break;case 47:r(a+1)===42?(l=25,a=e.indexOf("*/",a+2),a=a===-1?e.length:a+2):(l=9,a++);break;case 58:l=16,a++;break;case 59:l=17,a++;break;case 60:r(a+1)===33&&r(a+2)===45&&r(a+3)===45?(l=14,a=a+4):(l=9,a++);break;case 64:ze(r(a+1),r(a+2),r(a+3))?(l=3,a=tt(e,a+1)):(l=9,a++);break;case 91:l=19,a++;break;case 92:$(p,r(a+1))?o():(l=9,a++);break;case 93:l=20,a++;break;case 123:l=23,a++;break;case 125:l=24,a++;break;case nr:n();break;case vt:o();break;default:l=9,a++;}t(l,c,c=a);}}var _e=null,D=class{static createItem(t){return {prev:null,next:null,data:t}}constructor(){this.head=null,this.tail=null,this.cursor=null;}createItem(t){return D.createItem(t)}allocateCursor(t,r){let n;return _e!==null?(n=_e,_e=_e.cursor,n.prev=t,n.next=r,n.cursor=this.cursor):n={prev:t,next:r,cursor:this.cursor},this.cursor=n,n}releaseCursor(){let{cursor:t}=this;this.cursor=t.cursor,t.prev=null,t.next=null,t.cursor=_e,_e=t;}updateCursors(t,r,n,o){let{cursor:i}=this;for(;i!==null;)i.prev===t&&(i.prev=r),i.next===n&&(i.next=o),i=i.cursor;}*[Symbol.iterator](){for(let t=this.head;t!==null;t=t.next)yield t.data;}get size(){let t=0;for(let r=this.head;r!==null;r=r.next)t++;return t}get isEmpty(){return this.head===null}get first(){return this.head&&this.head.data}get last(){return this.tail&&this.tail.data}fromArray(t){let r=null;this.head=null;for(let n of t){let o=D.createItem(n);r!==null?r.next=o:this.head=o,o.prev=r,r=o;}return this.tail=r,this}toArray(){return [...this]}toJSON(){return [...this]}forEach(t,r=this){let n=this.allocateCursor(null,this.head);for(;n.next!==null;){let o=n.next;n.next=o.next,t.call(r,o.data,o,this);}this.releaseCursor();}forEachRight(t,r=this){let n=this.allocateCursor(this.tail,null);for(;n.prev!==null;){let o=n.prev;n.prev=o.prev,t.call(r,o.data,o,this);}this.releaseCursor();}reduce(t,r,n=this){let o=this.allocateCursor(null,this.head),i=r,s;for(;o.next!==null;)s=o.next,o.next=s.next,i=t.call(n,i,s.data,s,this);return this.releaseCursor(),i}reduceRight(t,r,n=this){let o=this.allocateCursor(this.tail,null),i=r,s;for(;o.prev!==null;)s=o.prev,o.prev=s.prev,i=t.call(n,i,s.data,s,this);return this.releaseCursor(),i}some(t,r=this){for(let n=this.head;n!==null;n=n.next)if(t.call(r,n.data,n,this))return !0;return !1}map(t,r=this){let n=new D;for(let o=this.head;o!==null;o=o.next)n.appendData(t.call(r,o.data,o,this));return n}filter(t,r=this){let n=new D;for(let o=this.head;o!==null;o=o.next)t.call(r,o.data,o,this)&&n.appendData(o.data);return n}nextUntil(t,r,n=this){if(t===null)return;let o=this.allocateCursor(null,t);for(;o.next!==null;){let i=o.next;if(o.next=i.next,r.call(n,i.data,i,this))break}this.releaseCursor();}prevUntil(t,r,n=this){if(t===null)return;let o=this.allocateCursor(t,null);for(;o.prev!==null;){let i=o.prev;if(o.prev=i.prev,r.call(n,i.data,i,this))break}this.releaseCursor();}clear(){this.head=null,this.tail=null;}copy(){let t=new D;for(let r of this)t.appendData(r);return t}prepend(t){return this.updateCursors(null,t,this.head,t),this.head!==null?(this.head.prev=t,t.next=this.head):this.tail=t,this.head=t,this}prependData(t){return this.prepend(D.createItem(t))}append(t){return this.insert(t)}appendData(t){return this.insert(D.createItem(t))}insert(t,r=null){if(r!==null)if(this.updateCursors(r.prev,t,r,t),r.prev===null){if(this.head!==r)throw new Error("before doesn't belong to list");this.head=t,r.prev=t,t.next=r,this.updateCursors(null,t);}else r.prev.next=t,t.prev=r.prev,r.prev=t,t.next=r;else this.updateCursors(this.tail,t,null,t),this.tail!==null?(this.tail.next=t,t.prev=this.tail):this.head=t,this.tail=t;return this}insertData(t,r){return this.insert(D.createItem(t),r)}remove(t){if(this.updateCursors(t,t.prev,t,t.next),t.prev!==null)t.prev.next=t.next;else {if(this.head!==t)throw new Error("item doesn't belong to list");this.head=t.next;}if(t.next!==null)t.next.prev=t.prev;else {if(this.tail!==t)throw new Error("item doesn't belong to list");this.tail=t.prev;}return t.prev=null,t.next=null,t}push(t){this.insert(D.createItem(t));}pop(){return this.tail!==null?this.remove(this.tail):null}unshift(t){this.prepend(D.createItem(t));}shift(){return this.head!==null?this.remove(this.head):null}prependList(t){return this.insertList(t,this.head)}appendList(t){return this.insertList(t)}insertList(t,r){return t.head===null?this:(r!=null?(this.updateCursors(r.prev,t.tail,r,t.head),r.prev!==null?(r.prev.next=t.head,t.head.prev=r.prev):this.head=t.head,r.prev=t.tail,t.tail.next=r):(this.updateCursors(this.tail,t.tail,null,t.head),this.tail!==null?(this.tail.next=t.head,t.head.prev=this.tail):this.head=t.head,this.tail=t.tail),t.head=null,t.tail=null,this)}replace(t,r){"head"in r?this.insertList(r,t):this.insert(r,t),this.remove(t);}};function Ee(e,t){let r=Object.create(SyntaxError.prototype),n=new Error;return Object.assign(r,{name:e,message:t,get stack(){return (n.stack||"").replace(/^(.+\n){1,3}/,`${e}: ${t}
  21644. `)}})}var ar=100,Ho=60,Yo=" ";function Go({source:e,line:t,column:r},n){function o(l,p){return i.slice(l,p).map((m,f)=>String(l+f+1).padStart(c)+" |"+m).join(`
  21645. `)}let i=e.split(/\r\n?|\n|\f/),s=Math.max(1,t-n)-1,u=Math.min(t+n,i.length+1),c=Math.max(4,String(u).length)+1,a=0;r+=(Yo.length-1)*(i[t-1].substr(0,r-1).match(/\t/g)||[]).length,r>ar&&(a=r-Ho+3,r=Ho-2);for(let l=s;l<=u;l++)l>=0&&l<i.length&&(i[l]=i[l].replace(/\t/g,Yo),i[l]=(a>0&&i[l].length>a?"\u2026":"")+i[l].substr(a,ar-2)+(i[l].length>a+ar-1?"\u2026":""));return [o(s,t),new Array(r+c+2).join("-")+"^",o(t,u)].filter(Boolean).join(`
  21646. `)}function sr(e,t,r,n,o){return Object.assign(Ee("SyntaxError",e),{source:t,offset:r,line:n,column:o,sourceFragment(s){return Go({source:t,line:n,column:o},isNaN(s)?0:s)},get formattedMessage(){return `Parse error: ${e}
  21647. `+Go({source:t,line:n,column:o},2)}})}function Vo(e){let t=this.createList(),r=!1,n={recognizer:e};for(;!this.eof;){switch(this.tokenType){case 25:this.next();continue;case 13:r=!0,this.next();continue}let o=e.getNode.call(this,n);if(o===void 0)break;r&&(e.onWhiteSpace&&e.onWhiteSpace.call(this,o,t,n),r=!1),t.push(o);}return r&&e.onWhiteSpace&&e.onWhiteSpace.call(this,null,t,n),t}var Ko=()=>{},gs=33,bs=35,lr=59,Qo=123,Xo=0;function xs(e){return function(){return this[e]()}}function cr(e){let t=Object.create(null);for(let r in e){let n=e[r],o=n.parse||n;o&&(t[r]=o);}return t}function ys(e){let t={context:Object.create(null),scope:Object.assign(Object.create(null),e.scope),atrule:cr(e.atrule),pseudo:cr(e.pseudo),node:cr(e.node)};for(let r in e.parseContext)switch(typeof e.parseContext[r]){case"function":t.context[r]=e.parseContext[r];break;case"string":t.context[r]=xs(e.parseContext[r]);break}return {config:t,...t,...t.node}}function $o(e){let t="",r="<unknown>",n=!1,o=Ko,i=!1,s=new Tt,u=Object.assign(new rt,ys(e||{}),{parseAtrulePrelude:!0,parseRulePrelude:!0,parseValue:!0,parseCustomProperty:!1,readSequence:Vo,consumeUntilBalanceEnd:()=>0,consumeUntilLeftCurlyBracket(a){return a===Qo?1:0},consumeUntilLeftCurlyBracketOrSemicolon(a){return a===Qo||a===lr?1:0},consumeUntilExclamationMarkOrSemicolon(a){return a===gs||a===lr?1:0},consumeUntilSemicolonIncluded(a){return a===lr?2:0},createList(){return new D},createSingleNodeList(a){return new D().appendData(a)},getFirstListNode(a){return a&&a.first},getLastListNode(a){return a&&a.last},parseWithFallback(a,l){let p=this.tokenIndex;try{return a.call(this)}catch(m){if(i)throw m;let f=l.call(this,p);return i=!0,o(m,f),i=!1,f}},lookupNonWSType(a){let l;do if(l=this.lookupType(a++),l!==13)return l;while(l!==Xo);return Xo},charCodeAt(a){return a>=0&&a<t.length?t.charCodeAt(a):0},substring(a,l){return t.substring(a,l)},substrToCursor(a){return this.source.substring(a,this.tokenStart)},cmpChar(a,l){return de(t,a,l)},cmpStr(a,l,p){return ge(t,a,l,p)},consume(a){let l=this.tokenStart;return this.eat(a),this.substrToCursor(l)},consumeFunctionName(){let a=t.substring(this.tokenStart,this.tokenEnd-1);return this.eat(2),a},consumeNumber(a){let l=t.substring(this.tokenStart,Te(t,this.tokenStart));return this.eat(a),l},eat(a){if(this.tokenType!==a){let l=Fe[a].slice(0,-6).replace(/-/g," ").replace(/^./,f=>f.toUpperCase()),p=`${/[[\](){}]/.test(l)?`"${l}"`:l} is expected`,m=this.tokenStart;switch(a){case 1:this.tokenType===2||this.tokenType===7?(m=this.tokenEnd-1,p="Identifier is expected but function found"):p="Identifier is expected";break;case 4:this.isDelim(bs)&&(this.next(),m++,p="Name is expected");break;case 11:this.tokenType===10&&(m=this.tokenEnd,p="Percent sign is expected");break}this.error(p,m);}this.next();},eatIdent(a){(this.tokenType!==1||this.lookupValue(0,a)===!1)&&this.error(`Identifier "${a}" is expected`),this.next();},eatDelim(a){this.isDelim(a)||this.error(`Delim "${String.fromCharCode(a)}" is expected`),this.next();},getLocation(a,l){return n?s.getLocationRange(a,l,r):null},getLocationFromList(a){if(n){let l=this.getFirstListNode(a),p=this.getLastListNode(a);return s.getLocationRange(l!==null?l.loc.start.offset-s.startOffset:this.tokenStart,p!==null?p.loc.end.offset-s.startOffset:this.tokenStart,r)}return null},error(a,l){let p=typeof l<"u"&&l<t.length?s.getLocation(l):this.eof?s.getLocation(Uo(t,t.length-1)):s.getLocation(this.tokenStart);throw new sr(a||"Unexpected input",t,p.offset,p.line,p.column)}});return Object.assign(function(a,l){t=a,l=l||{},u.setSource(t,ve),s.setSource(t,l.offset,l.line,l.column),r=l.filename||"<unknown>",n=Boolean(l.positions),o=typeof l.onParseError=="function"?l.onParseError:Ko,i=!1,u.parseAtrulePrelude="parseAtrulePrelude"in l?Boolean(l.parseAtrulePrelude):!0,u.parseRulePrelude="parseRulePrelude"in l?Boolean(l.parseRulePrelude):!0,u.parseValue="parseValue"in l?Boolean(l.parseValue):!0,u.parseCustomProperty="parseCustomProperty"in l?Boolean(l.parseCustomProperty):!1;let{context:p="default",onComment:m}=l;if(!(p in u.context))throw new Error("Unknown context `"+p+"`");typeof m=="function"&&u.forEachToken((P,te,X)=>{if(P===25){let S=u.getLocation(te,X),R=ge(t,X-2,X,"*/")?t.slice(te+2,X-2):t.slice(te+2,X);m(R,S);}});let f=u.context[p].call(u,l);return u.eof||u.error(),f},{SyntaxError:sr,config:u.config})}var xi=ls(gi(),1),bi=new Set(["Atrule","Selector","Declaration"]);function yi(e){let t=new xi.SourceMapGenerator,r={line:1,column:0},n={line:0,column:0},o={line:1,column:0},i={generated:o},s=1,u=0,c=!1,a=e.node;e.node=function(m){if(m.loc&&m.loc.start&&bi.has(m.type)){let f=m.loc.start.line,P=m.loc.start.column-1;(n.line!==f||n.column!==P)&&(n.line=f,n.column=P,r.line=s,r.column=u,c&&(c=!1,(r.line!==o.line||r.column!==o.column)&&t.addMapping(i)),c=!0,t.addMapping({source:m.loc.source,original:n,generated:r}));}a.call(this,m),c&&bi.has(m.type)&&(o.line=s,o.column=u);};let l=e.emit;e.emit=function(m,f,P){for(let te=0;te<m.length;te++)m.charCodeAt(te)===10?(s++,u=0):u++;l(m,f,P);};let p=e.result;return e.result=function(){return c&&t.addMapping(i),{css:p(),map:t}},e}var It={};b(It,{safe:()=>br,spec:()=>js});var Bs=43,_s=45,gr=(e,t)=>{if(e===9&&(e=t),typeof e=="string"){let r=e.charCodeAt(0);return r>127?32768:r<<8}return e},ki=[[1,1],[1,2],[1,7],[1,8],[1,"-"],[1,10],[1,11],[1,12],[1,15],[1,21],[3,1],[3,2],[3,7],[3,8],[3,"-"],[3,10],[3,11],[3,12],[3,15],[4,1],[4,2],[4,7],[4,8],[4,"-"],[4,10],[4,11],[4,12],[4,15],[12,1],[12,2],[12,7],[12,8],[12,"-"],[12,10],[12,11],[12,12],[12,15],["#",1],["#",2],["#",7],["#",8],["#","-"],["#",10],["#",11],["#",12],["#",15],["-",1],["-",2],["-",7],["-",8],["-","-"],["-",10],["-",11],["-",12],["-",15],[10,1],[10,2],[10,7],[10,8],[10,10],[10,11],[10,12],[10,"%"],[10,15],["@",1],["@",2],["@",7],["@",8],["@","-"],["@",15],[".",10],[".",11],[".",12],["+",10],["+",11],["+",12],["/","*"]],Us=ki.concat([[1,4],[12,4],[4,4],[3,21],[3,5],[3,16],[11,11],[11,12],[11,2],[11,"-"],[22,1],[22,2],[22,11],[22,12],[22,4],[22,"-"]]);function wi(e){let t=new Set(e.map(([r,n])=>gr(r)<<16|gr(n)));return function(r,n,o){let i=gr(n,o),s=o.charCodeAt(0);return (s===_s&&n!==1&&n!==2&&n!==15||s===Bs?t.has(r<<16|s<<8):t.has(r<<16|i))&&this.emit(" ",13,!0),i}}var js=wi(ki),br=wi(Us);var qs=92;function Ws(e,t){if(typeof t=="function"){let r=null;e.children.forEach(n=>{r!==null&&t.call(this,r),this.node(n),r=n;});return}e.children.forEach(this.node,this);}function Hs(e){ve(e,(t,r,n)=>{this.token(t,e.slice(r,n));});}function vi(e){let t=new Map;for(let r in e.node){let n=e.node[r];typeof(n.generate||n)=="function"&&t.set(r,n.generate||n);}return function(r,n){let o="",i=0,s={node(c){if(t.has(c.type))t.get(c.type).call(u,c);else throw new Error("Unknown node type: "+c.type)},tokenBefore:br,token(c,a){i=this.tokenBefore(i,c,a),this.emit(a,c,!1),c===9&&a.charCodeAt(0)===qs&&this.emit(`
  21648. `,13,!0);},emit(c){o+=c;},result(){return o}};n&&(typeof n.decorator=="function"&&(s=n.decorator(s)),n.sourceMap&&(s=yi(s)),n.mode in It&&(s.tokenBefore=It[n.mode]));let u={node:c=>s.node(c),children:Ws,token:(c,a)=>s.token(c,a),tokenize:Hs};return s.node(r),s.result()}}function Si(e){return {fromPlainObject(t){return e(t,{enter(r){r.children&&!(r.children instanceof D)&&(r.children=new D().fromArray(r.children));}}),t},toPlainObject(t){return e(t,{leave(r){r.children&&r.children instanceof D&&(r.children=r.children.toArray());}}),t}}}var{hasOwnProperty:xr}=Object.prototype,it=function(){};function Ci(e){return typeof e=="function"?e:it}function Ai(e,t){return function(r,n,o){r.type===t&&e.call(this,r,n,o);}}function Ys(e,t){let r=t.structure,n=[];for(let o in r){if(xr.call(r,o)===!1)continue;let i=r[o],s={name:o,type:!1,nullable:!1};Array.isArray(i)||(i=[i]);for(let u of i)u===null?s.nullable=!0:typeof u=="string"?s.type="node":Array.isArray(u)&&(s.type="list");s.type&&n.push(s);}return n.length?{context:t.walkContext,fields:n}:null}function Gs(e){let t={};for(let r in e.node)if(xr.call(e.node,r)){let n=e.node[r];if(!n.structure)throw new Error("Missed `structure` field in `"+r+"` node type definition");t[r]=Ys(r,n);}return t}function Ti(e,t){let r=e.fields.slice(),n=e.context,o=typeof n=="string";return t&&r.reverse(),function(i,s,u,c){let a;o&&(a=s[n],s[n]=i);for(let l of r){let p=i[l.name];if(!l.nullable||p){if(l.type==="list"){if(t?p.reduceRight(c,!1):p.reduce(c,!1))return !0}else if(u(p))return !0}}o&&(s[n]=a);}}function Ei({StyleSheet:e,Atrule:t,Rule:r,Block:n,DeclarationList:o}){return {Atrule:{StyleSheet:e,Atrule:t,Rule:r,Block:n},Rule:{StyleSheet:e,Atrule:t,Rule:r,Block:n},Declaration:{StyleSheet:e,Atrule:t,Rule:r,Block:n,DeclarationList:o}}}function Li(e){let t=Gs(e),r={},n={},o=Symbol("break-walk"),i=Symbol("skip-node");for(let a in t)xr.call(t,a)&&t[a]!==null&&(r[a]=Ti(t[a],!1),n[a]=Ti(t[a],!0));let s=Ei(r),u=Ei(n),c=function(a,l){function p(S,R,ke){let z=m.call(X,S,R,ke);return z===o?!0:z===i?!1:!!(P.hasOwnProperty(S.type)&&P[S.type](S,X,p,te)||f.call(X,S,R,ke)===o)}let m=it,f=it,P=r,te=(S,R,ke,z)=>S||p(R,ke,z),X={break:o,skip:i,root:a,stylesheet:null,atrule:null,atrulePrelude:null,rule:null,selector:null,block:null,declaration:null,function:null};if(typeof l=="function")m=l;else if(l&&(m=Ci(l.enter),f=Ci(l.leave),l.reverse&&(P=n),l.visit)){if(s.hasOwnProperty(l.visit))P=l.reverse?u[l.visit]:s[l.visit];else if(!t.hasOwnProperty(l.visit))throw new Error("Bad value `"+l.visit+"` for `visit` option (should be: "+Object.keys(t).sort().join(", ")+")");m=Ai(m,l.visit),f=Ai(f,l.visit);}if(m===it&&f===it)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");p(a);};return c.break=o,c.skip=i,c.find=function(a,l){let p=null;return c(a,function(m,f,P){if(l.call(this,m,f,P))return p=m,o}),p},c.findLast=function(a,l){let p=null;return c(a,{reverse:!0,enter(m,f,P){if(l.call(this,m,f,P))return p=m,o}}),p},c.findAll=function(a,l){let p=[];return c(a,function(m,f,P){l.call(this,m,f,P)&&p.push(m);}),p},c}function Vs(e){return e}function Ks(e){let{min:t,max:r,comma:n}=e;return t===0&&r===0?n?"#?":"*":t===0&&r===1?"?":t===1&&r===0?n?"#":"+":t===1&&r===1?"":(n?"#":"")+(t===r?"{"+t+"}":"{"+t+","+(r!==0?r:"")+"}")}function Qs(e){switch(e.type){case"Range":return " ["+(e.min===null?"-\u221E":e.min)+","+(e.max===null?"\u221E":e.max)+"]";default:throw new Error("Unknown node type `"+e.type+"`")}}function Xs(e,t,r,n){let o=e.combinator===" "||n?e.combinator:" "+e.combinator+" ",i=e.terms.map(s=>yr(s,t,r,n)).join(o);return e.explicit||r?(n||i[0]===","?"[":"[ ")+i+(n?"]":" ]"):i}function yr(e,t,r,n){let o;switch(e.type){case"Group":o=Xs(e,t,r,n)+(e.disallowEmpty?"!":"");break;case"Multiplier":return yr(e.term,t,r,n)+t(Ks(e),e);case"Type":o="<"+e.name+(e.opts?t(Qs(e.opts),e.opts):"")+">";break;case"Property":o="<'"+e.name+"'>";break;case"Keyword":o=e.name;break;case"AtKeyword":o="@"+e.name;break;case"Function":o=e.name+"(";break;case"String":case"Token":o=e.value;break;case"Comma":o=",";break;default:throw new Error("Unknown node type `"+e.type+"`")}return t(o,e)}function Pe(e,t){let r=Vs,n=!1,o=!1;return typeof t=="function"?r=t:t&&(n=Boolean(t.forceBraces),o=Boolean(t.compact),typeof t.decorate=="function"&&(r=t.decorate)),yr(e,r,n,o)}var Pi={offset:0,line:1,column:1};function $s(e,t){let r=e.tokens,n=e.longestMatch,o=n<r.length&&r[n].node||null,i=o!==t?o:null,s=0,u=0,c=0,a="",l,p;for(let m=0;m<r.length;m++){let f=r[m].value;m===n&&(u=f.length,s=a.length),i!==null&&r[m].node===i&&(m<=n?c++:c=0),a+=f;}return n===r.length||c>1?(l=Dt(i||t,"end")||at(Pi,a),p=at(l)):(l=Dt(i,"start")||at(Dt(t,"start")||Pi,a.slice(0,s)),p=Dt(i,"end")||at(l,a.substr(s,u))),{css:a,mismatchOffset:s,mismatchLength:u,start:l,end:p}}function Dt(e,t){let r=e&&e.loc&&e.loc[t];return r?"line"in r?at(r):r:null}function at({offset:e,line:t,column:r},n){let o={offset:e,line:t,column:r};if(n){let i=n.split(/\n|\r\n?|\f/);o.offset+=n.length,o.line+=i.length-1,o.column=i.length===1?o.column+n.length:i.pop().length+1;}return o}var je=function(e,t){let r=Ee("SyntaxReferenceError",e+(t?" `"+t+"`":""));return r.reference=t,r},Ii=function(e,t,r,n){let o=Ee("SyntaxMatchError",e),{css:i,mismatchOffset:s,mismatchLength:u,start:c,end:a}=$s(n,r);return o.rawMessage=e,o.syntax=t?Pe(t):"<generic>",o.css=i,o.mismatchOffset=s,o.mismatchLength=u,o.message=e+`
  21649. syntax: `+o.syntax+`
  21650. value: `+(i||"<empty string>")+`
  21651. --------`+new Array(o.mismatchOffset+1).join("-")+"^",Object.assign(o,c),o.loc={source:r&&r.loc&&r.loc.source||"<unknown>",start:c,end:a},o};var Ot=new Map,qe=new Map,Nt=45,zt=Zs,kr=Js;function Mt(e,t){return t=t||0,e.length-t>=2&&e.charCodeAt(t)===Nt&&e.charCodeAt(t+1)===Nt}function wr(e,t){if(t=t||0,e.length-t>=3&&e.charCodeAt(t)===Nt&&e.charCodeAt(t+1)!==Nt){let r=e.indexOf("-",t+2);if(r!==-1)return e.substring(t,r+1)}return ""}function Zs(e){if(Ot.has(e))return Ot.get(e);let t=e.toLowerCase(),r=Ot.get(t);if(r===void 0){let n=Mt(t,0),o=n?"":wr(t,0);r=Object.freeze({basename:t.substr(o.length),name:t,prefix:o,vendor:o,custom:n});}return Ot.set(e,r),r}function Js(e){if(qe.has(e))return qe.get(e);let t=e,r=e[0];r==="/"?r=e[1]==="/"?"//":"/":r!=="_"&&r!=="*"&&r!=="$"&&r!=="#"&&r!=="+"&&r!=="&"&&(r="");let n=Mt(t,r.length);if(!n&&(t=t.toLowerCase(),qe.has(t))){let u=qe.get(t);return qe.set(e,u),u}let o=n?"":wr(t,r.length),i=t.substr(0,r.length+o.length),s=Object.freeze({basename:t.substr(i.length),name:t.substr(r.length),hack:r,vendor:o,prefix:i,custom:n});return qe.set(e,s),s}var Rt=["initial","inherit","unset","revert","revert-layer"];var lt=43,he=45,vr=110,We=!0,tl=!1;function Cr(e,t){return e!==null&&e.type===9&&e.value.charCodeAt(0)===t}function st(e,t,r){for(;e!==null&&(e.type===13||e.type===25);)e=r(++t);return t}function Se(e,t,r,n){if(!e)return 0;let o=e.value.charCodeAt(t);if(o===lt||o===he){if(r)return 0;t++;}for(;t<e.value.length;t++)if(!B(e.value.charCodeAt(t)))return 0;return n+1}function Sr(e,t,r){let n=!1,o=st(e,t,r);if(e=r(o),e===null)return t;if(e.type!==10)if(Cr(e,lt)||Cr(e,he)){if(n=!0,o=st(r(++o),o,r),e=r(o),e===null||e.type!==10)return 0}else return t;if(!n){let i=e.value.charCodeAt(0);if(i!==lt&&i!==he)return 0}return Se(e,n?0:1,n,o)}function Ar(e,t){let r=0;if(!e)return 0;if(e.type===10)return Se(e,0,tl,r);if(e.type===1&&e.value.charCodeAt(0)===he){if(!de(e.value,1,vr))return 0;switch(e.value.length){case 2:return Sr(t(++r),r,t);case 3:return e.value.charCodeAt(2)!==he?0:(r=st(t(++r),r,t),e=t(r),Se(e,0,We,r));default:return e.value.charCodeAt(2)!==he?0:Se(e,3,We,r)}}else if(e.type===1||Cr(e,lt)&&t(r+1).type===1){if(e.type!==1&&(e=t(++r)),e===null||!de(e.value,0,vr))return 0;switch(e.value.length){case 1:return Sr(t(++r),r,t);case 2:return e.value.charCodeAt(1)!==he?0:(r=st(t(++r),r,t),e=t(r),Se(e,0,We,r));default:return e.value.charCodeAt(1)!==he?0:Se(e,2,We,r)}}else if(e.type===12){let n=e.value.charCodeAt(0),o=n===lt||n===he?1:0,i=o;for(;i<e.value.length&&B(e.value.charCodeAt(i));i++);return i===o||!de(e.value,i,vr)?0:i+1===e.value.length?Sr(t(++r),r,t):e.value.charCodeAt(i+1)!==he?0:i+2===e.value.length?(r=st(t(++r),r,t),e=t(r),Se(e,0,We,r)):Se(e,i+2,We,r)}return 0}var rl=43,Di=45,Oi=63,nl=117;function Tr(e,t){return e!==null&&e.type===9&&e.value.charCodeAt(0)===t}function ol(e,t){return e.value.charCodeAt(0)===t}function ct(e,t,r){let n=0;for(let o=t;o<e.value.length;o++){let i=e.value.charCodeAt(o);if(i===Di&&r&&n!==0)return ct(e,t+n+1,!1),6;if(!ee(i)||++n>6)return 0}return n}function Ft(e,t,r){if(!e)return 0;for(;Tr(r(t),Oi);){if(++e>6)return 0;t++;}return t}function Er(e,t){let r=0;if(e===null||e.type!==1||!de(e.value,0,nl)||(e=t(++r),e===null))return 0;if(Tr(e,rl))return e=t(++r),e===null?0:e.type===1?Ft(ct(e,0,!0),++r,t):Tr(e,Oi)?Ft(1,++r,t):0;if(e.type===10){let n=ct(e,1,!0);return n===0?0:(e=t(++r),e===null?r:e.type===12||e.type===10?!ol(e,Di)||!ct(e,1,!1)?0:r+1:Ft(n,r,t))}return e.type===12?Ft(ct(e,1,!0),++r,t):0}var il=["calc(","-moz-calc(","-webkit-calc("],Lr=new Map([[2,22],[21,22],[19,20],[23,24]]);function le(e,t){return t<e.length?e.charCodeAt(t):0}function Ni(e,t){return ge(e,0,e.length,t)}function zi(e,t){for(let r=0;r<t.length;r++)if(Ni(e,t[r]))return !0;return !1}function Mi(e,t){return t!==e.length-2?!1:le(e,t)===92&&B(le(e,t+1))}function Bt(e,t,r){if(e&&e.type==="Range"){let n=Number(r!==void 0&&r!==t.length?t.substr(0,r):t);if(isNaN(n)||e.min!==null&&n<e.min&&typeof e.min!="string"||e.max!==null&&n>e.max&&typeof e.max!="string")return !0}return !1}function al(e,t){let r=0,n=[],o=0;e:do{switch(e.type){case 24:case 22:case 20:if(e.type!==r)break e;if(r=n.pop(),n.length===0){o++;break e}break;case 2:case 21:case 19:case 23:n.push(r),r=Lr.get(e.type);break}o++;}while(e=t(o));return o}function ie(e){return function(t,r,n){return t===null?0:t.type===2&&zi(t.value,il)?al(t,r):e(t,r,n)}}function N(e){return function(t){return t===null||t.type!==e?0:1}}function sl(e){if(e===null||e.type!==1)return 0;let t=e.value.toLowerCase();return zi(t,Rt)||Ni(t,"default")?0:1}function ll(e){return e===null||e.type!==1||le(e.value,0)!==45||le(e.value,1)!==45?0:1}function cl(e){if(e===null||e.type!==4)return 0;let t=e.value.length;if(t!==4&&t!==5&&t!==7&&t!==9)return 0;for(let r=1;r<t;r++)if(!ee(le(e.value,r)))return 0;return 1}function ul(e){return e===null||e.type!==4||!ze(le(e.value,1),le(e.value,2),le(e.value,3))?0:1}function pl(e,t){if(!e)return 0;let r=0,n=[],o=0;e:do{switch(e.type){case 6:case 8:break e;case 24:case 22:case 20:if(e.type!==r)break e;r=n.pop();break;case 17:if(r===0)break e;break;case 9:if(r===0&&e.value==="!")break e;break;case 2:case 21:case 19:case 23:n.push(r),r=Lr.get(e.type);break}o++;}while(e=t(o));return o}function hl(e,t){if(!e)return 0;let r=0,n=[],o=0;e:do{switch(e.type){case 6:case 8:break e;case 24:case 22:case 20:if(e.type!==r)break e;r=n.pop();break;case 2:case 21:case 19:case 23:n.push(r),r=Lr.get(e.type);break}o++;}while(e=t(o));return o}function ye(e){return e&&(e=new Set(e)),function(t,r,n){if(t===null||t.type!==12)return 0;let o=Te(t.value,0);if(e!==null){let i=t.value.indexOf("\\",o),s=i===-1||!Mi(t.value,i)?t.value.substr(o):t.value.substring(o,i);if(e.has(s.toLowerCase())===!1)return 0}return Bt(n,t.value,o)?0:1}}function ml(e,t,r){return e===null||e.type!==11||Bt(r,e.value,e.value.length-1)?0:1}function Ri(e){return typeof e!="function"&&(e=function(){return 0}),function(t,r,n){return t!==null&&t.type===10&&Number(t.value)===0?1:e(t,r,n)}}function fl(e,t,r){if(e===null)return 0;let n=Te(e.value,0);return !(n===e.value.length)&&!Mi(e.value,n)||Bt(r,e.value,n)?0:1}function dl(e,t,r){if(e===null||e.type!==10)return 0;let n=le(e.value,0)===43||le(e.value,0)===45?1:0;for(;n<e.value.length;n++)if(!B(le(e.value,n)))return 0;return Bt(r,e.value,n)?0:1}var gl={"ident-token":N(1),"function-token":N(2),"at-keyword-token":N(3),"hash-token":N(4),"string-token":N(5),"bad-string-token":N(6),"url-token":N(7),"bad-url-token":N(8),"delim-token":N(9),"number-token":N(10),"percentage-token":N(11),"dimension-token":N(12),"whitespace-token":N(13),"CDO-token":N(14),"CDC-token":N(15),"colon-token":N(16),"semicolon-token":N(17),"comma-token":N(18),"[-token":N(19),"]-token":N(20),"(-token":N(21),")-token":N(22),"{-token":N(23),"}-token":N(24)},bl={string:N(5),ident:N(1),percentage:ie(ml),zero:Ri(),number:ie(fl),integer:ie(dl),"custom-ident":sl,"custom-property-name":ll,"hex-color":cl,"id-selector":ul,"an-plus-b":Ar,urange:Er,"declaration-value":pl,"any-value":hl};function xl(e){let{angle:t,decibel:r,frequency:n,flex:o,length:i,resolution:s,semitones:u,time:c}=e||{};return {dimension:ie(ye(null)),angle:ie(ye(t)),decibel:ie(ye(r)),frequency:ie(ye(n)),flex:ie(ye(o)),length:ie(Ri(ye(i))),resolution:ie(ye(s)),semitones:ie(ye(u)),time:ie(ye(c))}}function Fi(e){return {...gl,...bl,...xl(e)}}var _t={};b(_t,{angle:()=>kl,decibel:()=>Al,flex:()=>Cl,frequency:()=>vl,length:()=>yl,resolution:()=>Sl,semitones:()=>Tl,time:()=>wl});var yl=["cm","mm","q","in","pt","pc","px","em","rem","ex","rex","cap","rcap","ch","rch","ic","ric","lh","rlh","vw","svw","lvw","dvw","vh","svh","lvh","dvh","vi","svi","lvi","dvi","vb","svb","lvb","dvb","vmin","svmin","lvmin","dvmin","vmax","svmax","lvmax","dvmax","cqw","cqh","cqi","cqb","cqmin","cqmax"],kl=["deg","grad","rad","turn"],wl=["s","ms"],vl=["hz","khz"],Sl=["dpi","dpcm","dppx","x"],Cl=["fr"],Al=["db"],Tl=["st"];var $i={};b($i,{SyntaxError:()=>Ut,generate:()=>Pe,parse:()=>Ge,walk:()=>Vt});function Ut(e,t,r){return Object.assign(Ee("SyntaxError",e),{input:t,offset:r,rawMessage:e,message:e+`
  21652. `+t+`
  21653. --`+new Array((r||t.length)+1).join("-")+"^"})}var El=9,Ll=10,Pl=12,Il=13,Dl=32,jt=class{constructor(t){this.str=t,this.pos=0;}charCodeAt(t){return t<this.str.length?this.str.charCodeAt(t):0}charCode(){return this.charCodeAt(this.pos)}nextCharCode(){return this.charCodeAt(this.pos+1)}nextNonWsCode(t){return this.charCodeAt(this.findWsEnd(t))}findWsEnd(t){for(;t<this.str.length;t++){let r=this.str.charCodeAt(t);if(r!==Il&&r!==Ll&&r!==Pl&&r!==Dl&&r!==El)break}return t}substringToPos(t){return this.str.substring(this.pos,this.pos=t)}eat(t){this.charCode()!==t&&this.error("Expect `"+String.fromCharCode(t)+"`"),this.pos++;}peek(){return this.pos<this.str.length?this.str.charAt(this.pos++):""}error(t){throw new Ut(t,this.str,this.pos)}};var Ol=9,Nl=10,zl=12,Ml=13,Rl=32,Yi=33,Dr=35,Bi=38,qt=39,Gi=40,Fl=41,Vi=42,Or=43,Nr=44,_i=45,zr=60,Ki=62,Ir=63,Bl=64,Gt=91,Mr=93,Wt=123,Ui=124,ji=125,qi=8734,ut=new Uint8Array(128).map((e,t)=>/[a-zA-Z0-9\-]/.test(String.fromCharCode(t))?1:0),Wi={" ":1,"&&":2,"||":3,"|":4};function Ht(e){return e.substringToPos(e.findWsEnd(e.pos))}function He(e){let t=e.pos;for(;t<e.str.length;t++){let r=e.str.charCodeAt(t);if(r>=128||ut[r]===0)break}return e.pos===t&&e.error("Expect a keyword"),e.substringToPos(t)}function Yt(e){let t=e.pos;for(;t<e.str.length;t++){let r=e.str.charCodeAt(t);if(r<48||r>57)break}return e.pos===t&&e.error("Expect a number"),e.substringToPos(t)}function _l(e){let t=e.str.indexOf("'",e.pos+1);return t===-1&&(e.pos=e.str.length,e.error("Expect an apostrophe")),e.substringToPos(t+1)}function Hi(e){let t=null,r=null;return e.eat(Wt),t=Yt(e),e.charCode()===Nr?(e.pos++,e.charCode()!==ji&&(r=Yt(e))):r=t,e.eat(ji),{min:Number(t),max:r?Number(r):0}}function Ul(e){let t=null,r=!1;switch(e.charCode()){case Vi:e.pos++,t={min:0,max:0};break;case Or:e.pos++,t={min:1,max:0};break;case Ir:e.pos++,t={min:0,max:1};break;case Dr:e.pos++,r=!0,e.charCode()===Wt?t=Hi(e):e.charCode()===Ir?(e.pos++,t={min:0,max:0}):t={min:1,max:0};break;case Wt:t=Hi(e);break;default:return null}return {type:"Multiplier",comma:r,min:t.min,max:t.max,term:null}}function Ye(e,t){let r=Ul(e);return r!==null?(r.term=t,e.charCode()===Dr&&e.charCodeAt(e.pos-1)===Or?Ye(e,r):r):t}function Pr(e){let t=e.peek();return t===""?null:{type:"Token",value:t}}function jl(e){let t;return e.eat(zr),e.eat(qt),t=He(e),e.eat(qt),e.eat(Ki),Ye(e,{type:"Property",name:t})}function ql(e){let t=null,r=null,n=1;return e.eat(Gt),e.charCode()===_i&&(e.peek(),n=-1),n==-1&&e.charCode()===qi?e.peek():(t=n*Number(Yt(e)),ut[e.charCode()]!==0&&(t+=He(e))),Ht(e),e.eat(Nr),Ht(e),e.charCode()===qi?e.peek():(n=1,e.charCode()===_i&&(e.peek(),n=-1),r=n*Number(Yt(e)),ut[e.charCode()]!==0&&(r+=He(e))),e.eat(Mr),{type:"Range",min:t,max:r}}function Wl(e){let t,r=null;return e.eat(zr),t=He(e),e.charCode()===Gi&&e.nextCharCode()===Fl&&(e.pos+=2,t+="()"),e.charCodeAt(e.findWsEnd(e.pos))===Gt&&(Ht(e),r=ql(e)),e.eat(Ki),Ye(e,{type:"Type",name:t,opts:r})}function Hl(e){let t=He(e);return e.charCode()===Gi?(e.pos++,{type:"Function",name:t}):Ye(e,{type:"Keyword",name:t})}function Yl(e,t){function r(o,i){return {type:"Group",terms:o,combinator:i,disallowEmpty:!1,explicit:!1}}let n;for(t=Object.keys(t).sort((o,i)=>Wi[o]-Wi[i]);t.length>0;){n=t.shift();let o=0,i=0;for(;o<e.length;o++){let s=e[o];s.type==="Combinator"&&(s.value===n?(i===-1&&(i=o-1),e.splice(o,1),o--):(i!==-1&&o-i>1&&(e.splice(i,o-i,r(e.slice(i,o),n)),o=i+1),i=-1));}i!==-1&&t.length&&e.splice(i,o-i,r(e.slice(i,o),n));}return n}function Qi(e){let t=[],r={},n,o=null,i=e.pos;for(;n=Vl(e);)n.type!=="Spaces"&&(n.type==="Combinator"?((o===null||o.type==="Combinator")&&(e.pos=i,e.error("Unexpected combinator")),r[n.value]=!0):o!==null&&o.type!=="Combinator"&&(r[" "]=!0,t.push({type:"Combinator",value:" "})),t.push(n),o=n,i=e.pos);return o!==null&&o.type==="Combinator"&&(e.pos-=i,e.error("Unexpected combinator")),{type:"Group",terms:t,combinator:Yl(t,r)||" ",disallowEmpty:!1,explicit:!1}}function Gl(e){let t;return e.eat(Gt),t=Qi(e),e.eat(Mr),t.explicit=!0,e.charCode()===Yi&&(e.pos++,t.disallowEmpty=!0),t}function Vl(e){let t=e.charCode();if(t<128&&ut[t]===1)return Hl(e);switch(t){case Mr:break;case Gt:return Ye(e,Gl(e));case zr:return e.nextCharCode()===qt?jl(e):Wl(e);case Ui:return {type:"Combinator",value:e.substringToPos(e.pos+(e.nextCharCode()===Ui?2:1))};case Bi:return e.pos++,e.eat(Bi),{type:"Combinator",value:"&&"};case Nr:return e.pos++,{type:"Comma"};case qt:return Ye(e,{type:"String",value:_l(e)});case Rl:case Ol:case Nl:case Ml:case zl:return {type:"Spaces",value:Ht(e)};case Bl:return t=e.nextCharCode(),t<128&&ut[t]===1?(e.pos++,{type:"AtKeyword",name:He(e)}):Pr(e);case Vi:case Or:case Ir:case Dr:case Yi:break;case Wt:if(t=e.nextCharCode(),t<48||t>57)return Pr(e);break;default:return Pr(e)}}function Ge(e){let t=new jt(e),r=Qi(t);return t.pos!==e.length&&t.error("Unexpected input"),r.terms.length===1&&r.terms[0].type==="Group"?r.terms[0]:r}var pt=function(){};function Xi(e){return typeof e=="function"?e:pt}function Vt(e,t,r){function n(s){switch(o.call(r,s),s.type){case"Group":s.terms.forEach(n);break;case"Multiplier":n(s.term);break;case"Type":case"Property":case"Keyword":case"AtKeyword":case"Function":case"String":case"Token":case"Comma":break;default:throw new Error("Unknown type: "+s.type)}i.call(r,s);}let o=pt,i=pt;if(typeof t=="function"?o=t:t&&(o=Xi(t.enter),i=Xi(t.leave)),o===pt&&i===pt)throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function");n(e);}var Kl={decorator(e){let t=[],r=null;return {...e,node(n){let o=r;r=n,e.node.call(this,n),r=o;},emit(n,o,i){t.push({type:o,value:n,node:i?null:r});},result(){return t}}}};function Ql(e){let t=[];return ve(e,(r,n,o)=>t.push({type:r,value:e.slice(n,o),node:null})),t}function Zi(e,t){return typeof e=="string"?Ql(e):t.generate(e,Kl)}var C={type:"Match"},L={type:"Mismatch"},Kt={type:"DisallowEmpty"},Xl=40,$l=41;function Z(e,t,r){return t===C&&r===L||e===C&&t===C&&r===C?e:(e.type==="If"&&e.else===L&&t===C&&(t=e.then,e=e.match),{type:"If",match:e,then:t,else:r})}function ea(e){return e.length>2&&e.charCodeAt(e.length-2)===Xl&&e.charCodeAt(e.length-1)===$l}function Ji(e){return e.type==="Keyword"||e.type==="AtKeyword"||e.type==="Function"||e.type==="Type"&&ea(e.name)}function Rr(e,t,r){switch(e){case" ":{let n=C;for(let o=t.length-1;o>=0;o--){let i=t[o];n=Z(i,n,L);}return n}case"|":{let n=L,o=null;for(let i=t.length-1;i>=0;i--){let s=t[i];if(Ji(s)&&(o===null&&i>0&&Ji(t[i-1])&&(o=Object.create(null),n=Z({type:"Enum",map:o},C,n)),o!==null)){let u=(ea(s.name)?s.name.slice(0,-1):s.name).toLowerCase();if(!(u in o)){o[u]=s;continue}}o=null,n=Z(s,C,n);}return n}case"&&":{if(t.length>5)return {type:"MatchOnce",terms:t,all:!0};let n=L;for(let o=t.length-1;o>=0;o--){let i=t[o],s;t.length>1?s=Rr(e,t.filter(function(u){return u!==i}),!1):s=C,n=Z(i,s,n);}return n}case"||":{if(t.length>5)return {type:"MatchOnce",terms:t,all:!1};let n=r?C:L;for(let o=t.length-1;o>=0;o--){let i=t[o],s;t.length>1?s=Rr(e,t.filter(function(u){return u!==i}),!0):s=C,n=Z(i,s,n);}return n}}}function Zl(e){let t=C,r=Fr(e.term);if(e.max===0)r=Z(r,Kt,L),t=Z(r,null,L),t.then=Z(C,C,t),e.comma&&(t.then.else=Z({type:"Comma",syntax:e},t,L));else for(let n=e.min||1;n<=e.max;n++)e.comma&&t!==C&&(t=Z({type:"Comma",syntax:e},t,L)),t=Z(r,Z(C,C,t),L);if(e.min===0)t=Z(C,C,t);else for(let n=0;n<e.min-1;n++)e.comma&&t!==C&&(t=Z({type:"Comma",syntax:e},t,L)),t=Z(r,t,L);return t}function Fr(e){if(typeof e=="function")return {type:"Generic",fn:e};switch(e.type){case"Group":{let t=Rr(e.combinator,e.terms.map(Fr),!1);return e.disallowEmpty&&(t=Z(t,Kt,L)),t}case"Multiplier":return Zl(e);case"Type":case"Property":return {type:e.type,name:e.name,syntax:e};case"Keyword":return {type:e.type,name:e.name.toLowerCase(),syntax:e};case"AtKeyword":return {type:e.type,name:"@"+e.name.toLowerCase(),syntax:e};case"Function":return {type:e.type,name:e.name.toLowerCase()+"(",syntax:e};case"String":return e.value.length===3?{type:"Token",value:e.value.charAt(1),syntax:e}:{type:e.type,value:e.value.substr(1,e.value.length-2).replace(/\\'/g,"'"),syntax:e};case"Token":return {type:e.type,value:e.value,syntax:e};case"Comma":return {type:e.type,syntax:e};default:throw new Error("Unknown node type:",e.type)}}function Qt(e,t){return typeof e=="string"&&(e=Ge(e)),{type:"MatchGraph",match:Fr(e),syntax:t||null,source:e}}var {hasOwnProperty:ta}=Object.prototype,Jl=0,ec=1,_r=2,aa=3,ra="Match",tc="Mismatch",rc="Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)",na=15e3;function oc(e){let t=null,r=null,n=e;for(;n!==null;)r=n.prev,n.prev=t,t=n,n=r;return t}function Br(e,t){if(e.length!==t.length)return !1;for(let r=0;r<e.length;r++){let n=t.charCodeAt(r),o=e.charCodeAt(r);if(o>=65&&o<=90&&(o=o|32),o!==n)return !1}return !0}function ic(e){return e.type!==9?!1:e.value!=="?"}function oa(e){return e===null?!0:e.type===18||e.type===2||e.type===21||e.type===19||e.type===23||ic(e)}function ia(e){return e===null?!0:e.type===22||e.type===20||e.type===24||e.type===9&&e.value==="/"}function ac(e,t,r){function n(){do R++,S=R<e.length?e[R]:null;while(S!==null&&(S.type===13||S.type===25))}function o(ae){let fe=R+ae;return fe<e.length?e[fe]:null}function i(ae,fe){return {nextState:ae,matchStack:z,syntaxStack:p,thenStack:m,tokenIndex:R,prev:fe}}function s(ae){m={nextState:ae,matchStack:z,syntaxStack:p,prev:m};}function u(ae){f=i(ae,f);}function c(){z={type:ec,syntax:t.syntax,token:S,prev:z},n(),P=null,R>ke&&(ke=R);}function a(){p={syntax:t.syntax,opts:t.syntax.opts||p!==null&&p.opts||null,prev:p},z={type:_r,syntax:t.syntax,token:z.token,prev:z};}function l(){z.type===_r?z=z.prev:z={type:aa,syntax:p.syntax,token:z.token,prev:z},p=p.prev;}let p=null,m=null,f=null,P=null,te=0,X=null,S=null,R=-1,ke=0,z={type:Jl,syntax:null,token:null,prev:null};for(n();X===null&&++te<na;)switch(t.type){case"Match":if(m===null){if(S!==null&&(R!==e.length-1||S.value!=="\\0"&&S.value!=="\\9")){t=L;break}X=ra;break}if(t=m.nextState,t===Kt)if(m.matchStack===z){t=L;break}else t=C;for(;m.syntaxStack!==p;)l();m=m.prev;break;case"Mismatch":if(P!==null&&P!==!1)(f===null||R>f.tokenIndex)&&(f=P,P=!1);else if(f===null){X=tc;break}t=f.nextState,m=f.thenStack,p=f.syntaxStack,z=f.matchStack,R=f.tokenIndex,S=R<e.length?e[R]:null,f=f.prev;break;case"MatchGraph":t=t.match;break;case"If":t.else!==L&&u(t.else),t.then!==C&&s(t.then),t=t.match;break;case"MatchOnce":t={type:"MatchOnceBuffer",syntax:t,index:0,mask:0};break;case"MatchOnceBuffer":{let Q=t.syntax.terms;if(t.index===Q.length){if(t.mask===0||t.syntax.all){t=L;break}t=C;break}if(t.mask===(1<<Q.length)-1){t=C;break}for(;t.index<Q.length;t.index++){let J=1<<t.index;if((t.mask&J)===0){u(t),s({type:"AddMatchOnce",syntax:t.syntax,mask:t.mask|J}),t=Q[t.index++];break}}break}case"AddMatchOnce":t={type:"MatchOnceBuffer",syntax:t.syntax,index:0,mask:t.mask};break;case"Enum":if(S!==null){let Q=S.value.toLowerCase();if(Q.indexOf("\\")!==-1&&(Q=Q.replace(/\\[09].*$/,"")),ta.call(t.map,Q)){t=t.map[Q];break}}t=L;break;case"Generic":{let Q=p!==null?p.opts:null,J=R+Math.floor(t.fn(S,o,Q));if(!isNaN(J)&&J>R){for(;R<J;)c();t=C;}else t=L;break}case"Type":case"Property":{let Q=t.type==="Type"?"types":"properties",J=ta.call(r,Q)?r[Q][t.name]:null;if(!J||!J.match)throw new Error("Bad syntax reference: "+(t.type==="Type"?"<"+t.name+">":"<'"+t.name+"'>"));if(P!==!1&&S!==null&&t.type==="Type"&&(t.name==="custom-ident"&&S.type===1||t.name==="length"&&S.value==="0")){P===null&&(P=i(t,f)),t=L;break}a(),t=J.match;break}case"Keyword":{let Q=t.name;if(S!==null){let J=S.value;if(J.indexOf("\\")!==-1&&(J=J.replace(/\\[09].*$/,"")),Br(J,Q)){c(),t=C;break}}t=L;break}case"AtKeyword":case"Function":if(S!==null&&Br(S.value,t.name)){c(),t=C;break}t=L;break;case"Token":if(S!==null&&S.value===t.value){c(),t=C;break}t=L;break;case"Comma":S!==null&&S.type===18?oa(z.token)?t=L:(c(),t=ia(S)?L:C):t=oa(z.token)||ia(S)?C:L;break;case"String":let ae="",fe=R;for(;fe<e.length&&ae.length<t.value.length;fe++)ae+=e[fe].value;if(Br(ae,t.value)){for(;R<fe;)c();t=C;}else t=L;break;default:throw new Error("Unknown node type: "+t.type)}switch(X){case null:console.warn("[csstree-match] BREAK after "+na+" iterations"),X=rc,z=null;break;case ra:for(;p!==null;)l();break;default:z=null;}return {tokens:e,reason:X,iterations:te,match:z,longestMatch:ke}}function Ur(e,t,r){let n=ac(e,t,r||{});if(n.match===null)return n;let o=n.match,i=n.match={syntax:t.syntax||null,match:[]},s=[i];for(o=oc(o).prev;o!==null;){switch(o.type){case _r:i.match.push(i={syntax:o.syntax,match:[]}),s.push(i);break;case aa:s.pop(),i=s[s.length-1];break;default:i.match.push({syntax:o.syntax||null,token:o.token.value,node:o.token.node});}o=o.prev;}return n}var qr={};b(qr,{getTrace:()=>sa,isKeyword:()=>cc,isProperty:()=>lc,isType:()=>sc});function sa(e){function t(o){return o===null?!1:o.type==="Type"||o.type==="Property"||o.type==="Keyword"}function r(o){if(Array.isArray(o.match)){for(let i=0;i<o.match.length;i++)if(r(o.match[i]))return t(o.syntax)&&n.unshift(o.syntax),!0}else if(o.node===e)return n=t(o.syntax)?[o.syntax]:[],!0;return !1}let n=null;return this.matched!==null&&r(this.matched),n}function sc(e,t){return jr(this,e,r=>r.type==="Type"&&r.name===t)}function lc(e,t){return jr(this,e,r=>r.type==="Property"&&r.name===t)}function cc(e){return jr(this,e,t=>t.type==="Keyword")}function jr(e,t,r){let n=sa.call(e,t);return n===null?!1:n.some(r)}function la(e){return "node"in e?e.node:la(e.match[0])}function ca(e){return "node"in e?e.node:ca(e.match[e.match.length-1])}function Wr(e,t,r,n,o){function i(u){if(u.syntax!==null&&u.syntax.type===n&&u.syntax.name===o){let c=la(u),a=ca(u);e.syntax.walk(t,function(l,p,m){if(l===c){let f=new D;do{if(f.appendData(p.data),p.data===a)break;p=p.next;}while(p!==null);s.push({parent:m,nodes:f});}});}Array.isArray(u.match)&&u.match.forEach(i);}let s=[];return r.matched!==null&&i(r.matched),s}var{hasOwnProperty:ht}=Object.prototype;function Hr(e){return typeof e=="number"&&isFinite(e)&&Math.floor(e)===e&&e>=0}function ua(e){return Boolean(e)&&Hr(e.offset)&&Hr(e.line)&&Hr(e.column)}function uc(e,t){return function(n,o){if(!n||n.constructor!==Object)return o(n,"Type of node should be an Object");for(let i in n){let s=!0;if(ht.call(n,i)!==!1){if(i==="type")n.type!==e&&o(n,"Wrong node type `"+n.type+"`, expected `"+e+"`");else if(i==="loc"){if(n.loc===null)continue;if(n.loc&&n.loc.constructor===Object)if(typeof n.loc.source!="string")i+=".source";else if(!ua(n.loc.start))i+=".start";else if(!ua(n.loc.end))i+=".end";else continue;s=!1;}else if(t.hasOwnProperty(i)){s=!1;for(let u=0;!s&&u<t[i].length;u++){let c=t[i][u];switch(c){case String:s=typeof n[i]=="string";break;case Boolean:s=typeof n[i]=="boolean";break;case null:s=n[i]===null;break;default:typeof c=="string"?s=n[i]&&n[i].type===c:Array.isArray(c)&&(s=n[i]instanceof D);}}}else o(n,"Unknown field `"+i+"` for "+e+" node type");s||o(n,"Bad value for `"+e+"."+i+"`");}}for(let i in t)ht.call(t,i)&&ht.call(n,i)===!1&&o(n,"Field `"+e+"."+i+"` is missed");}}function pc(e,t){let r=t.structure,n={type:String,loc:!0},o={type:'"'+e+'"'};for(let i in r){if(ht.call(r,i)===!1)continue;let s=[],u=n[i]=Array.isArray(r[i])?r[i].slice():[r[i]];for(let c=0;c<u.length;c++){let a=u[c];if(a===String||a===Boolean)s.push(a.name);else if(a===null)s.push("null");else if(typeof a=="string")s.push("<"+a+">");else if(Array.isArray(a))s.push("List");else throw new Error("Wrong value `"+a+"` in `"+e+"."+i+"` structure definition")}o[i]=s.join(" | ");}return {docs:o,check:uc(e,n)}}function pa(e){let t={};if(e.node){for(let r in e.node)if(ht.call(e.node,r)){let n=e.node[r];if(n.structure)t[r]=pc(r,n);else throw new Error("Missed `structure` field in `"+r+"` node type definition")}}return t}var hc=Qt(Rt.join(" | "));function Yr(e,t,r){let n={};for(let o in e)e[o].syntax&&(n[o]=r?e[o].syntax:Pe(e[o].syntax,{compact:t}));return n}function mc(e,t,r){let n={};for(let[o,i]of Object.entries(e))n[o]={prelude:i.prelude&&(r?i.prelude.syntax:Pe(i.prelude.syntax,{compact:t})),descriptors:i.descriptors&&Yr(i.descriptors,t,r)};return n}function fc(e){for(let t=0;t<e.length;t++)if(e[t].value.toLowerCase()==="var(")return !0;return !1}function ce(e,t,r){return {matched:e,iterations:r,error:t,...qr}}function Ve(e,t,r,n){let o=Zi(r,e.syntax),i;return fc(o)?ce(null,new Error("Matching for a tree with var() is not supported")):(n&&(i=Ur(o,e.cssWideKeywordsSyntax,e)),(!n||!i.match)&&(i=Ur(o,t.match,e),!i.match)?ce(null,new Ii(i.reason,t.syntax,r,i),i.iterations):ce(i.match,null,i.iterations))}var Ke=class{constructor(t,r,n){if(this.cssWideKeywordsSyntax=hc,this.syntax=r,this.generic=!1,this.units={..._t},this.atrules=Object.create(null),this.properties=Object.create(null),this.types=Object.create(null),this.structure=n||pa(t),t){if(t.units)for(let o of Object.keys(_t))Array.isArray(t.units[o])&&(this.units[o]=t.units[o]);if(t.types)for(let o in t.types)this.addType_(o,t.types[o]);if(t.generic){this.generic=!0;for(let[o,i]of Object.entries(Fi(this.units)))this.addType_(o,i);}if(t.atrules)for(let o in t.atrules)this.addAtrule_(o,t.atrules[o]);if(t.properties)for(let o in t.properties)this.addProperty_(o,t.properties[o]);}}checkStructure(t){function r(i,s){o.push({node:i,message:s});}let n=this.structure,o=[];return this.syntax.walk(t,function(i){n.hasOwnProperty(i.type)?n[i.type].check(i,r):r(i,"Unknown node type `"+i.type+"`");}),o.length?o:!1}createDescriptor(t,r,n,o=null){let i={type:r,name:n},s={type:r,name:n,parent:o,serializable:typeof t=="string"||t&&typeof t.type=="string",syntax:null,match:null};return typeof t=="function"?s.match=Qt(t,i):(typeof t=="string"?Object.defineProperty(s,"syntax",{get(){return Object.defineProperty(s,"syntax",{value:Ge(t)}),s.syntax}}):s.syntax=t,Object.defineProperty(s,"match",{get(){return Object.defineProperty(s,"match",{value:Qt(s.syntax,i)}),s.match}})),s}addAtrule_(t,r){!r||(this.atrules[t]={type:"Atrule",name:t,prelude:r.prelude?this.createDescriptor(r.prelude,"AtrulePrelude",t):null,descriptors:r.descriptors?Object.keys(r.descriptors).reduce((n,o)=>(n[o]=this.createDescriptor(r.descriptors[o],"AtruleDescriptor",o,t),n),Object.create(null)):null});}addProperty_(t,r){!r||(this.properties[t]=this.createDescriptor(r,"Property",t));}addType_(t,r){!r||(this.types[t]=this.createDescriptor(r,"Type",t));}checkAtruleName(t){if(!this.getAtrule(t))return new je("Unknown at-rule","@"+t)}checkAtrulePrelude(t,r){let n=this.checkAtruleName(t);if(n)return n;let o=this.getAtrule(t);if(!o.prelude&&r)return new SyntaxError("At-rule `@"+t+"` should not contain a prelude");if(o.prelude&&!r&&!Ve(this,o.prelude,"",!1).matched)return new SyntaxError("At-rule `@"+t+"` should contain a prelude")}checkAtruleDescriptorName(t,r){let n=this.checkAtruleName(t);if(n)return n;let o=this.getAtrule(t),i=zt(r);if(!o.descriptors)return new SyntaxError("At-rule `@"+t+"` has no known descriptors");if(!o.descriptors[i.name]&&!o.descriptors[i.basename])return new je("Unknown at-rule descriptor",r)}checkPropertyName(t){if(!this.getProperty(t))return new je("Unknown property",t)}matchAtrulePrelude(t,r){let n=this.checkAtrulePrelude(t,r);if(n)return ce(null,n);let o=this.getAtrule(t);return o.prelude?Ve(this,o.prelude,r||"",!1):ce(null,null)}matchAtruleDescriptor(t,r,n){let o=this.checkAtruleDescriptorName(t,r);if(o)return ce(null,o);let i=this.getAtrule(t),s=zt(r);return Ve(this,i.descriptors[s.name]||i.descriptors[s.basename],n,!1)}matchDeclaration(t){return t.type!=="Declaration"?ce(null,new Error("Not a Declaration node")):this.matchProperty(t.property,t.value)}matchProperty(t,r){if(kr(t).custom)return ce(null,new Error("Lexer matching doesn't applicable for custom properties"));let n=this.checkPropertyName(t);return n?ce(null,n):Ve(this,this.getProperty(t),r,!0)}matchType(t,r){let n=this.getType(t);return n?Ve(this,n,r,!1):ce(null,new je("Unknown type",t))}match(t,r){return typeof t!="string"&&(!t||!t.type)?ce(null,new je("Bad syntax")):((typeof t=="string"||!t.match)&&(t=this.createDescriptor(t,"Type","anonymous")),Ve(this,t,r,!1))}findValueFragments(t,r,n,o){return Wr(this,r,this.matchProperty(t,r),n,o)}findDeclarationValueFragments(t,r,n){return Wr(this,t.value,this.matchDeclaration(t),r,n)}findAllFragments(t,r,n){let o=[];return this.syntax.walk(t,{visit:"Declaration",enter:i=>{o.push.apply(o,this.findDeclarationValueFragments(i,r,n));}}),o}getAtrule(t,r=!0){let n=zt(t);return (n.vendor&&r?this.atrules[n.name]||this.atrules[n.basename]:this.atrules[n.name])||null}getAtrulePrelude(t,r=!0){let n=this.getAtrule(t,r);return n&&n.prelude||null}getAtruleDescriptor(t,r){return this.atrules.hasOwnProperty(t)&&this.atrules.declarators&&this.atrules[t].declarators[r]||null}getProperty(t,r=!0){let n=kr(t);return (n.vendor&&r?this.properties[n.name]||this.properties[n.basename]:this.properties[n.name])||null}getType(t){return hasOwnProperty.call(this.types,t)?this.types[t]:null}validate(){function t(o,i,s,u){if(s.has(i))return s.get(i);s.set(i,!1),u.syntax!==null&&Vt(u.syntax,function(c){if(c.type!=="Type"&&c.type!=="Property")return;let a=c.type==="Type"?o.types:o.properties,l=c.type==="Type"?r:n;(!hasOwnProperty.call(a,c.name)||t(o,c.name,l,a[c.name]))&&s.set(i,!0);},this);}let r=new Map,n=new Map;for(let o in this.types)t(this,o,r,this.types[o]);for(let o in this.properties)t(this,o,n,this.properties[o]);return r=[...r.keys()].filter(o=>r.get(o)),n=[...n.keys()].filter(o=>n.get(o)),r.length||n.length?{types:r,properties:n}:null}dump(t,r){return {generic:this.generic,units:this.units,types:Yr(this.types,!r,t),properties:Yr(this.properties,!r,t),atrules:mc(this.atrules,!r,t)}}toString(){return JSON.stringify(this.dump())}};function Gr(e,t){return typeof t=="string"&&/^\s*\|/.test(t)?typeof e=="string"?e+t:t.replace(/^\s*\|\s*/,""):t||null}function ha(e,t){let r=Object.create(null);for(let[n,o]of Object.entries(e))if(o){r[n]={};for(let i of Object.keys(o))t.includes(i)&&(r[n][i]=o[i]);}return r}function mt(e,t){let r={...e};for(let[n,o]of Object.entries(t))switch(n){case"generic":r[n]=Boolean(o);break;case"units":r[n]={...e[n]};for(let[i,s]of Object.entries(o))r[n][i]=Array.isArray(s)?s:[];break;case"atrules":r[n]={...e[n]};for(let[i,s]of Object.entries(o)){let u=r[n][i]||{},c=r[n][i]={prelude:u.prelude||null,descriptors:{...u.descriptors}};if(!!s){c.prelude=s.prelude?Gr(c.prelude,s.prelude):c.prelude||null;for(let[a,l]of Object.entries(s.descriptors||{}))c.descriptors[a]=l?Gr(c.descriptors[a],l):null;Object.keys(c.descriptors).length||(c.descriptors=null);}}break;case"types":case"properties":r[n]={...e[n]};for(let[i,s]of Object.entries(o))r[n][i]=Gr(r[n][i],s);break;case"scope":r[n]={...e[n]};for(let[i,s]of Object.entries(o))r[n][i]={...r[n][i],...s};break;case"parseContext":r[n]={...e[n],...o};break;case"atrule":case"pseudo":r[n]={...e[n],...ha(o,["parse"])};break;case"node":r[n]={...e[n],...ha(o,["name","structure","parse","generate","walkContext"])};break}return r}function ma(e){let t=$o(e),r=Li(e),n=vi(e),{fromPlainObject:o,toPlainObject:i}=Si(r),s={lexer:null,createLexer:u=>new Ke(u,s,s.lexer.structure),tokenize:ve,parse:t,generate:n,walk:r,find:r.find,findLast:r.findLast,findAll:r.findAll,fromPlainObject:o,toPlainObject:i,fork(u){let c=mt({},e);return ma(typeof u=="function"?u(c,Object.assign):mt(c,u))}};return s.lexer=new Ke({generic:!0,units:e.units,types:e.types,atrules:e.atrules,properties:e.properties,node:e.node},s),s}var Vr=e=>ma(mt({},e));var fa={generic:!0,units:{angle:["deg","grad","rad","turn"],decibel:["db"],flex:["fr"],frequency:["hz","khz"],length:["cm","mm","q","in","pt","pc","px","em","rem","ex","rex","cap","rcap","ch","rch","ic","ric","lh","rlh","vw","svw","lvw","dvw","vh","svh","lvh","dvh","vi","svi","lvi","dvi","vb","svb","lvb","dvb","vmin","svmin","lvmin","dvmin","vmax","svmax","lvmax","dvmax","cqw","cqh","cqi","cqb","cqmin","cqmax"],resolution:["dpi","dpcm","dppx","x"],semitones:["st"],time:["s","ms"]},types:{"abs()":"abs( <calc-sum> )","absolute-size":"xx-small|x-small|small|medium|large|x-large|xx-large|xxx-large","acos()":"acos( <calc-sum> )","alpha-value":"<number>|<percentage>","angle-percentage":"<angle>|<percentage>","angular-color-hint":"<angle-percentage>","angular-color-stop":"<color>&&<color-stop-angle>?","angular-color-stop-list":"[<angular-color-stop> [, <angular-color-hint>]?]# , <angular-color-stop>","animateable-feature":"scroll-position|contents|<custom-ident>","asin()":"asin( <calc-sum> )","atan()":"atan( <calc-sum> )","atan2()":"atan2( <calc-sum> , <calc-sum> )",attachment:"scroll|fixed|local","attr()":"attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )","attr-matcher":"['~'|'|'|'^'|'$'|'*']? '='","attr-modifier":"i|s","attribute-selector":"'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'","auto-repeat":"repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )","auto-track-list":"[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?",axis:"block|inline|vertical|horizontal","baseline-position":"[first|last]? baseline","basic-shape":"<inset()>|<circle()>|<ellipse()>|<polygon()>|<path()>","bg-image":"none|<image>","bg-layer":"<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","bg-position":"[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]","bg-size":"[<length-percentage>|auto]{1,2}|cover|contain","blur()":"blur( <length> )","blend-mode":"normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity",box:"border-box|padding-box|content-box","brightness()":"brightness( <number-percentage> )","calc()":"calc( <calc-sum> )","calc-sum":"<calc-product> [['+'|'-'] <calc-product>]*","calc-product":"<calc-value> ['*' <calc-value>|'/' <number>]*","calc-value":"<number>|<dimension>|<percentage>|<calc-constant>|( <calc-sum> )","calc-constant":"e|pi|infinity|-infinity|NaN","cf-final-image":"<image>|<color>","cf-mixing-image":"<percentage>?&&<image>","circle()":"circle( [<shape-radius>]? [at <position>]? )","clamp()":"clamp( <calc-sum>#{3} )","class-selector":"'.' <ident-token>","clip-source":"<url>",color:"<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hwb()>|<lab()>|<lch()>|<hex-color>|<named-color>|currentcolor|<deprecated-system-color>","color-stop":"<color-stop-length>|<color-stop-angle>","color-stop-angle":"<angle-percentage>{1,2}","color-stop-length":"<length-percentage>{1,2}","color-stop-list":"[<linear-color-stop> [, <linear-color-hint>]?]# , <linear-color-stop>",combinator:"'>'|'+'|'~'|['||']","common-lig-values":"[common-ligatures|no-common-ligatures]","compat-auto":"searchfield|textarea|push-button|slider-horizontal|checkbox|radio|square-button|menulist|listbox|meter|progress-bar|button","composite-style":"clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor","compositing-operator":"add|subtract|intersect|exclude","compound-selector":"[<type-selector>? <subclass-selector>* [<pseudo-element-selector> <pseudo-class-selector>*]*]!","compound-selector-list":"<compound-selector>#","complex-selector":"<compound-selector> [<combinator>? <compound-selector>]*","complex-selector-list":"<complex-selector>#","conic-gradient()":"conic-gradient( [from <angle>]? [at <position>]? , <angular-color-stop-list> )","contextual-alt-values":"[contextual|no-contextual]","content-distribution":"space-between|space-around|space-evenly|stretch","content-list":"[<string>|contents|<image>|<counter>|<quote>|<target>|<leader()>|<attr()>]+","content-position":"center|start|end|flex-start|flex-end","content-replacement":"<image>","contrast()":"contrast( [<number-percentage>] )","cos()":"cos( <calc-sum> )",counter:"<counter()>|<counters()>","counter()":"counter( <counter-name> , <counter-style>? )","counter-name":"<custom-ident>","counter-style":"<counter-style-name>|symbols( )","counter-style-name":"<custom-ident>","counters()":"counters( <counter-name> , <string> , <counter-style>? )","cross-fade()":"cross-fade( <cf-mixing-image> , <cf-final-image>? )","cubic-bezier-timing-function":"ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )","deprecated-system-color":"ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText","discretionary-lig-values":"[discretionary-ligatures|no-discretionary-ligatures]","display-box":"contents|none","display-inside":"flow|flow-root|table|flex|grid|ruby","display-internal":"table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container","display-legacy":"inline-block|inline-list-item|inline-table|inline-flex|inline-grid","display-listitem":"<display-outside>?&&[flow|flow-root]?&&list-item","display-outside":"block|inline|run-in","drop-shadow()":"drop-shadow( <length>{2,3} <color>? )","east-asian-variant-values":"[jis78|jis83|jis90|jis04|simplified|traditional]","east-asian-width-values":"[full-width|proportional-width]","element()":"element( <custom-ident> , [first|start|last|first-except]? )|element( <id-selector> )","ellipse()":"ellipse( [<shape-radius>{2}]? [at <position>]? )","ending-shape":"circle|ellipse","env()":"env( <custom-ident> , <declaration-value>? )","exp()":"exp( <calc-sum> )","explicit-track-list":"[<line-names>? <track-size>]+ <line-names>?","family-name":"<string>|<custom-ident>+","feature-tag-value":"<string> [<integer>|on|off]?","feature-type":"@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation","feature-value-block":"<feature-type> '{' <feature-value-declaration-list> '}'","feature-value-block-list":"<feature-value-block>+","feature-value-declaration":"<custom-ident> : <integer>+ ;","feature-value-declaration-list":"<feature-value-declaration>","feature-value-name":"<custom-ident>","fill-rule":"nonzero|evenodd","filter-function":"<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>","filter-function-list":"[<filter-function>|<url>]+","final-bg-layer":"<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>","fixed-breadth":"<length-percentage>","fixed-repeat":"repeat( [<integer [1,\u221E]>] , [<line-names>? <fixed-size>]+ <line-names>? )","fixed-size":"<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )","font-stretch-absolute":"normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>","font-variant-css21":"[normal|small-caps]","font-weight-absolute":"normal|bold|<number [1,1000]>","frequency-percentage":"<frequency>|<percentage>","general-enclosed":"[<function-token> <any-value> )]|( <ident> <any-value> )","generic-family":"serif|sans-serif|cursive|fantasy|monospace|-apple-system","generic-name":"serif|sans-serif|cursive|fantasy|monospace","geometry-box":"<shape-box>|fill-box|stroke-box|view-box",gradient:"<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<repeating-conic-gradient()>|<-legacy-gradient>","grayscale()":"grayscale( <number-percentage> )","grid-line":"auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]","historical-lig-values":"[historical-ligatures|no-historical-ligatures]","hsl()":"hsl( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )","hsla()":"hsla( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )",hue:"<number>|<angle>","hue-rotate()":"hue-rotate( <angle> )","hwb()":"hwb( [<hue>|none] [<percentage>|none] [<percentage>|none] [/ [<alpha-value>|none]]? )","hypot()":"hypot( <calc-sum># )",image:"<url>|<image()>|<image-set()>|<element()>|<paint()>|<cross-fade()>|<gradient>","image()":"image( <image-tags>? [<image-src>? , <color>?]! )","image-set()":"image-set( <image-set-option># )","image-set-option":"[<image>|<string>] [<resolution>||type( <string> )]","image-src":"<url>|<string>","image-tags":"ltr|rtl","inflexible-breadth":"<length-percentage>|min-content|max-content|auto","inset()":"inset( <length-percentage>{1,4} [round <'border-radius'>]? )","invert()":"invert( <number-percentage> )","keyframes-name":"<custom-ident>|<string>","keyframe-block":"<keyframe-selector># { <declaration-list> }","keyframe-block-list":"<keyframe-block>+","keyframe-selector":"from|to|<percentage>","lab()":"lab( [<percentage>|<number>|none] [<percentage>|<number>|none] [<percentage>|<number>|none] [/ [<alpha-value>|none]]? )","layer()":"layer( <layer-name> )","layer-name":"<ident> ['.' <ident>]*","lch()":"lch( [<percentage>|<number>|none] [<percentage>|<number>|none] [<hue>|none] [/ [<alpha-value>|none]]? )","leader()":"leader( <leader-type> )","leader-type":"dotted|solid|space|<string>","length-percentage":"<length>|<percentage>","line-names":"'[' <custom-ident>* ']'","line-name-list":"[<line-names>|<name-repeat>]+","line-style":"none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset","line-width":"<length>|thin|medium|thick","linear-color-hint":"<length-percentage>","linear-color-stop":"<color> <color-stop-length>?","linear-gradient()":"linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","log()":"log( <calc-sum> , <calc-sum>? )","mask-layer":"<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>","mask-position":"[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?","mask-reference":"none|<image>|<mask-source>","mask-source":"<url>","masking-mode":"alpha|luminance|match-source","matrix()":"matrix( <number>#{6} )","matrix3d()":"matrix3d( <number>#{16} )","max()":"max( <calc-sum># )","media-and":"<media-in-parens> [and <media-in-parens>]+","media-condition":"<media-not>|<media-and>|<media-or>|<media-in-parens>","media-condition-without-or":"<media-not>|<media-and>|<media-in-parens>","media-feature":"( [<mf-plain>|<mf-boolean>|<mf-range>] )","media-in-parens":"( <media-condition> )|<media-feature>|<general-enclosed>","media-not":"not <media-in-parens>","media-or":"<media-in-parens> [or <media-in-parens>]+","media-query":"<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?","media-query-list":"<media-query>#","media-type":"<ident>","mf-boolean":"<mf-name>","mf-name":"<ident>","mf-plain":"<mf-name> : <mf-value>","mf-range":"<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>","mf-value":"<number>|<dimension>|<ident>|<ratio>","min()":"min( <calc-sum># )","minmax()":"minmax( [<length-percentage>|min-content|max-content|auto] , [<length-percentage>|<flex>|min-content|max-content|auto] )","mod()":"mod( <calc-sum> , <calc-sum> )","name-repeat":"repeat( [<integer [1,\u221E]>|auto-fill] , <line-names>+ )","named-color":"transparent|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|<-non-standard-color>","namespace-prefix":"<ident>","ns-prefix":"[<ident-token>|'*']? '|'","number-percentage":"<number>|<percentage>","numeric-figure-values":"[lining-nums|oldstyle-nums]","numeric-fraction-values":"[diagonal-fractions|stacked-fractions]","numeric-spacing-values":"[proportional-nums|tabular-nums]",nth:"<an-plus-b>|even|odd","opacity()":"opacity( [<number-percentage>] )","overflow-position":"unsafe|safe","outline-radius":"<length>|<percentage>","page-body":"<declaration>? [; <page-body>]?|<page-margin-box> <page-body>","page-margin-box":"<page-margin-box-type> '{' <declaration-list> '}'","page-margin-box-type":"@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom","page-selector-list":"[<page-selector>#]?","page-selector":"<pseudo-page>+|<ident> <pseudo-page>*","page-size":"A5|A4|A3|B5|B4|JIS-B5|JIS-B4|letter|legal|ledger","path()":"path( [<fill-rule> ,]? <string> )","paint()":"paint( <ident> , <declaration-value>? )","perspective()":"perspective( [<length [0,\u221E]>|none] )","polygon()":"polygon( <fill-rule>? , [<length-percentage> <length-percentage>]# )",position:"[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]","pow()":"pow( <calc-sum> , <calc-sum> )","pseudo-class-selector":"':' <ident-token>|':' <function-token> <any-value> ')'","pseudo-element-selector":"':' <pseudo-class-selector>","pseudo-page":": [left|right|first|blank]",quote:"open-quote|close-quote|no-open-quote|no-close-quote","radial-gradient()":"radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )",ratio:"<number [0,\u221E]> [/ <number [0,\u221E]>]?","relative-selector":"<combinator>? <complex-selector>","relative-selector-list":"<relative-selector>#","relative-size":"larger|smaller","rem()":"rem( <calc-sum> , <calc-sum> )","repeat-style":"repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}","repeating-conic-gradient()":"repeating-conic-gradient( [from <angle>]? [at <position>]? , <angular-color-stop-list> )","repeating-linear-gradient()":"repeating-linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )","repeating-radial-gradient()":"repeating-radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )","reversed-counter-name":"reversed( <counter-name> )","rgb()":"rgb( <percentage>{3} [/ <alpha-value>]? )|rgb( <number>{3} [/ <alpha-value>]? )|rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )","rgba()":"rgba( <percentage>{3} [/ <alpha-value>]? )|rgba( <number>{3} [/ <alpha-value>]? )|rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )","rotate()":"rotate( [<angle>|<zero>] )","rotate3d()":"rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )","rotateX()":"rotateX( [<angle>|<zero>] )","rotateY()":"rotateY( [<angle>|<zero>] )","rotateZ()":"rotateZ( [<angle>|<zero>] )","round()":"round( <rounding-strategy>? , <calc-sum> , <calc-sum> )","rounding-strategy":"nearest|up|down|to-zero","saturate()":"saturate( <number-percentage> )","scale()":"scale( [<number>|<percentage>]#{1,2} )","scale3d()":"scale3d( [<number>|<percentage>]#{3} )","scaleX()":"scaleX( [<number>|<percentage>] )","scaleY()":"scaleY( [<number>|<percentage>] )","scaleZ()":"scaleZ( [<number>|<percentage>] )",scroller:"root|nearest","self-position":"center|start|end|self-start|self-end|flex-start|flex-end","shape-radius":"<length-percentage>|closest-side|farthest-side","sign()":"sign( <calc-sum> )","skew()":"skew( [<angle>|<zero>] , [<angle>|<zero>]? )","skewX()":"skewX( [<angle>|<zero>] )","skewY()":"skewY( [<angle>|<zero>] )","sepia()":"sepia( <number-percentage> )",shadow:"inset?&&<length>{2,4}&&<color>?","shadow-t":"[<length>{2,3}&&<color>?]",shape:"rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )","shape-box":"<box>|margin-box","side-or-corner":"[left|right]||[top|bottom]","sin()":"sin( <calc-sum> )","single-animation":"<time>||<easing-function>||<time>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]","single-animation-direction":"normal|reverse|alternate|alternate-reverse","single-animation-fill-mode":"none|forwards|backwards|both","single-animation-iteration-count":"infinite|<number>","single-animation-play-state":"running|paused","single-animation-timeline":"auto|none|<timeline-name>|scroll( <axis>? <scroller>? )","single-transition":"[none|<single-transition-property>]||<time>||<easing-function>||<time>","single-transition-property":"all|<custom-ident>",size:"closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}","sqrt()":"sqrt( <calc-sum> )","step-position":"jump-start|jump-end|jump-none|jump-both|start|end","step-timing-function":"step-start|step-end|steps( <integer> [, <step-position>]? )","subclass-selector":"<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>","supports-condition":"not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*","supports-in-parens":"( <supports-condition> )|<supports-feature>|<general-enclosed>","supports-feature":"<supports-decl>|<supports-selector-fn>","supports-decl":"( <declaration> )","supports-selector-fn":"selector( <complex-selector> )",symbol:"<string>|<image>|<custom-ident>","tan()":"tan( <calc-sum> )",target:"<target-counter()>|<target-counters()>|<target-text()>","target-counter()":"target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )","target-counters()":"target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )","target-text()":"target-text( [<string>|<url>] , [content|before|after|first-letter]? )","time-percentage":"<time>|<percentage>","timeline-name":"<custom-ident>|<string>","easing-function":"linear|<cubic-bezier-timing-function>|<step-timing-function>","track-breadth":"<length-percentage>|<flex>|min-content|max-content|auto","track-list":"[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?","track-repeat":"repeat( [<integer [1,\u221E]>] , [<line-names>? <track-size>]+ <line-names>? )","track-size":"<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( <length-percentage> )","transform-function":"<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>","transform-list":"<transform-function>+","translate()":"translate( <length-percentage> , <length-percentage>? )","translate3d()":"translate3d( <length-percentage> , <length-percentage> , <length> )","translateX()":"translateX( <length-percentage> )","translateY()":"translateY( <length-percentage> )","translateZ()":"translateZ( <length> )","type-or-unit":"string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%","type-selector":"<wq-name>|<ns-prefix>? '*'","var()":"var( <custom-property-name> , <declaration-value>? )","viewport-length":"auto|<length-percentage>","visual-box":"content-box|padding-box|border-box","wq-name":"<ns-prefix>? <ident-token>","-legacy-gradient":"<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>","-legacy-linear-gradient":"-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-repeating-linear-gradient":"-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )","-legacy-linear-gradient-arguments":"[<angle>|<side-or-corner>]? , <color-stop-list>","-legacy-radial-gradient":"-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-repeating-radial-gradient":"-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )","-legacy-radial-gradient-arguments":"[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>","-legacy-radial-gradient-size":"closest-side|closest-corner|farthest-side|farthest-corner|contain|cover","-legacy-radial-gradient-shape":"circle|ellipse","-non-standard-font":"-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body","-non-standard-color":"-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text","-non-standard-image-rendering":"optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast","-non-standard-overflow":"-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable","-non-standard-width":"fill-available|min-intrinsic|intrinsic|-moz-available|-moz-fit-content|-moz-min-content|-moz-max-content|-webkit-min-content|-webkit-max-content","-webkit-gradient()":"-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )","-webkit-gradient-color-stop":"from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )","-webkit-gradient-point":"[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]","-webkit-gradient-radius":"<length>|<percentage>","-webkit-gradient-type":"linear|radial","-webkit-mask-box-repeat":"repeat|stretch|round","-webkit-mask-clip-style":"border|border-box|padding|padding-box|content|content-box|text","-ms-filter-function-list":"<-ms-filter-function>+","-ms-filter-function":"<-ms-filter-function-progid>|<-ms-filter-function-legacy>","-ms-filter-function-progid":"'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]","-ms-filter-function-legacy":"<ident-token>|<function-token> <any-value>? )","-ms-filter":"<string>",age:"child|young|old","attr-name":"<wq-name>","attr-fallback":"<any-value>","bg-clip":"<box>|border|text",bottom:"<length>|auto","generic-voice":"[<age>? <gender> <integer>?]",gender:"male|female|neutral",left:"<length>|auto","mask-image":"<mask-reference>#",paint:"none|<color>|<url> [none|<color>]?|context-fill|context-stroke",right:"<length>|auto","single-animation-composition":"replace|add|accumulate","svg-length":"<percentage>|<length>|<number>","svg-writing-mode":"lr-tb|rl-tb|tb-rl|lr|rl|tb",top:"<length>|auto",x:"<number>",y:"<number>",declaration:"<ident-token> : <declaration-value>? ['!' important]?","declaration-list":"[<declaration>? ';']* <declaration>?",url:"url( <string> <url-modifier>* )|<url-token>","url-modifier":"<ident>|<function-token> <any-value> )","number-zero-one":"<number [0,1]>","number-one-or-greater":"<number [1,\u221E]>","-non-standard-display":"-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box"},properties:{"--*":"<declaration-value>","-ms-accelerator":"false|true","-ms-block-progression":"tb|rl|bt|lr","-ms-content-zoom-chaining":"none|chained","-ms-content-zooming":"none|zoom","-ms-content-zoom-limit":"<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>","-ms-content-zoom-limit-max":"<percentage>","-ms-content-zoom-limit-min":"<percentage>","-ms-content-zoom-snap":"<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>","-ms-content-zoom-snap-points":"snapInterval( <percentage> , <percentage> )|snapList( <percentage># )","-ms-content-zoom-snap-type":"none|proximity|mandatory","-ms-filter":"<string>","-ms-flow-from":"[none|<custom-ident>]#","-ms-flow-into":"[none|<custom-ident>]#","-ms-grid-columns":"none|<track-list>|<auto-track-list>","-ms-grid-rows":"none|<track-list>|<auto-track-list>","-ms-high-contrast-adjust":"auto|none","-ms-hyphenate-limit-chars":"auto|<integer>{1,3}","-ms-hyphenate-limit-lines":"no-limit|<integer>","-ms-hyphenate-limit-zone":"<percentage>|<length>","-ms-ime-align":"auto|after","-ms-overflow-style":"auto|none|scrollbar|-ms-autohiding-scrollbar","-ms-scrollbar-3dlight-color":"<color>","-ms-scrollbar-arrow-color":"<color>","-ms-scrollbar-base-color":"<color>","-ms-scrollbar-darkshadow-color":"<color>","-ms-scrollbar-face-color":"<color>","-ms-scrollbar-highlight-color":"<color>","-ms-scrollbar-shadow-color":"<color>","-ms-scrollbar-track-color":"<color>","-ms-scroll-chaining":"chained|none","-ms-scroll-limit":"<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>","-ms-scroll-limit-x-max":"auto|<length>","-ms-scroll-limit-x-min":"<length>","-ms-scroll-limit-y-max":"auto|<length>","-ms-scroll-limit-y-min":"<length>","-ms-scroll-rails":"none|railed","-ms-scroll-snap-points-x":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-points-y":"snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )","-ms-scroll-snap-type":"none|proximity|mandatory","-ms-scroll-snap-x":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>","-ms-scroll-snap-y":"<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>","-ms-scroll-translation":"none|vertical-to-horizontal","-ms-text-autospace":"none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space","-ms-touch-select":"grippers|none","-ms-user-select":"none|element|text","-ms-wrap-flow":"auto|both|start|end|maximum|clear","-ms-wrap-margin":"<length>","-ms-wrap-through":"wrap|none","-moz-appearance":"none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized","-moz-binding":"<url>|none","-moz-border-bottom-colors":"<color>+|none","-moz-border-left-colors":"<color>+|none","-moz-border-right-colors":"<color>+|none","-moz-border-top-colors":"<color>+|none","-moz-context-properties":"none|[fill|fill-opacity|stroke|stroke-opacity]#","-moz-float-edge":"border-box|content-box|margin-box|padding-box","-moz-force-broken-image-icon":"0|1","-moz-image-region":"<shape>|auto","-moz-orient":"inline|block|horizontal|vertical","-moz-outline-radius":"<outline-radius>{1,4} [/ <outline-radius>{1,4}]?","-moz-outline-radius-bottomleft":"<outline-radius>","-moz-outline-radius-bottomright":"<outline-radius>","-moz-outline-radius-topleft":"<outline-radius>","-moz-outline-radius-topright":"<outline-radius>","-moz-stack-sizing":"ignore|stretch-to-fit","-moz-text-blink":"none|blink","-moz-user-focus":"ignore|normal|select-after|select-before|select-menu|select-same|select-all|none","-moz-user-input":"auto|none|enabled|disabled","-moz-user-modify":"read-only|read-write|write-only","-moz-window-dragging":"drag|no-drag","-moz-window-shadow":"default|menu|tooltip|sheet|none","-webkit-appearance":"none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|inner-spin-button|listbox|listitem|media-controls-background|media-controls-fullscreen-background|media-current-time-display|media-enter-fullscreen-button|media-exit-fullscreen-button|media-fullscreen-button|media-mute-button|media-overlay-play-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|media-time-remaining-display|media-toggle-closed-captions-button|media-volume-slider|media-volume-slider-container|media-volume-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|meter|progress-bar|progress-bar-value|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield|-apple-pay-button","-webkit-border-before":"<'border-width'>||<'border-style'>||<color>","-webkit-border-before-color":"<color>","-webkit-border-before-style":"<'border-style'>","-webkit-border-before-width":"<'border-width'>","-webkit-box-reflect":"[above|below|right|left]? <length>? <image>?","-webkit-line-clamp":"none|<integer>","-webkit-mask":"[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<box>|border|padding|content|text]||[<box>|border|padding|content]]#","-webkit-mask-attachment":"<attachment>#","-webkit-mask-clip":"[<box>|border|padding|content|text]#","-webkit-mask-composite":"<composite-style>#","-webkit-mask-image":"<mask-reference>#","-webkit-mask-origin":"[<box>|border|padding|content]#","-webkit-mask-position":"<position>#","-webkit-mask-position-x":"[<length-percentage>|left|center|right]#","-webkit-mask-position-y":"[<length-percentage>|top|center|bottom]#","-webkit-mask-repeat":"<repeat-style>#","-webkit-mask-repeat-x":"repeat|no-repeat|space|round","-webkit-mask-repeat-y":"repeat|no-repeat|space|round","-webkit-mask-size":"<bg-size>#","-webkit-overflow-scrolling":"auto|touch","-webkit-tap-highlight-color":"<color>","-webkit-text-fill-color":"<color>","-webkit-text-stroke":"<length>||<color>","-webkit-text-stroke-color":"<color>","-webkit-text-stroke-width":"<length>","-webkit-touch-callout":"default|none","-webkit-user-modify":"read-only|read-write|read-write-plaintext-only","accent-color":"auto|<color>","align-content":"normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>","align-items":"normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]","align-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>","align-tracks":"[normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>]#",all:"initial|inherit|unset|revert|revert-layer",animation:"<single-animation>#","animation-composition":"<single-animation-composition>#","animation-delay":"<time>#","animation-direction":"<single-animation-direction>#","animation-duration":"<time>#","animation-fill-mode":"<single-animation-fill-mode>#","animation-iteration-count":"<single-animation-iteration-count>#","animation-name":"[none|<keyframes-name>]#","animation-play-state":"<single-animation-play-state>#","animation-timing-function":"<easing-function>#","animation-timeline":"<single-animation-timeline>#",appearance:"none|auto|textfield|menulist-button|<compat-auto>","aspect-ratio":"auto|<ratio>",azimuth:"<angle>|[[left-side|far-left|left|center-left|center|center-right|right|far-right|right-side]||behind]|leftwards|rightwards","backdrop-filter":"none|<filter-function-list>","backface-visibility":"visible|hidden",background:"[<bg-layer> ,]* <final-bg-layer>","background-attachment":"<attachment>#","background-blend-mode":"<blend-mode>#","background-clip":"<bg-clip>#","background-color":"<color>","background-image":"<bg-image>#","background-origin":"<box>#","background-position":"<bg-position>#","background-position-x":"[center|[[left|right|x-start|x-end]? <length-percentage>?]!]#","background-position-y":"[center|[[top|bottom|y-start|y-end]? <length-percentage>?]!]#","background-repeat":"<repeat-style>#","background-size":"<bg-size>#","block-overflow":"clip|ellipsis|<string>","block-size":"<'width'>",border:"<line-width>||<line-style>||<color>","border-block":"<'border-top-width'>||<'border-top-style'>||<color>","border-block-color":"<'border-top-color'>{1,2}","border-block-style":"<'border-top-style'>","border-block-width":"<'border-top-width'>","border-block-end":"<'border-top-width'>||<'border-top-style'>||<color>","border-block-end-color":"<'border-top-color'>","border-block-end-style":"<'border-top-style'>","border-block-end-width":"<'border-top-width'>","border-block-start":"<'border-top-width'>||<'border-top-style'>||<color>","border-block-start-color":"<'border-top-color'>","border-block-start-style":"<'border-top-style'>","border-block-start-width":"<'border-top-width'>","border-bottom":"<line-width>||<line-style>||<color>","border-bottom-color":"<'border-top-color'>","border-bottom-left-radius":"<length-percentage>{1,2}","border-bottom-right-radius":"<length-percentage>{1,2}","border-bottom-style":"<line-style>","border-bottom-width":"<line-width>","border-collapse":"collapse|separate","border-color":"<color>{1,4}","border-end-end-radius":"<length-percentage>{1,2}","border-end-start-radius":"<length-percentage>{1,2}","border-image":"<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>","border-image-outset":"[<length>|<number>]{1,4}","border-image-repeat":"[stretch|repeat|round|space]{1,2}","border-image-slice":"<number-percentage>{1,4}&&fill?","border-image-source":"none|<image>","border-image-width":"[<length-percentage>|<number>|auto]{1,4}","border-inline":"<'border-top-width'>||<'border-top-style'>||<color>","border-inline-end":"<'border-top-width'>||<'border-top-style'>||<color>","border-inline-color":"<'border-top-color'>{1,2}","border-inline-style":"<'border-top-style'>","border-inline-width":"<'border-top-width'>","border-inline-end-color":"<'border-top-color'>","border-inline-end-style":"<'border-top-style'>","border-inline-end-width":"<'border-top-width'>","border-inline-start":"<'border-top-width'>||<'border-top-style'>||<color>","border-inline-start-color":"<'border-top-color'>","border-inline-start-style":"<'border-top-style'>","border-inline-start-width":"<'border-top-width'>","border-left":"<line-width>||<line-style>||<color>","border-left-color":"<color>","border-left-style":"<line-style>","border-left-width":"<line-width>","border-radius":"<length-percentage>{1,4} [/ <length-percentage>{1,4}]?","border-right":"<line-width>||<line-style>||<color>","border-right-color":"<color>","border-right-style":"<line-style>","border-right-width":"<line-width>","border-spacing":"<length> <length>?","border-start-end-radius":"<length-percentage>{1,2}","border-start-start-radius":"<length-percentage>{1,2}","border-style":"<line-style>{1,4}","border-top":"<line-width>||<line-style>||<color>","border-top-color":"<color>","border-top-left-radius":"<length-percentage>{1,2}","border-top-right-radius":"<length-percentage>{1,2}","border-top-style":"<line-style>","border-top-width":"<line-width>","border-width":"<line-width>{1,4}",bottom:"<length>|<percentage>|auto","box-align":"start|center|end|baseline|stretch","box-decoration-break":"slice|clone","box-direction":"normal|reverse|inherit","box-flex":"<number>","box-flex-group":"<integer>","box-lines":"single|multiple","box-ordinal-group":"<integer>","box-orient":"horizontal|vertical|inline-axis|block-axis|inherit","box-pack":"start|center|end|justify","box-shadow":"none|<shadow>#","box-sizing":"content-box|border-box","break-after":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-before":"auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region","break-inside":"auto|avoid|avoid-page|avoid-column|avoid-region","caption-side":"top|bottom|block-start|block-end|inline-start|inline-end",caret:"<'caret-color'>||<'caret-shape'>","caret-color":"auto|<color>","caret-shape":"auto|bar|block|underscore",clear:"none|left|right|both|inline-start|inline-end",clip:"<shape>|auto","clip-path":"<clip-source>|[<basic-shape>||<geometry-box>]|none",color:"<color>","print-color-adjust":"economy|exact","color-scheme":"normal|[light|dark|<custom-ident>]+&&only?","column-count":"<integer>|auto","column-fill":"auto|balance|balance-all","column-gap":"normal|<length-percentage>","column-rule":"<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>","column-rule-color":"<color>","column-rule-style":"<'border-style'>","column-rule-width":"<'border-width'>","column-span":"none|all","column-width":"<length>|auto",columns:"<'column-width'>||<'column-count'>",contain:"none|strict|content|[[size||inline-size]||layout||style||paint]","contain-intrinsic-size":"[none|<length>|auto <length>]{1,2}","contain-intrinsic-block-size":"none|<length>|auto <length>","contain-intrinsic-height":"none|<length>|auto <length>","contain-intrinsic-inline-size":"none|<length>|auto <length>","contain-intrinsic-width":"none|<length>|auto <length>",content:"normal|none|[<content-replacement>|<content-list>] [/ [<string>|<counter>]+]?","content-visibility":"visible|auto|hidden","counter-increment":"[<counter-name> <integer>?]+|none","counter-reset":"[<counter-name> <integer>?|<reversed-counter-name> <integer>?]+|none","counter-set":"[<counter-name> <integer>?]+|none",cursor:"[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]",direction:"ltr|rtl",display:"[<display-outside>||<display-inside>]|<display-listitem>|<display-internal>|<display-box>|<display-legacy>|<-non-standard-display>","empty-cells":"show|hide",filter:"none|<filter-function-list>|<-ms-filter-function-list>",flex:"none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]","flex-basis":"content|<'width'>","flex-direction":"row|row-reverse|column|column-reverse","flex-flow":"<'flex-direction'>||<'flex-wrap'>","flex-grow":"<number>","flex-shrink":"<number>","flex-wrap":"nowrap|wrap|wrap-reverse",float:"left|right|none|inline-start|inline-end",font:"[[<'font-style'>||<font-variant-css21>||<'font-weight'>||<'font-stretch'>]? <'font-size'> [/ <'line-height'>]? <'font-family'>]|caption|icon|menu|message-box|small-caption|status-bar","font-family":"[<family-name>|<generic-family>]#","font-feature-settings":"normal|<feature-tag-value>#","font-kerning":"auto|normal|none","font-language-override":"normal|<string>","font-optical-sizing":"auto|none","font-variation-settings":"normal|[<string> <number>]#","font-size":"<absolute-size>|<relative-size>|<length-percentage>","font-size-adjust":"none|[ex-height|cap-height|ch-width|ic-width|ic-height]? [from-font|<number>]","font-smooth":"auto|never|always|<absolute-size>|<length>","font-stretch":"<font-stretch-absolute>","font-style":"normal|italic|oblique <angle>?","font-synthesis":"none|[weight||style||small-caps]","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-alternates":"normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]","font-variant-caps":"normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps","font-variant-east-asian":"normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]","font-variant-ligatures":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]","font-variant-numeric":"normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]","font-variant-position":"normal|sub|super","font-weight":"<font-weight-absolute>|bolder|lighter","forced-color-adjust":"auto|none",gap:"<'row-gap'> <'column-gap'>?",grid:"<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>","grid-area":"<grid-line> [/ <grid-line>]{0,3}","grid-auto-columns":"<track-size>+","grid-auto-flow":"[row|column]||dense","grid-auto-rows":"<track-size>+","grid-column":"<grid-line> [/ <grid-line>]?","grid-column-end":"<grid-line>","grid-column-gap":"<length-percentage>","grid-column-start":"<grid-line>","grid-gap":"<'grid-row-gap'> <'grid-column-gap'>?","grid-row":"<grid-line> [/ <grid-line>]?","grid-row-end":"<grid-line>","grid-row-gap":"<length-percentage>","grid-row-start":"<grid-line>","grid-template":"none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?","grid-template-areas":"none|<string>+","grid-template-columns":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","grid-template-rows":"none|<track-list>|<auto-track-list>|subgrid <line-name-list>?","hanging-punctuation":"none|[first||[force-end|allow-end]||last]",height:"auto|<length>|<percentage>|min-content|max-content|fit-content|fit-content( <length-percentage> )","hyphenate-character":"auto|<string>",hyphens:"none|manual|auto","image-orientation":"from-image|<angle>|[<angle>? flip]","image-rendering":"auto|crisp-edges|pixelated|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>","image-resolution":"[from-image||<resolution>]&&snap?","ime-mode":"auto|normal|active|inactive|disabled","initial-letter":"normal|[<number> <integer>?]","initial-letter-align":"[auto|alphabetic|hanging|ideographic]","inline-size":"<'width'>","input-security":"auto|none",inset:"<'top'>{1,4}","inset-block":"<'top'>{1,2}","inset-block-end":"<'top'>","inset-block-start":"<'top'>","inset-inline":"<'top'>{1,2}","inset-inline-end":"<'top'>","inset-inline-start":"<'top'>",isolation:"auto|isolate","justify-content":"normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]","justify-items":"normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]","justify-self":"auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]","justify-tracks":"[normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]]#",left:"<length>|<percentage>|auto","letter-spacing":"normal|<length-percentage>","line-break":"auto|loose|normal|strict|anywhere","line-clamp":"none|<integer>","line-height":"normal|<number>|<length>|<percentage>","line-height-step":"<length>","list-style":"<'list-style-type'>||<'list-style-position'>||<'list-style-image'>","list-style-image":"<image>|none","list-style-position":"inside|outside","list-style-type":"<counter-style>|<string>|none",margin:"[<length>|<percentage>|auto]{1,4}","margin-block":"<'margin-left'>{1,2}","margin-block-end":"<'margin-left'>","margin-block-start":"<'margin-left'>","margin-bottom":"<length>|<percentage>|auto","margin-inline":"<'margin-left'>{1,2}","margin-inline-end":"<'margin-left'>","margin-inline-start":"<'margin-left'>","margin-left":"<length>|<percentage>|auto","margin-right":"<length>|<percentage>|auto","margin-top":"<length>|<percentage>|auto","margin-trim":"none|in-flow|all",mask:"<mask-layer>#","mask-border":"<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>","mask-border-mode":"luminance|alpha","mask-border-outset":"[<length>|<number>]{1,4}","mask-border-repeat":"[stretch|repeat|round|space]{1,2}","mask-border-slice":"<number-percentage>{1,4} fill?","mask-border-source":"none|<image>","mask-border-width":"[<length-percentage>|<number>|auto]{1,4}","mask-clip":"[<geometry-box>|no-clip]#","mask-composite":"<compositing-operator>#","mask-image":"<mask-reference>#","mask-mode":"<masking-mode>#","mask-origin":"<geometry-box>#","mask-position":"<position>#","mask-repeat":"<repeat-style>#","mask-size":"<bg-size>#","mask-type":"luminance|alpha","masonry-auto-flow":"[pack|next]||[definite-first|ordered]","math-depth":"auto-add|add( <integer> )|<integer>","math-shift":"normal|compact","math-style":"normal|compact","max-block-size":"<'max-width'>","max-height":"none|<length-percentage>|min-content|max-content|fit-content|fit-content( <length-percentage> )","max-inline-size":"<'max-width'>","max-lines":"none|<integer>","max-width":"none|<length-percentage>|min-content|max-content|fit-content|fit-content( <length-percentage> )|<-non-standard-width>","min-block-size":"<'min-width'>","min-height":"auto|<length>|<percentage>|min-content|max-content|fit-content|fit-content( <length-percentage> )","min-inline-size":"<'min-width'>","min-width":"auto|<length>|<percentage>|min-content|max-content|fit-content|fit-content( <length-percentage> )|<-non-standard-width>","mix-blend-mode":"<blend-mode>|plus-lighter","object-fit":"fill|contain|cover|none|scale-down","object-position":"<position>",offset:"[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?","offset-anchor":"auto|<position>","offset-distance":"<length-percentage>","offset-path":"none|ray( [<angle>&&<size>&&contain?] )|<path()>|<url>|[<basic-shape>||<geometry-box>]","offset-position":"auto|<position>","offset-rotate":"[auto|reverse]||<angle>",opacity:"<alpha-value>",order:"<integer>",orphans:"<integer>",outline:"[<'outline-color'>||<'outline-style'>||<'outline-width'>]","outline-color":"<color>|invert","outline-offset":"<length>","outline-style":"auto|<'border-style'>","outline-width":"<line-width>",overflow:"[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>","overflow-anchor":"auto|none","overflow-block":"visible|hidden|clip|scroll|auto","overflow-clip-box":"padding-box|content-box","overflow-clip-margin":"<visual-box>||<length [0,\u221E]>","overflow-inline":"visible|hidden|clip|scroll|auto","overflow-wrap":"normal|break-word|anywhere","overflow-x":"visible|hidden|clip|scroll|auto","overflow-y":"visible|hidden|clip|scroll|auto","overscroll-behavior":"[contain|none|auto]{1,2}","overscroll-behavior-block":"contain|none|auto","overscroll-behavior-inline":"contain|none|auto","overscroll-behavior-x":"contain|none|auto","overscroll-behavior-y":"contain|none|auto",padding:"[<length>|<percentage>]{1,4}","padding-block":"<'padding-left'>{1,2}","padding-block-end":"<'padding-left'>","padding-block-start":"<'padding-left'>","padding-bottom":"<length>|<percentage>","padding-inline":"<'padding-left'>{1,2}","padding-inline-end":"<'padding-left'>","padding-inline-start":"<'padding-left'>","padding-left":"<length>|<percentage>","padding-right":"<length>|<percentage>","padding-top":"<length>|<percentage>","page-break-after":"auto|always|avoid|left|right|recto|verso","page-break-before":"auto|always|avoid|left|right|recto|verso","page-break-inside":"auto|avoid","paint-order":"normal|[fill||stroke||markers]",perspective:"none|<length>","perspective-origin":"<position>","place-content":"<'align-content'> <'justify-content'>?","place-items":"<'align-items'> <'justify-items'>?","place-self":"<'align-self'> <'justify-self'>?","pointer-events":"auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit",position:"static|relative|absolute|sticky|fixed|-webkit-sticky",quotes:"none|auto|[<string> <string>]+",resize:"none|both|horizontal|vertical|block|inline",right:"<length>|<percentage>|auto",rotate:"none|<angle>|[x|y|z|<number>{3}]&&<angle>","row-gap":"normal|<length-percentage>","ruby-align":"start|center|space-between|space-around","ruby-merge":"separate|collapse|auto","ruby-position":"[alternate||[over|under]]|inter-character",scale:"none|<number>{1,3}","scrollbar-color":"auto|<color>{2}","scrollbar-gutter":"auto|stable&&both-edges?","scrollbar-width":"auto|thin|none","scroll-behavior":"auto|smooth","scroll-margin":"<length>{1,4}","scroll-margin-block":"<length>{1,2}","scroll-margin-block-start":"<length>","scroll-margin-block-end":"<length>","scroll-margin-bottom":"<length>","scroll-margin-inline":"<length>{1,2}","scroll-margin-inline-start":"<length>","scroll-margin-inline-end":"<length>","scroll-margin-left":"<length>","scroll-margin-right":"<length>","scroll-margin-top":"<length>","scroll-padding":"[auto|<length-percentage>]{1,4}","scroll-padding-block":"[auto|<length-percentage>]{1,2}","scroll-padding-block-start":"auto|<length-percentage>","scroll-padding-block-end":"auto|<length-percentage>","scroll-padding-bottom":"auto|<length-percentage>","scroll-padding-inline":"[auto|<length-percentage>]{1,2}","scroll-padding-inline-start":"auto|<length-percentage>","scroll-padding-inline-end":"auto|<length-percentage>","scroll-padding-left":"auto|<length-percentage>","scroll-padding-right":"auto|<length-percentage>","scroll-padding-top":"auto|<length-percentage>","scroll-snap-align":"[none|start|end|center]{1,2}","scroll-snap-coordinate":"none|<position>#","scroll-snap-destination":"<position>","scroll-snap-points-x":"none|repeat( <length-percentage> )","scroll-snap-points-y":"none|repeat( <length-percentage> )","scroll-snap-stop":"normal|always","scroll-snap-type":"none|[x|y|block|inline|both] [mandatory|proximity]?","scroll-snap-type-x":"none|mandatory|proximity","scroll-snap-type-y":"none|mandatory|proximity","scroll-timeline":"[<'scroll-timeline-name'>||<'scroll-timeline-axis'>]#","scroll-timeline-axis":"[block|inline|vertical|horizontal]#","scroll-timeline-name":"none|<custom-ident>#","shape-image-threshold":"<alpha-value>","shape-margin":"<length-percentage>","shape-outside":"none|[<shape-box>||<basic-shape>]|<image>","tab-size":"<integer>|<length>","table-layout":"auto|fixed","text-align":"start|end|left|right|center|justify|match-parent","text-align-last":"auto|start|end|left|right|center|justify","text-combine-upright":"none|all|[digits <integer>?]","text-decoration":"<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>||<'text-decoration-thickness'>","text-decoration-color":"<color>","text-decoration-line":"none|[underline||overline||line-through||blink]|spelling-error|grammar-error","text-decoration-skip":"none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]","text-decoration-skip-ink":"auto|all|none","text-decoration-style":"solid|double|dotted|dashed|wavy","text-decoration-thickness":"auto|from-font|<length>|<percentage>","text-emphasis":"<'text-emphasis-style'>||<'text-emphasis-color'>","text-emphasis-color":"<color>","text-emphasis-position":"[over|under]&&[right|left]","text-emphasis-style":"none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>","text-indent":"<length-percentage>&&hanging?&&each-line?","text-justify":"auto|inter-character|inter-word|none","text-orientation":"mixed|upright|sideways","text-overflow":"[clip|ellipsis|<string>]{1,2}","text-rendering":"auto|optimizeSpeed|optimizeLegibility|geometricPrecision","text-shadow":"none|<shadow-t>#","text-size-adjust":"none|auto|<percentage>","text-transform":"none|capitalize|uppercase|lowercase|full-width|full-size-kana","text-underline-offset":"auto|<length>|<percentage>","text-underline-position":"auto|from-font|[under||[left|right]]",top:"<length>|<percentage>|auto","touch-action":"auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation",transform:"none|<transform-list>","transform-box":"content-box|border-box|fill-box|stroke-box|view-box","transform-origin":"[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?","transform-style":"flat|preserve-3d",transition:"<single-transition>#","transition-delay":"<time>#","transition-duration":"<time>#","transition-property":"none|<single-transition-property>#","transition-timing-function":"<easing-function>#",translate:"none|<length-percentage> [<length-percentage> <length>?]?","unicode-bidi":"normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate|-webkit-isolate-override|-webkit-plaintext","user-select":"auto|text|none|contain|all","vertical-align":"baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>",visibility:"visible|hidden|collapse","white-space":"normal|pre|nowrap|pre-wrap|pre-line|break-spaces",widows:"<integer>",width:"auto|<length>|<percentage>|min-content|max-content|fit-content|fit-content( <length-percentage> )|fill|stretch|intrinsic|-moz-max-content|-webkit-max-content|-moz-fit-content|-webkit-fit-content","will-change":"auto|<animateable-feature>#","word-break":"normal|break-all|keep-all|break-word","word-spacing":"normal|<length>","word-wrap":"normal|break-word","writing-mode":"horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>","z-index":"auto|<integer>",zoom:"normal|reset|<number>|<percentage>","-moz-background-clip":"padding|border","-moz-border-radius-bottomleft":"<'border-bottom-left-radius'>","-moz-border-radius-bottomright":"<'border-bottom-right-radius'>","-moz-border-radius-topleft":"<'border-top-left-radius'>","-moz-border-radius-topright":"<'border-bottom-right-radius'>","-moz-control-character-visibility":"visible|hidden","-moz-osx-font-smoothing":"auto|grayscale","-moz-user-select":"none|text|all|-moz-none","-ms-flex-align":"start|end|center|baseline|stretch","-ms-flex-item-align":"auto|start|end|center|baseline|stretch","-ms-flex-line-pack":"start|end|center|justify|distribute|stretch","-ms-flex-negative":"<'flex-shrink'>","-ms-flex-pack":"start|end|center|justify|distribute","-ms-flex-order":"<integer>","-ms-flex-positive":"<'flex-grow'>","-ms-flex-preferred-size":"<'flex-basis'>","-ms-interpolation-mode":"nearest-neighbor|bicubic","-ms-grid-column-align":"start|end|center|stretch","-ms-grid-row-align":"start|end|center|stretch","-ms-hyphenate-limit-last":"none|always|column|page|spread","-webkit-background-clip":"[<box>|border|padding|content|text]#","-webkit-column-break-after":"always|auto|avoid","-webkit-column-break-before":"always|auto|avoid","-webkit-column-break-inside":"always|auto|avoid","-webkit-font-smoothing":"auto|none|antialiased|subpixel-antialiased","-webkit-mask-box-image":"[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?","-webkit-print-color-adjust":"economy|exact","-webkit-text-security":"none|circle|disc|square","-webkit-user-drag":"none|element|auto","-webkit-user-select":"auto|none|text|all","alignment-baseline":"auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical","baseline-shift":"baseline|sub|super|<svg-length>",behavior:"<url>+","clip-rule":"nonzero|evenodd",cue:"<'cue-before'> <'cue-after'>?","cue-after":"<url> <decibel>?|none","cue-before":"<url> <decibel>?|none","dominant-baseline":"auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge",fill:"<paint>","fill-opacity":"<number-zero-one>","fill-rule":"nonzero|evenodd","glyph-orientation-horizontal":"<angle>","glyph-orientation-vertical":"<angle>",kerning:"auto|<svg-length>",marker:"none|<url>","marker-end":"none|<url>","marker-mid":"none|<url>","marker-start":"none|<url>",pause:"<'pause-before'> <'pause-after'>?","pause-after":"<time>|none|x-weak|weak|medium|strong|x-strong","pause-before":"<time>|none|x-weak|weak|medium|strong|x-strong",rest:"<'rest-before'> <'rest-after'>?","rest-after":"<time>|none|x-weak|weak|medium|strong|x-strong","rest-before":"<time>|none|x-weak|weak|medium|strong|x-strong","shape-rendering":"auto|optimizeSpeed|crispEdges|geometricPrecision",src:"[<url> [format( <string># )]?|local( <family-name> )]#",speak:"auto|none|normal","speak-as":"normal|spell-out||digits||[literal-punctuation|no-punctuation]",stroke:"<paint>","stroke-dasharray":"none|[<svg-length>+]#","stroke-dashoffset":"<svg-length>","stroke-linecap":"butt|round|square","stroke-linejoin":"miter|round|bevel","stroke-miterlimit":"<number-one-or-greater>","stroke-opacity":"<number-zero-one>","stroke-width":"<svg-length>","text-anchor":"start|middle|end","unicode-range":"<urange>#","voice-balance":"<number>|left|center|right|leftwards|rightwards","voice-duration":"auto|<time>","voice-family":"[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve","voice-pitch":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-range":"<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]","voice-rate":"[normal|x-slow|slow|medium|fast|x-fast]||<percentage>","voice-stress":"normal|strong|moderate|none|reduced","voice-volume":"silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]"},atrules:{charset:{prelude:"<string>",descriptors:null},"counter-style":{prelude:"<counter-style-name>",descriptors:{"additive-symbols":"[<integer>&&<symbol>]#",fallback:"<counter-style-name>",negative:"<symbol> <symbol>?",pad:"<integer>&&<symbol>",prefix:"<symbol>",range:"[[<integer>|infinite]{2}]#|auto","speak-as":"auto|bullets|numbers|words|spell-out|<counter-style-name>",suffix:"<symbol>",symbols:"<symbol>+",system:"cyclic|numeric|alphabetic|symbolic|additive|[fixed <integer>?]|[extends <counter-style-name>]"}},document:{prelude:"[<url>|url-prefix( <string> )|domain( <string> )|media-document( <string> )|regexp( <string> )]#",descriptors:null},"font-face":{prelude:null,descriptors:{"ascent-override":"normal|<percentage>","descent-override":"normal|<percentage>","font-display":"[auto|block|swap|fallback|optional]","font-family":"<family-name>","font-feature-settings":"normal|<feature-tag-value>#","font-variation-settings":"normal|[<string> <number>]#","font-stretch":"<font-stretch-absolute>{1,2}","font-style":"normal|italic|oblique <angle>{0,2}","font-weight":"<font-weight-absolute>{1,2}","font-variant":"normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]","line-gap-override":"normal|<percentage>","size-adjust":"<percentage>",src:"[<url> [format( <string># )]?|local( <family-name> )]#","unicode-range":"<urange>#"}},"font-feature-values":{prelude:"<family-name>#",descriptors:null},import:{prelude:"[<string>|<url>] [layer|layer( <layer-name> )]? [supports( [<supports-condition>|<declaration>] )]? <media-query-list>?",descriptors:null},keyframes:{prelude:"<keyframes-name>",descriptors:null},layer:{prelude:"[<layer-name>#|<layer-name>?]",descriptors:null},media:{prelude:"<media-query-list>",descriptors:null},namespace:{prelude:"<namespace-prefix>? [<string>|<url>]",descriptors:null},page:{prelude:"<page-selector-list>",descriptors:{bleed:"auto|<length>",marks:"none|[crop||cross]",size:"<length>{1,2}|auto|[<page-size>||[portrait|landscape]]"}},property:{prelude:"<custom-property-name>",descriptors:{syntax:"<string>",inherits:"true|false","initial-value":"<string>"}},"scroll-timeline":{prelude:"<timeline-name>",descriptors:null},supports:{prelude:"<supports-condition>",descriptors:null},viewport:{prelude:null,descriptors:{height:"<viewport-length>{1,2}","max-height":"<viewport-length>","max-width":"<viewport-length>","max-zoom":"auto|<number>|<percentage>","min-height":"<viewport-length>","min-width":"<viewport-length>","min-zoom":"auto|<number>|<percentage>",orientation:"auto|portrait|landscape","user-zoom":"zoom|fixed","viewport-fit":"auto|contain|cover",width:"<viewport-length>{1,2}",zoom:"auto|<number>|<percentage>"}},nest:{prelude:"<complex-selector-list>",descriptors:null}}};var gt={};b(gt,{AnPlusB:()=>Xr,Atrule:()=>Zr,AtrulePrelude:()=>en,AttributeSelector:()=>nn,Block:()=>an,Brackets:()=>ln,CDC:()=>un,CDO:()=>hn,ClassSelector:()=>fn,Combinator:()=>gn,Comment:()=>xn,Declaration:()=>kn,DeclarationList:()=>Sn,Dimension:()=>An,Function:()=>En,Hash:()=>Pn,IdSelector:()=>Nn,Identifier:()=>Dn,MediaFeature:()=>Mn,MediaQuery:()=>Fn,MediaQueryList:()=>_n,NestingSelector:()=>jn,Nth:()=>Wn,Number:()=>Yn,Operator:()=>Vn,Parentheses:()=>Qn,Percentage:()=>$n,PseudoClassSelector:()=>Jn,PseudoElementSelector:()=>to,Ratio:()=>no,Raw:()=>io,Rule:()=>so,Selector:()=>co,SelectorList:()=>po,String:()=>bo,StyleSheet:()=>yo,TypeSelector:()=>vo,UnicodeRange:()=>Ao,Url:()=>Do,Value:()=>No,WhiteSpace:()=>Mo});var Xr={};b(Xr,{generate:()=>xc,name:()=>gc,parse:()=>Qr,structure:()=>bc});var me=43,re=45,Xt=110,Ie=!0,dc=!1;function $t(e,t){let r=this.tokenStart+e,n=this.charCodeAt(r);for((n===me||n===re)&&(t&&this.error("Number sign is not allowed"),r++);r<this.tokenEnd;r++)B(this.charCodeAt(r))||this.error("Integer is expected",r);}function Qe(e){return $t.call(this,0,e)}function Ce(e,t){if(!this.cmpChar(this.tokenStart+e,t)){let r="";switch(t){case Xt:r="N is expected";break;case re:r="HyphenMinus is expected";break}this.error(r,this.tokenStart+e);}}function Kr(){let e=0,t=0,r=this.tokenType;for(;r===13||r===25;)r=this.lookupType(++e);if(r!==10)if(this.isDelim(me,e)||this.isDelim(re,e)){t=this.isDelim(me,e)?me:re;do r=this.lookupType(++e);while(r===13||r===25);r!==10&&(this.skip(e),Qe.call(this,Ie));}else return null;return e>0&&this.skip(e),t===0&&(r=this.charCodeAt(this.tokenStart),r!==me&&r!==re&&this.error("Number sign is expected")),Qe.call(this,t!==0),t===re?"-"+this.consume(10):this.consume(10)}var gc="AnPlusB",bc={a:[String,null],b:[String,null]};function Qr(){let e=this.tokenStart,t=null,r=null;if(this.tokenType===10)Qe.call(this,dc),r=this.consume(10);else if(this.tokenType===1&&this.cmpChar(this.tokenStart,re))switch(t="-1",Ce.call(this,1,Xt),this.tokenEnd-this.tokenStart){case 2:this.next(),r=Kr.call(this);break;case 3:Ce.call(this,2,re),this.next(),this.skipSC(),Qe.call(this,Ie),r="-"+this.consume(10);break;default:Ce.call(this,2,re),$t.call(this,3,Ie),this.next(),r=this.substrToCursor(e+2);}else if(this.tokenType===1||this.isDelim(me)&&this.lookupType(1)===1){let n=0;switch(t="1",this.isDelim(me)&&(n=1,this.next()),Ce.call(this,0,Xt),this.tokenEnd-this.tokenStart){case 1:this.next(),r=Kr.call(this);break;case 2:Ce.call(this,1,re),this.next(),this.skipSC(),Qe.call(this,Ie),r="-"+this.consume(10);break;default:Ce.call(this,1,re),$t.call(this,2,Ie),this.next(),r=this.substrToCursor(e+n+1);}}else if(this.tokenType===12){let n=this.charCodeAt(this.tokenStart),o=n===me||n===re,i=this.tokenStart+o;for(;i<this.tokenEnd&&B(this.charCodeAt(i));i++);i===this.tokenStart+o&&this.error("Integer is expected",this.tokenStart+o),Ce.call(this,i-this.tokenStart,Xt),t=this.substring(e,i),i+1===this.tokenEnd?(this.next(),r=Kr.call(this)):(Ce.call(this,i-this.tokenStart+1,re),i+2===this.tokenEnd?(this.next(),this.skipSC(),Qe.call(this,Ie),r="-"+this.consume(10)):($t.call(this,i-this.tokenStart+2,Ie),this.next(),r=this.substrToCursor(i+1)));}else this.error();return t!==null&&t.charCodeAt(0)===me&&(t=t.substr(1)),r!==null&&r.charCodeAt(0)===me&&(r=r.substr(1)),{type:"AnPlusB",loc:this.getLocation(e,this.tokenStart),a:t,b:r}}function xc(e){if(e.a){let t=e.a==="+1"&&"n"||e.a==="1"&&"n"||e.a==="-1"&&"-n"||e.a+"n";if(e.b){let r=e.b[0]==="-"||e.b[0]==="+"?e.b:"+"+e.b;this.tokenize(t+r);}else this.tokenize(t);}else this.tokenize(e.b);}var Zr={};b(Zr,{generate:()=>Sc,name:()=>kc,parse:()=>$r,structure:()=>vc,walkContext:()=>wc});function da(e){return this.Raw(e,this.consumeUntilLeftCurlyBracketOrSemicolon,!0)}function yc(){for(let e=1,t;t=this.lookupType(e);e++){if(t===24)return !0;if(t===23||t===3)return !1}return !1}var kc="Atrule",wc="atrule",vc={name:String,prelude:["AtrulePrelude","Raw",null],block:["Block",null]};function $r(e=!1){let t=this.tokenStart,r,n,o=null,i=null;switch(this.eat(3),r=this.substrToCursor(t+1),n=r.toLowerCase(),this.skipSC(),this.eof===!1&&this.tokenType!==23&&this.tokenType!==17&&(this.parseAtrulePrelude?o=this.parseWithFallback(this.AtrulePrelude.bind(this,r,e),da):o=da.call(this,this.tokenIndex),this.skipSC()),this.tokenType){case 17:this.next();break;case 23:hasOwnProperty.call(this.atrule,n)&&typeof this.atrule[n].block=="function"?i=this.atrule[n].block.call(this,e):i=this.Block(yc.call(this));break}return {type:"Atrule",loc:this.getLocation(t,this.tokenStart),name:r,prelude:o,block:i}}function Sc(e){this.token(3,"@"+e.name),e.prelude!==null&&this.node(e.prelude),e.block?this.node(e.block):this.token(17,";");}var en={};b(en,{generate:()=>Ec,name:()=>Cc,parse:()=>Jr,structure:()=>Tc,walkContext:()=>Ac});var Cc="AtrulePrelude",Ac="atrulePrelude",Tc={children:[[]]};function Jr(e){let t=null;return e!==null&&(e=e.toLowerCase()),this.skipSC(),hasOwnProperty.call(this.atrule,e)&&typeof this.atrule[e].prelude=="function"?t=this.atrule[e].prelude.call(this):t=this.readSequence(this.scope.AtrulePrelude),this.skipSC(),this.eof!==!0&&this.tokenType!==23&&this.tokenType!==17&&this.error("Semicolon or block is expected"),{type:"AtrulePrelude",loc:this.getLocationFromList(t),children:t}}function Ec(e){this.children(e);}var nn={};b(nn,{generate:()=>Mc,name:()=>Nc,parse:()=>rn,structure:()=>zc});var Lc=36,ga=42,Zt=61,Pc=94,tn=124,Ic=126;function Dc(){this.eof&&this.error("Unexpected end of input");let e=this.tokenStart,t=!1;return this.isDelim(ga)?(t=!0,this.next()):this.isDelim(tn)||this.eat(1),this.isDelim(tn)?this.charCodeAt(this.tokenStart+1)!==Zt?(this.next(),this.eat(1)):t&&this.error("Identifier is expected",this.tokenEnd):t&&this.error("Vertical line is expected"),{type:"Identifier",loc:this.getLocation(e,this.tokenStart),name:this.substrToCursor(e)}}function Oc(){let e=this.tokenStart,t=this.charCodeAt(e);return t!==Zt&&t!==Ic&&t!==Pc&&t!==Lc&&t!==ga&&t!==tn&&this.error("Attribute selector (=, ~=, ^=, $=, *=, |=) is expected"),this.next(),t!==Zt&&(this.isDelim(Zt)||this.error("Equal sign is expected"),this.next()),this.substrToCursor(e)}var Nc="AttributeSelector",zc={name:"Identifier",matcher:[String,null],value:["String","Identifier",null],flags:[String,null]};function rn(){let e=this.tokenStart,t,r=null,n=null,o=null;return this.eat(19),this.skipSC(),t=Dc.call(this),this.skipSC(),this.tokenType!==20&&(this.tokenType!==1&&(r=Oc.call(this),this.skipSC(),n=this.tokenType===5?this.String():this.Identifier(),this.skipSC()),this.tokenType===1&&(o=this.consume(1),this.skipSC())),this.eat(20),{type:"AttributeSelector",loc:this.getLocation(e,this.tokenStart),name:t,matcher:r,value:n,flags:o}}function Mc(e){this.token(9,"["),this.node(e.name),e.matcher!==null&&(this.tokenize(e.matcher),this.node(e.value)),e.flags!==null&&this.token(1,e.flags),this.token(9,"]");}var an={};b(an,{generate:()=>jc,name:()=>Bc,parse:()=>on,structure:()=>Uc,walkContext:()=>_c});var Rc=38;function ya(e){return this.Raw(e,null,!0)}function ba(){return this.parseWithFallback(this.Rule,ya)}function xa(e){return this.Raw(e,this.consumeUntilSemicolonIncluded,!0)}function Fc(){if(this.tokenType===17)return xa.call(this,this.tokenIndex);let e=this.parseWithFallback(this.Declaration,xa);return this.tokenType===17&&this.next(),e}var Bc="Block",_c="block",Uc={children:[["Atrule","Rule","Declaration"]]};function on(e){let t=e?Fc:ba,r=this.tokenStart,n=this.createList();this.eat(23);e:for(;!this.eof;)switch(this.tokenType){case 24:break e;case 13:case 25:this.next();break;case 3:n.push(this.parseWithFallback(this.Atrule.bind(this,e),ya));break;default:e&&this.isDelim(Rc)?n.push(ba.call(this)):n.push(t.call(this));}return this.eof||this.eat(24),{type:"Block",loc:this.getLocation(r,this.tokenStart),children:n}}function jc(e){this.token(23,"{"),this.children(e,t=>{t.type==="Declaration"&&this.token(17,";");}),this.token(24,"}");}var ln={};b(ln,{generate:()=>Hc,name:()=>qc,parse:()=>sn,structure:()=>Wc});var qc="Brackets",Wc={children:[[]]};function sn(e,t){let r=this.tokenStart,n=null;return this.eat(19),n=e.call(this,t),this.eof||this.eat(20),{type:"Brackets",loc:this.getLocation(r,this.tokenStart),children:n}}function Hc(e){this.token(9,"["),this.children(e),this.token(9,"]");}var un={};b(un,{generate:()=>Vc,name:()=>Yc,parse:()=>cn,structure:()=>Gc});var Yc="CDC",Gc=[];function cn(){let e=this.tokenStart;return this.eat(15),{type:"CDC",loc:this.getLocation(e,this.tokenStart)}}function Vc(){this.token(15,"-->");}var hn={};b(hn,{generate:()=>Xc,name:()=>Kc,parse:()=>pn,structure:()=>Qc});var Kc="CDO",Qc=[];function pn(){let e=this.tokenStart;return this.eat(14),{type:"CDO",loc:this.getLocation(e,this.tokenStart)}}function Xc(){this.token(14,"<!--");}var fn={};b(fn,{generate:()=>eu,name:()=>Zc,parse:()=>mn,structure:()=>Jc});var $c=46,Zc="ClassSelector",Jc={name:String};function mn(){return this.eatDelim($c),{type:"ClassSelector",loc:this.getLocation(this.tokenStart-1,this.tokenEnd),name:this.consume(1)}}function eu(e){this.token(9,"."),this.token(1,e.name);}var gn={};b(gn,{generate:()=>au,name:()=>ou,parse:()=>dn,structure:()=>iu});var tu=43,ka=47,ru=62,nu=126,ou="Combinator",iu={name:String};function dn(){let e=this.tokenStart,t;switch(this.tokenType){case 13:t=" ";break;case 9:switch(this.charCodeAt(this.tokenStart)){case ru:case tu:case nu:this.next();break;case ka:this.next(),this.eatIdent("deep"),this.eatDelim(ka);break;default:this.error("Combinator is expected");}t=this.substrToCursor(e);break}return {type:"Combinator",loc:this.getLocation(e,this.tokenStart),name:t}}function au(e){this.tokenize(e.name);}var xn={};b(xn,{generate:()=>pu,name:()=>cu,parse:()=>bn,structure:()=>uu});var su=42,lu=47,cu="Comment",uu={value:String};function bn(){let e=this.tokenStart,t=this.tokenEnd;return this.eat(25),t-e+2>=2&&this.charCodeAt(t-2)===su&&this.charCodeAt(t-1)===lu&&(t-=2),{type:"Comment",loc:this.getLocation(e,this.tokenStart),value:this.substring(e+2,t)}}function pu(e){this.token(25,"/*"+e.value+"*/");}var kn={};b(kn,{generate:()=>Su,name:()=>ku,parse:()=>yn,structure:()=>vu,walkContext:()=>wu});var va=33,hu=35,mu=36,fu=38,du=42,gu=43,wa=47;function bu(e){return this.Raw(e,this.consumeUntilExclamationMarkOrSemicolon,!0)}function xu(e){return this.Raw(e,this.consumeUntilExclamationMarkOrSemicolon,!1)}function yu(){let e=this.tokenIndex,t=this.Value();return t.type!=="Raw"&&this.eof===!1&&this.tokenType!==17&&this.isDelim(va)===!1&&this.isBalanceEdge(e)===!1&&this.error(),t}var ku="Declaration",wu="declaration",vu={important:[Boolean,String],property:String,value:["Value","Raw"]};function yn(){let e=this.tokenStart,t=this.tokenIndex,r=Cu.call(this),n=Mt(r),o=n?this.parseCustomProperty:this.parseValue,i=n?xu:bu,s=!1,u;this.skipSC(),this.eat(16);let c=this.tokenIndex;if(n||this.skipSC(),o?u=this.parseWithFallback(yu,i):u=i.call(this,this.tokenIndex),n&&u.type==="Value"&&u.children.isEmpty){for(let a=c-this.tokenIndex;a<=0;a++)if(this.lookupType(a)===13){u.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}}return this.isDelim(va)&&(s=Au.call(this),this.skipSC()),this.eof===!1&&this.tokenType!==17&&this.isBalanceEdge(t)===!1&&this.error(),{type:"Declaration",loc:this.getLocation(e,this.tokenStart),important:s,property:r,value:u}}function Su(e){this.token(1,e.property),this.token(16,":"),this.node(e.value),e.important&&(this.token(9,"!"),this.token(1,e.important===!0?"important":e.important));}function Cu(){let e=this.tokenStart;if(this.tokenType===9)switch(this.charCodeAt(this.tokenStart)){case du:case mu:case gu:case hu:case fu:this.next();break;case wa:this.next(),this.isDelim(wa)&&this.next();break}return this.tokenType===4?this.eat(4):this.eat(1),this.substrToCursor(e)}function Au(){this.eat(9),this.skipSC();let e=this.consume(1);return e==="important"?!0:e}var Sn={};b(Sn,{generate:()=>Pu,name:()=>Eu,parse:()=>vn,structure:()=>Lu});var Tu=38;function wn(e){return this.Raw(e,this.consumeUntilSemicolonIncluded,!0)}var Eu="DeclarationList",Lu={children:[["Declaration","Atrule","Rule"]]};function vn(){let e=this.createList();for(;!this.eof;)switch(this.tokenType){case 13:case 25:case 17:this.next();break;case 3:e.push(this.parseWithFallback(this.Atrule.bind(this,!0),wn));break;default:this.isDelim(Tu)?e.push(this.parseWithFallback(this.Rule,wn)):e.push(this.parseWithFallback(this.Declaration,wn));}return {type:"DeclarationList",loc:this.getLocationFromList(e),children:e}}function Pu(e){this.children(e,t=>{t.type==="Declaration"&&this.token(17,";");});}var An={};b(An,{generate:()=>Ou,name:()=>Iu,parse:()=>Cn,structure:()=>Du});var Iu="Dimension",Du={value:String,unit:String};function Cn(){let e=this.tokenStart,t=this.consumeNumber(12);return {type:"Dimension",loc:this.getLocation(e,this.tokenStart),value:t,unit:this.substring(e+t.length,this.tokenStart)}}function Ou(e){this.token(12,e.value+e.unit);}var En={};b(En,{generate:()=>Ru,name:()=>Nu,parse:()=>Tn,structure:()=>Mu,walkContext:()=>zu});var Nu="Function",zu="function",Mu={name:String,children:[[]]};function Tn(e,t){let r=this.tokenStart,n=this.consumeFunctionName(),o=n.toLowerCase(),i;return i=t.hasOwnProperty(o)?t[o].call(this,t):e.call(this,t),this.eof||this.eat(22),{type:"Function",loc:this.getLocation(r,this.tokenStart),name:n,children:i}}function Ru(e){this.token(2,e.name+"("),this.children(e),this.token(22,")");}var Pn={};b(Pn,{generate:()=>Uu,name:()=>Bu,parse:()=>Ln,structure:()=>_u,xxx:()=>Fu});var Fu="XXX",Bu="Hash",_u={value:String};function Ln(){let e=this.tokenStart;return this.eat(4),{type:"Hash",loc:this.getLocation(e,this.tokenStart),value:this.substrToCursor(e+1)}}function Uu(e){this.token(4,"#"+e.value);}var Dn={};b(Dn,{generate:()=>Wu,name:()=>ju,parse:()=>In,structure:()=>qu});var ju="Identifier",qu={name:String};function In(){return {type:"Identifier",loc:this.getLocation(this.tokenStart,this.tokenEnd),name:this.consume(1)}}function Wu(e){this.token(1,e.name);}var Nn={};b(Nn,{generate:()=>Gu,name:()=>Hu,parse:()=>On,structure:()=>Yu});var Hu="IdSelector",Yu={name:String};function On(){let e=this.tokenStart;return this.eat(4),{type:"IdSelector",loc:this.getLocation(e,this.tokenStart),name:this.substrToCursor(e+1)}}function Gu(e){this.token(9,"#"+e.name);}var Mn={};b(Mn,{generate:()=>Qu,name:()=>Vu,parse:()=>zn,structure:()=>Ku});var Vu="MediaFeature",Ku={name:String,value:["Identifier","Number","Dimension","Ratio",null]};function zn(){let e=this.tokenStart,t,r=null;if(this.eat(21),this.skipSC(),t=this.consume(1),this.skipSC(),this.tokenType!==22){switch(this.eat(16),this.skipSC(),this.tokenType){case 10:this.lookupNonWSType(1)===9?r=this.Ratio():r=this.Number();break;case 12:r=this.Dimension();break;case 1:r=this.Identifier();break;default:this.error("Number, dimension, ratio or identifier is expected");}this.skipSC();}return this.eat(22),{type:"MediaFeature",loc:this.getLocation(e,this.tokenStart),name:t,value:r}}function Qu(e){this.token(21,"("),this.token(1,e.name),e.value!==null&&(this.token(16,":"),this.node(e.value)),this.token(22,")");}var Fn={};b(Fn,{generate:()=>Zu,name:()=>Xu,parse:()=>Rn,structure:()=>$u});var Xu="MediaQuery",$u={children:[["Identifier","MediaFeature","WhiteSpace"]]};function Rn(){let e=this.createList(),t=null;this.skipSC();e:for(;!this.eof;){switch(this.tokenType){case 25:case 13:this.next();continue;case 1:t=this.Identifier();break;case 21:t=this.MediaFeature();break;default:break e}e.push(t);}return t===null&&this.error("Identifier or parenthesis is expected"),{type:"MediaQuery",loc:this.getLocationFromList(e),children:e}}function Zu(e){this.children(e);}var _n={};b(_n,{generate:()=>tp,name:()=>Ju,parse:()=>Bn,structure:()=>ep});var Ju="MediaQueryList",ep={children:[["MediaQuery"]]};function Bn(){let e=this.createList();for(this.skipSC();!this.eof&&(e.push(this.MediaQuery()),this.tokenType===18);)this.next();return {type:"MediaQueryList",loc:this.getLocationFromList(e),children:e}}function tp(e){this.children(e,()=>this.token(18,","));}var jn={};b(jn,{generate:()=>ip,name:()=>np,parse:()=>Un,structure:()=>op});var rp=38,np="NestingSelector",op={};function Un(){let e=this.tokenStart;return this.eatDelim(rp),{type:"NestingSelector",loc:this.getLocation(e,this.tokenStart)}}function ip(){this.token(9,"&");}var Wn={};b(Wn,{generate:()=>lp,name:()=>ap,parse:()=>qn,structure:()=>sp});var ap="Nth",sp={nth:["AnPlusB","Identifier"],selector:["SelectorList",null]};function qn(){this.skipSC();let e=this.tokenStart,t=e,r=null,n;return this.lookupValue(0,"odd")||this.lookupValue(0,"even")?n=this.Identifier():n=this.AnPlusB(),t=this.tokenStart,this.skipSC(),this.lookupValue(0,"of")&&(this.next(),r=this.SelectorList(),t=this.tokenStart),{type:"Nth",loc:this.getLocation(e,t),nth:n,selector:r}}function lp(e){this.node(e.nth),e.selector!==null&&(this.token(1,"of"),this.node(e.selector));}var Yn={};b(Yn,{generate:()=>pp,name:()=>cp,parse:()=>Hn,structure:()=>up});var cp="Number",up={value:String};function Hn(){return {type:"Number",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:this.consume(10)}}function pp(e){this.token(10,e.value);}var Vn={};b(Vn,{generate:()=>fp,name:()=>hp,parse:()=>Gn,structure:()=>mp});var hp="Operator",mp={value:String};function Gn(){let e=this.tokenStart;return this.next(),{type:"Operator",loc:this.getLocation(e,this.tokenStart),value:this.substrToCursor(e)}}function fp(e){this.tokenize(e.value);}var Qn={};b(Qn,{generate:()=>bp,name:()=>dp,parse:()=>Kn,structure:()=>gp});var dp="Parentheses",gp={children:[[]]};function Kn(e,t){let r=this.tokenStart,n=null;return this.eat(21),n=e.call(this,t),this.eof||this.eat(22),{type:"Parentheses",loc:this.getLocation(r,this.tokenStart),children:n}}function bp(e){this.token(21,"("),this.children(e),this.token(22,")");}var $n={};b($n,{generate:()=>kp,name:()=>xp,parse:()=>Xn,structure:()=>yp});var xp="Percentage",yp={value:String};function Xn(){return {type:"Percentage",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:this.consumeNumber(11)}}function kp(e){this.token(11,e.value+"%");}var Jn={};b(Jn,{generate:()=>Cp,name:()=>wp,parse:()=>Zn,structure:()=>Sp,walkContext:()=>vp});var wp="PseudoClassSelector",vp="function",Sp={name:String,children:[["Raw"],null]};function Zn(){let e=this.tokenStart,t=null,r,n;return this.eat(16),this.tokenType===2?(r=this.consumeFunctionName(),n=r.toLowerCase(),this.lookupNonWSType(0)==22?t=this.createList():hasOwnProperty.call(this.pseudo,n)?(this.skipSC(),t=this.pseudo[n].call(this),this.skipSC()):(t=this.createList(),t.push(this.Raw(this.tokenIndex,null,!1))),this.eat(22)):r=this.consume(1),{type:"PseudoClassSelector",loc:this.getLocation(e,this.tokenStart),name:r,children:t}}function Cp(e){this.token(16,":"),e.children===null?this.token(1,e.name):(this.token(2,e.name+"("),this.children(e),this.token(22,")"));}var to={};b(to,{generate:()=>Lp,name:()=>Ap,parse:()=>eo,structure:()=>Ep,walkContext:()=>Tp});var Ap="PseudoElementSelector",Tp="function",Ep={name:String,children:[["Raw"],null]};function eo(){let e=this.tokenStart,t=null,r,n;return this.eat(16),this.eat(16),this.tokenType===2?(r=this.consumeFunctionName(),n=r.toLowerCase(),this.lookupNonWSType(0)==22?t=this.createList():hasOwnProperty.call(this.pseudo,n)?(this.skipSC(),t=this.pseudo[n].call(this),this.skipSC()):(t=this.createList(),t.push(this.Raw(this.tokenIndex,null,!1))),this.eat(22)):r=this.consume(1),{type:"PseudoElementSelector",loc:this.getLocation(e,this.tokenStart),name:r,children:t}}function Lp(e){this.token(16,":"),this.token(16,":"),e.children===null?this.token(1,e.name):(this.token(2,e.name+"("),this.children(e),this.token(22,")"));}var no={};b(no,{generate:()=>Np,name:()=>Dp,parse:()=>ro,structure:()=>Op});var Pp=47,Ip=46;function Sa(){this.skipSC();let e=this.consume(10);for(let t=0;t<e.length;t++){let r=e.charCodeAt(t);!B(r)&&r!==Ip&&this.error("Unsigned number is expected",this.tokenStart-e.length+t);}return Number(e)===0&&this.error("Zero number is not allowed",this.tokenStart-e.length),e}var Dp="Ratio",Op={left:String,right:String};function ro(){let e=this.tokenStart,t=Sa.call(this),r;return this.skipSC(),this.eatDelim(Pp),r=Sa.call(this),{type:"Ratio",loc:this.getLocation(e,this.tokenStart),left:t,right:r}}function Np(e){this.token(10,e.left),this.token(9,"/"),this.token(10,e.right);}var io={};b(io,{generate:()=>Fp,name:()=>Mp,parse:()=>oo,structure:()=>Rp});function zp(){return this.tokenIndex>0&&this.lookupType(-1)===13?this.tokenIndex>1?this.getTokenStart(this.tokenIndex-1):this.firstCharOffset:this.tokenStart}var Mp="Raw",Rp={value:String};function oo(e,t,r){let n=this.getTokenStart(e),o;return this.skipUntilBalanced(e,t||this.consumeUntilBalanceEnd),r&&this.tokenStart>n?o=zp.call(this):o=this.tokenStart,{type:"Raw",loc:this.getLocation(n,o),value:this.substring(n,o)}}function Fp(e){this.tokenize(e.value);}var so={};b(so,{generate:()=>qp,name:()=>_p,parse:()=>ao,structure:()=>jp,walkContext:()=>Up});function Ca(e){return this.Raw(e,this.consumeUntilLeftCurlyBracket,!0)}function Bp(){let e=this.SelectorList();return e.type!=="Raw"&&this.eof===!1&&this.tokenType!==23&&this.error(),e}var _p="Rule",Up="rule",jp={prelude:["SelectorList","Raw"],block:["Block"]};function ao(){let e=this.tokenIndex,t=this.tokenStart,r,n;return this.parseRulePrelude?r=this.parseWithFallback(Bp,Ca):r=Ca.call(this,e),n=this.Block(!0),{type:"Rule",loc:this.getLocation(t,this.tokenStart),prelude:r,block:n}}function qp(e){this.node(e.prelude),this.node(e.block);}var co={};b(co,{generate:()=>Yp,name:()=>Wp,parse:()=>lo,structure:()=>Hp});var Wp="Selector",Hp={children:[["TypeSelector","IdSelector","ClassSelector","AttributeSelector","PseudoClassSelector","PseudoElementSelector","Combinator","WhiteSpace"]]};function lo(){let e=this.readSequence(this.scope.Selector);return this.getFirstListNode(e)===null&&this.error("Selector is expected"),{type:"Selector",loc:this.getLocationFromList(e),children:e}}function Yp(e){this.children(e);}var po={};b(po,{generate:()=>Qp,name:()=>Gp,parse:()=>uo,structure:()=>Kp,walkContext:()=>Vp});var Gp="SelectorList",Vp="selector",Kp={children:[["Selector","Raw"]]};function uo(){let e=this.createList();for(;!this.eof;){if(e.push(this.Selector()),this.tokenType===18){this.next();continue}break}return {type:"SelectorList",loc:this.getLocationFromList(e),children:e}}function Qp(e){this.children(e,()=>this.token(18,","));}var bo={};b(bo,{generate:()=>Zp,name:()=>Xp,parse:()=>go,structure:()=>$p});var fo={};b(fo,{decode:()=>ft,encode:()=>mo});var ho=92,Aa=34,Ta=39;function ft(e){let t=e.length,r=e.charCodeAt(0),n=r===Aa||r===Ta?1:0,o=n===1&&t>1&&e.charCodeAt(t-1)===r?t-2:t-1,i="";for(let s=n;s<=o;s++){let u=e.charCodeAt(s);if(u===ho){if(s===o){s!==t-1&&(i=e.substr(s+1));break}if(u=e.charCodeAt(++s),$(ho,u)){let c=s-1,a=se(e,c);s=a-1,i+=Re(e.substring(c+1,a));}else u===13&&e.charCodeAt(s+1)===10&&s++;}else i+=e[s];}return i}function mo(e,t){let r=t?"'":'"',n=t?Ta:Aa,o="",i=!1;for(let s=0;s<e.length;s++){let u=e.charCodeAt(s);if(u===0){o+="\uFFFD";continue}if(u<=31||u===127){o+="\\"+u.toString(16),i=!0;continue}u===n||u===ho?(o+="\\"+e.charAt(s),i=!1):(i&&(ee(u)||pe(u))&&(o+=" "),o+=e.charAt(s),i=!1);}return r+o+r}var Xp="String",$p={value:String};function go(){return {type:"String",loc:this.getLocation(this.tokenStart,this.tokenEnd),value:ft(this.consume(5))}}function Zp(e){this.token(5,mo(e.value));}var yo={};b(yo,{generate:()=>nh,name:()=>eh,parse:()=>xo,structure:()=>rh,walkContext:()=>th});var Jp=33;function Ea(e){return this.Raw(e,null,!1)}var eh="StyleSheet",th="stylesheet",rh={children:[["Comment","CDO","CDC","Atrule","Rule","Raw"]]};function xo(){let e=this.tokenStart,t=this.createList(),r;for(;!this.eof;){switch(this.tokenType){case 13:this.next();continue;case 25:if(this.charCodeAt(this.tokenStart+2)!==Jp){this.next();continue}r=this.Comment();break;case 14:r=this.CDO();break;case 15:r=this.CDC();break;case 3:r=this.parseWithFallback(this.Atrule,Ea);break;default:r=this.parseWithFallback(this.Rule,Ea);}t.push(r);}return {type:"StyleSheet",loc:this.getLocation(e,this.tokenStart),children:t}}function nh(e){this.children(e);}var vo={};b(vo,{generate:()=>sh,name:()=>ih,parse:()=>wo,structure:()=>ah});var oh=42,La=124;function ko(){this.tokenType!==1&&this.isDelim(oh)===!1&&this.error("Identifier or asterisk is expected"),this.next();}var ih="TypeSelector",ah={name:String};function wo(){let e=this.tokenStart;return this.isDelim(La)?(this.next(),ko.call(this)):(ko.call(this),this.isDelim(La)&&(this.next(),ko.call(this))),{type:"TypeSelector",loc:this.getLocation(e,this.tokenStart),name:this.substrToCursor(e)}}function sh(e){this.tokenize(e.name);}var Ao={};b(Ao,{generate:()=>hh,name:()=>uh,parse:()=>Co,structure:()=>ph});var Pa=43,Ia=45,So=63;function dt(e,t){let r=0;for(let n=this.tokenStart+e;n<this.tokenEnd;n++){let o=this.charCodeAt(n);if(o===Ia&&t&&r!==0)return dt.call(this,e+r+1,!1),-1;ee(o)||this.error(t&&r!==0?"Hyphen minus"+(r<6?" or hex digit":"")+" is expected":r<6?"Hex digit is expected":"Unexpected input",n),++r>6&&this.error("Too many hex digits",n);}return this.next(),r}function Jt(e){let t=0;for(;this.isDelim(So);)++t>e&&this.error("Too many question marks"),this.next();}function lh(e){this.charCodeAt(this.tokenStart)!==e&&this.error((e===Pa?"Plus sign":"Hyphen minus")+" is expected");}function ch(){let e=0;switch(this.tokenType){case 10:if(e=dt.call(this,1,!0),this.isDelim(So)){Jt.call(this,6-e);break}if(this.tokenType===12||this.tokenType===10){lh.call(this,Ia),dt.call(this,1,!1);break}break;case 12:e=dt.call(this,1,!0),e>0&&Jt.call(this,6-e);break;default:if(this.eatDelim(Pa),this.tokenType===1){e=dt.call(this,0,!0),e>0&&Jt.call(this,6-e);break}if(this.isDelim(So)){this.next(),Jt.call(this,5);break}this.error("Hex digit or question mark is expected");}}var uh="UnicodeRange",ph={value:String};function Co(){let e=this.tokenStart;return this.eatIdent("u"),ch.call(this),{type:"UnicodeRange",loc:this.getLocation(e,this.tokenStart),value:this.substrToCursor(e)}}function hh(e){this.tokenize(e.value);}var Do={};b(Do,{generate:()=>yh,name:()=>bh,parse:()=>Io,structure:()=>xh});var Po={};b(Po,{decode:()=>Eo,encode:()=>Lo});var mh=32,To=92,fh=34,dh=39,gh=40,Da=41;function Eo(e){let t=e.length,r=4,n=e.charCodeAt(t-1)===Da?t-2:t-1,o="";for(;r<n&&pe(e.charCodeAt(r));)r++;for(;r<n&&pe(e.charCodeAt(n));)n--;for(let i=r;i<=n;i++){let s=e.charCodeAt(i);if(s===To){if(i===n){i!==t-1&&(o=e.substr(i+1));break}if(s=e.charCodeAt(++i),$(To,s)){let u=i-1,c=se(e,u);i=c-1,o+=Re(e.substring(u+1,c));}else s===13&&e.charCodeAt(i+1)===10&&i++;}else o+=e[i];}return o}function Lo(e){let t="",r=!1;for(let n=0;n<e.length;n++){let o=e.charCodeAt(n);if(o===0){t+="\uFFFD";continue}if(o<=31||o===127){t+="\\"+o.toString(16),r=!0;continue}o===mh||o===To||o===fh||o===dh||o===gh||o===Da?(t+="\\"+e.charAt(n),r=!1):(r&&ee(o)&&(t+=" "),t+=e.charAt(n),r=!1);}return "url("+t+")"}var bh="Url",xh={value:String};function Io(){let e=this.tokenStart,t;switch(this.tokenType){case 7:t=Eo(this.consume(7));break;case 2:this.cmpStr(this.tokenStart,this.tokenEnd,"url(")||this.error("Function name must be `url`"),this.eat(2),this.skipSC(),t=ft(this.consume(5)),this.skipSC(),this.eof||this.eat(22);break;default:this.error("Url or Function is expected");}return {type:"Url",loc:this.getLocation(e,this.tokenStart),value:t}}function yh(e){this.token(7,Lo(e.value));}var No={};b(No,{generate:()=>vh,name:()=>kh,parse:()=>Oo,structure:()=>wh});var kh="Value",wh={children:[[]]};function Oo(){let e=this.tokenStart,t=this.readSequence(this.scope.Value);return {type:"Value",loc:this.getLocation(e,this.tokenStart),children:t}}function vh(e){this.children(e);}var Mo={};b(Mo,{generate:()=>Th,name:()=>Ch,parse:()=>zo,structure:()=>Ah});var Sh=Object.freeze({type:"WhiteSpace",loc:null,value:" "}),Ch="WhiteSpace",Ah={value:String};function zo(){return this.eat(13),Sh}function Th(e){this.token(13,e.value);}var Oa={generic:!0,...fa,node:gt};var Ro={};b(Ro,{AtrulePrelude:()=>za,Selector:()=>Ra,Value:()=>Ua});var Eh=35,Lh=42,Na=43,Ph=45,Ih=47,Dh=117;function bt(e){switch(this.tokenType){case 4:return this.Hash();case 18:return this.Operator();case 21:return this.Parentheses(this.readSequence,e.recognizer);case 19:return this.Brackets(this.readSequence,e.recognizer);case 5:return this.String();case 12:return this.Dimension();case 11:return this.Percentage();case 10:return this.Number();case 2:return this.cmpStr(this.tokenStart,this.tokenEnd,"url(")?this.Url():this.Function(this.readSequence,e.recognizer);case 7:return this.Url();case 1:return this.cmpChar(this.tokenStart,Dh)&&this.cmpChar(this.tokenStart+1,Na)?this.UnicodeRange():this.Identifier();case 9:{let t=this.charCodeAt(this.tokenStart);if(t===Ih||t===Lh||t===Na||t===Ph)return this.Operator();t===Eh&&this.error("Hex or identifier is expected",this.tokenStart+1);break}}}var za={getNode:bt};var Oh=35,Nh=38,zh=42,Mh=43,Rh=47,Ma=46,Fh=62,Bh=124,_h=126;function Uh(e,t){t.last!==null&&t.last.type!=="Combinator"&&e!==null&&e.type!=="Combinator"&&t.push({type:"Combinator",loc:null,name:" "});}function jh(){switch(this.tokenType){case 19:return this.AttributeSelector();case 4:return this.IdSelector();case 16:return this.lookupType(1)===16?this.PseudoElementSelector():this.PseudoClassSelector();case 1:return this.TypeSelector();case 10:case 11:return this.Percentage();case 12:this.charCodeAt(this.tokenStart)===Ma&&this.error("Identifier is expected",this.tokenStart+1);break;case 9:{switch(this.charCodeAt(this.tokenStart)){case Mh:case Fh:case _h:case Rh:return this.Combinator();case Ma:return this.ClassSelector();case zh:case Bh:return this.TypeSelector();case Oh:return this.IdSelector();case Nh:return this.NestingSelector()}break}}}var Ra={onWhiteSpace:Uh,getNode:jh};function Fa(){return this.createSingleNodeList(this.Raw(this.tokenIndex,null,!1))}function Ba(){let e=this.createList();if(this.skipSC(),e.push(this.Identifier()),this.skipSC(),this.tokenType===18){e.push(this.Operator());let t=this.tokenIndex,r=this.parseCustomProperty?this.Value(null):this.Raw(this.tokenIndex,this.consumeUntilExclamationMarkOrSemicolon,!1);if(r.type==="Value"&&r.children.isEmpty){for(let n=t-this.tokenIndex;n<=0;n++)if(this.lookupType(n)===13){r.children.appendData({type:"WhiteSpace",loc:null,value:" "});break}}e.push(r);}return e}function _a(e){return e!==null&&e.type==="Operator"&&(e.value[e.value.length-1]==="-"||e.value[e.value.length-1]==="+")}var Ua={getNode:bt,onWhiteSpace(e,t){_a(e)&&(e.value=" "+e.value),_a(t.last)&&(t.last.value+=" ");},expression:Fa,var:Ba};var ja={parse:{prelude:null,block(){return this.Block(!0)}}};var qa={parse:{prelude(){let e=this.createList();switch(this.skipSC(),this.tokenType){case 5:e.push(this.String());break;case 7:case 2:e.push(this.Url());break;default:this.error("String or url() is expected");}return (this.lookupNonWSType(0)===1||this.lookupNonWSType(0)===21)&&e.push(this.MediaQueryList()),e},block:null}};var Wa={parse:{prelude(){return this.createSingleNodeList(this.MediaQueryList())},block(e=!1){return this.Block(e)}}};var Ha={parse:{prelude(){return this.createSingleNodeList(this.SelectorList())},block(){return this.Block(!0)}}};var Ya={parse:{prelude(){return this.createSingleNodeList(this.SelectorList())},block(){return this.Block(!0)}}};function qh(){return this.createSingleNodeList(this.Raw(this.tokenIndex,null,!1))}function Wh(){return this.skipSC(),this.tokenType===1&&this.lookupNonWSType(1)===16?this.createSingleNodeList(this.Declaration()):Ga.call(this)}function Ga(){let e=this.createList(),t;this.skipSC();e:for(;!this.eof;){switch(this.tokenType){case 25:case 13:this.next();continue;case 2:t=this.Function(qh,this.scope.AtrulePrelude);break;case 1:t=this.Identifier();break;case 21:t=this.Parentheses(Wh,this.scope.AtrulePrelude);break;default:break e}e.push(t);}return e}var Va={parse:{prelude(){let e=Ga.call(this);return this.getFirstListNode(e)===null&&this.error("Condition is expected"),e},block(e=!1){return this.Block(e)}}};var Ka={"font-face":ja,import:qa,media:Wa,nest:Ha,page:Ya,supports:Va};var De={parse(){return this.createSingleNodeList(this.SelectorList())}},Fo={parse(){return this.createSingleNodeList(this.Selector())}},Qa={parse(){return this.createSingleNodeList(this.Identifier())}},er={parse(){return this.createSingleNodeList(this.Nth())}},Xa={dir:Qa,has:De,lang:Qa,matches:De,is:De,"-moz-any":De,"-webkit-any":De,where:De,not:De,"nth-child":er,"nth-last-child":er,"nth-last-of-type":er,"nth-of-type":er,slotted:Fo,host:Fo,"host-context":Fo};var Bo={};b(Bo,{AnPlusB:()=>Qr,Atrule:()=>$r,AtrulePrelude:()=>Jr,AttributeSelector:()=>rn,Block:()=>on,Brackets:()=>sn,CDC:()=>cn,CDO:()=>pn,ClassSelector:()=>mn,Combinator:()=>dn,Comment:()=>bn,Declaration:()=>yn,DeclarationList:()=>vn,Dimension:()=>Cn,Function:()=>Tn,Hash:()=>Ln,IdSelector:()=>On,Identifier:()=>In,MediaFeature:()=>zn,MediaQuery:()=>Rn,MediaQueryList:()=>Bn,NestingSelector:()=>Un,Nth:()=>qn,Number:()=>Hn,Operator:()=>Gn,Parentheses:()=>Kn,Percentage:()=>Xn,PseudoClassSelector:()=>Zn,PseudoElementSelector:()=>eo,Ratio:()=>ro,Raw:()=>oo,Rule:()=>ao,Selector:()=>lo,SelectorList:()=>uo,String:()=>go,StyleSheet:()=>xo,TypeSelector:()=>wo,UnicodeRange:()=>Co,Url:()=>Io,Value:()=>Oo,WhiteSpace:()=>zo});var $a={parseContext:{default:"StyleSheet",stylesheet:"StyleSheet",atrule:"Atrule",atrulePrelude(e){return this.AtrulePrelude(e.atrule?String(e.atrule):null)},mediaQueryList:"MediaQueryList",mediaQuery:"MediaQuery",rule:"Rule",selectorList:"SelectorList",selector:"Selector",block(){return this.Block(!0)},declarationList:"DeclarationList",declaration:"Declaration",value:"Value"},scope:Ro,atrule:Ka,pseudo:Xa,node:Bo};var Za={node:gt};var Ja=Vr({...Oa,...$a,...Za});var ts={};b(ts,{decode:()=>Hh,encode:()=>Yh});var es=92;function Hh(e){let t=e.length-1,r="";for(let n=0;n<e.length;n++){let o=e.charCodeAt(n);if(o===es){if(n===t)break;if(o=e.charCodeAt(++n),$(es,o)){let i=n-1,s=se(e,i);n=s-1,r+=Re(e.substring(i+1,s));}else o===13&&e.charCodeAt(n+1)===10&&n++;}else r+=e[n];}return r}function Yh(e){let t="";if(e.length===1&&e.charCodeAt(0)===45)return "\\-";for(let r=0;r<e.length;r++){let n=e.charCodeAt(r);if(n===0){t+="\uFFFD";continue}if(n<=31||n===127||n>=48&&n<=57&&(r===0||r===1&&e.charCodeAt(0)===45)){t+="\\"+n.toString(16)+" ";continue}Ne(n)?t+=e.charAt(r):t+="\\"+e.charAt(r);}return t}var{tokenize:fb,parse:db,generate:gb,lexer:bb,createLexer:xb,walk:yb,find:kb,findLast:wb,findAll:vb,toPlainObject:Sb,fromPlainObject:Cb,fork:Ab}=Ja;
  21654. /*
  21655. * The MIT License (MIT)
  21656. *
  21657. * Author: Gildas Lormeau
  21658. *
  21659. * Permission is hereby granted, free of charge, to any person obtaining a copy
  21660. * of this software and associated documentation files (the "Software"), to deal
  21661. * in the Software without restriction, including without limitation the rights
  21662. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  21663. * copies of the Software, and to permit persons to whom the Software is
  21664. * furnished to do so, subject to the following conditions:
  21665. *
  21666. * The above copyright notice and this permission notice shall be included in all
  21667. * copies or substantial portions of the Software.
  21668. *
  21669. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  21670. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21671. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  21672. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21673. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21674. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21675. * SOFTWARE.
  21676. */
  21677. const REGEXP_SIMPLE_QUOTES_STRING = /^'(.*?)'$/;
  21678. const REGEXP_DOUBLE_QUOTES_STRING = /^"(.*?)"$/;
  21679. const globalKeywords = [
  21680. "inherit",
  21681. "initial",
  21682. "unset"
  21683. ];
  21684. const systemFontKeywords = [
  21685. "caption",
  21686. "icon",
  21687. "menu",
  21688. "message-box",
  21689. "small-caption",
  21690. "status-bar"
  21691. ];
  21692. const fontWeightKeywords = [
  21693. "normal",
  21694. "bold",
  21695. "bolder",
  21696. "lighter",
  21697. "100",
  21698. "200",
  21699. "300",
  21700. "400",
  21701. "500",
  21702. "600",
  21703. "700",
  21704. "800",
  21705. "900"
  21706. ];
  21707. const fontStyleKeywords = [
  21708. "normal",
  21709. "italic",
  21710. "oblique"
  21711. ];
  21712. const fontStretchKeywords = [
  21713. "normal",
  21714. "condensed",
  21715. "semi-condensed",
  21716. "extra-condensed",
  21717. "ultra-condensed",
  21718. "expanded",
  21719. "semi-expanded",
  21720. "extra-expanded",
  21721. "ultra-expanded"
  21722. ];
  21723. const errorPrefix = "[parse-css-font] ";
  21724. function parse(value) {
  21725. const stringValue = gb(value);
  21726. if (systemFontKeywords.indexOf(stringValue) !== -1) {
  21727. return { system: stringValue };
  21728. }
  21729. const tokens = value.children;
  21730. const font = {
  21731. lineHeight: "normal",
  21732. stretch: "normal",
  21733. style: "normal",
  21734. variant: "normal",
  21735. weight: "normal",
  21736. };
  21737. let isLocked = false;
  21738. for (let tokenNode = tokens.head; tokenNode; tokenNode = tokenNode.next) {
  21739. const token = gb(tokenNode.data);
  21740. if (token === "normal" || globalKeywords.indexOf(token) !== -1) {
  21741. ["style", "variant", "weight", "stretch"].forEach((prop) => {
  21742. font[prop] = token;
  21743. });
  21744. isLocked = true;
  21745. continue;
  21746. }
  21747. if (fontWeightKeywords.indexOf(token) !== -1) {
  21748. if (isLocked) {
  21749. continue;
  21750. }
  21751. font.weight = token;
  21752. continue;
  21753. }
  21754. if (fontStyleKeywords.indexOf(token) !== -1) {
  21755. if (isLocked) {
  21756. continue;
  21757. }
  21758. font.style = token;
  21759. continue;
  21760. }
  21761. if (fontStretchKeywords.indexOf(token) !== -1) {
  21762. if (isLocked) {
  21763. continue;
  21764. }
  21765. font.stretch = token;
  21766. continue;
  21767. }
  21768. if (tokenNode.data.type == "Dimension") {
  21769. font.size = gb(tokenNode.data);
  21770. tokenNode = tokenNode.next;
  21771. if (tokenNode && tokenNode.data.type == "Operator" && tokenNode.data.value == "/" && tokenNode.next) {
  21772. tokenNode = tokenNode.next;
  21773. font.lineHeight = gb(tokenNode.data);
  21774. tokenNode = tokenNode.next;
  21775. } else if (tokens.head.data.type == "Operator" && tokens.head.data.value == "/" && tokens.head.next) {
  21776. font.lineHeight = gb(tokens.head.next.data);
  21777. tokenNode = tokens.head.next.next;
  21778. }
  21779. if (!tokenNode) {
  21780. throw error("Missing required font-family.");
  21781. }
  21782. font.family = [];
  21783. let familyName = "";
  21784. while (tokenNode) {
  21785. while (tokenNode && tokenNode.data.type == "Operator" && tokenNode.data.value == ",") {
  21786. tokenNode = tokenNode.next;
  21787. }
  21788. if (tokenNode) {
  21789. if (tokenNode.data.type == "Identifier") {
  21790. while (tokenNode && tokenNode.data.type == "Identifier") {
  21791. familyName += " " + gb(tokenNode.data);
  21792. tokenNode = tokenNode.next;
  21793. }
  21794. } else {
  21795. familyName = removeQuotes(gb(tokenNode.data));
  21796. tokenNode = tokenNode.next;
  21797. }
  21798. }
  21799. familyName = familyName.trim();
  21800. if (familyName) {
  21801. font.family.push(familyName);
  21802. familyName = "";
  21803. }
  21804. }
  21805. return font;
  21806. }
  21807. if (font.variant !== "normal") {
  21808. throw error("Unknown or unsupported font token: " + font.variant);
  21809. }
  21810. if (isLocked) {
  21811. continue;
  21812. }
  21813. font.variant = token;
  21814. }
  21815. throw error("Missing required font-size.");
  21816. }
  21817. function error(message) {
  21818. return new Error(errorPrefix + message);
  21819. }
  21820. function removeQuotes(string) {
  21821. if (string.match(REGEXP_SIMPLE_QUOTES_STRING)) {
  21822. string = string.replace(REGEXP_SIMPLE_QUOTES_STRING, "$1");
  21823. } else {
  21824. string = string.replace(REGEXP_DOUBLE_QUOTES_STRING, "$1");
  21825. }
  21826. return string.trim();
  21827. }
  21828. /*
  21829. * The MIT License (MIT)
  21830. *
  21831. * Author: Gildas Lormeau
  21832. *
  21833. * Permission is hereby granted, free of charge, to any person obtaining a copy
  21834. * of this software and associated documentation files (the "Software"), to deal
  21835. * in the Software without restriction, including without limitation the rights
  21836. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  21837. * copies of the Software, and to permit persons to whom the Software is
  21838. * furnished to do so, subject to the following conditions:
  21839. *
  21840. * The above copyright notice and this permission notice shall be included in all
  21841. * copies or substantial portions of the Software.
  21842. *
  21843. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  21844. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21845. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  21846. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21847. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21848. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21849. * SOFTWARE.
  21850. */
  21851. // derived from https://github.com/dryoma/postcss-media-query-parser
  21852. /*
  21853. * The MIT License (MIT)
  21854. *
  21855. * Permission is hereby granted, free of charge, to any person obtaining a copy
  21856. * of this software and associated documentation files (the "Software"), to deal
  21857. * in the Software without restriction, including without limitation the rights
  21858. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  21859. * copies of the Software, and to permit persons to whom the Software is
  21860. * furnished to do so, subject to the following conditions:
  21861. *
  21862. * The above copyright notice and this permission notice shall be included in
  21863. * all copies or substantial portions of the Software.
  21864. *
  21865. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  21866. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21867. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  21868. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21869. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21870. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21871. * THE SOFTWARE.
  21872. */
  21873. /**
  21874. * Parses a media feature expression, e.g. `max-width: 10px`, `(color)`
  21875. *
  21876. * @param {string} string - the source expression string, can be inside parens
  21877. * @param {Number} index - the index of `string` in the overall input
  21878. *
  21879. * @return {Array} an array of Nodes, the first element being a media feature,
  21880. * the second - its value (may be missing)
  21881. */
  21882. function parseMediaFeature(string, index = 0) {
  21883. const modesEntered = [{
  21884. mode: "normal",
  21885. character: null,
  21886. }];
  21887. const result = [];
  21888. let lastModeIndex = 0, mediaFeature = "", colon = null, mediaFeatureValue = null, indexLocal = index;
  21889. let stringNormalized = string;
  21890. // Strip trailing parens (if any), and correct the starting index
  21891. if (string[0] === "(" && string[string.length - 1] === ")") {
  21892. stringNormalized = string.substring(1, string.length - 1);
  21893. indexLocal++;
  21894. }
  21895. for (let i = 0; i < stringNormalized.length; i++) {
  21896. const character = stringNormalized[i];
  21897. // If entering/exiting a string
  21898. if (character === "'" || character === "\"") {
  21899. if (modesEntered[lastModeIndex].isCalculationEnabled === true) {
  21900. modesEntered.push({
  21901. mode: "string",
  21902. isCalculationEnabled: false,
  21903. character,
  21904. });
  21905. lastModeIndex++;
  21906. } else if (modesEntered[lastModeIndex].mode === "string" &&
  21907. modesEntered[lastModeIndex].character === character &&
  21908. stringNormalized[i - 1] !== "\\"
  21909. ) {
  21910. modesEntered.pop();
  21911. lastModeIndex--;
  21912. }
  21913. }
  21914. // If entering/exiting interpolation
  21915. if (character === "{") {
  21916. modesEntered.push({
  21917. mode: "interpolation",
  21918. isCalculationEnabled: true,
  21919. });
  21920. lastModeIndex++;
  21921. } else if (character === "}") {
  21922. modesEntered.pop();
  21923. lastModeIndex--;
  21924. }
  21925. // If a : is met outside of a string, function call or interpolation, than
  21926. // this : separates a media feature and a value
  21927. if (modesEntered[lastModeIndex].mode === "normal" && character === ":") {
  21928. const mediaFeatureValueStr = stringNormalized.substring(i + 1);
  21929. mediaFeatureValue = {
  21930. type: "value",
  21931. before: /^(\s*)/.exec(mediaFeatureValueStr)[1],
  21932. after: /(\s*)$/.exec(mediaFeatureValueStr)[1],
  21933. value: mediaFeatureValueStr.trim(),
  21934. };
  21935. // +1 for the colon
  21936. mediaFeatureValue.sourceIndex =
  21937. mediaFeatureValue.before.length + i + 1 + indexLocal;
  21938. colon = {
  21939. type: "colon",
  21940. sourceIndex: i + indexLocal,
  21941. after: mediaFeatureValue.before,
  21942. value: ":", // for consistency only
  21943. };
  21944. break;
  21945. }
  21946. mediaFeature += character;
  21947. }
  21948. // Forming a media feature node
  21949. mediaFeature = {
  21950. type: "media-feature",
  21951. before: /^(\s*)/.exec(mediaFeature)[1],
  21952. after: /(\s*)$/.exec(mediaFeature)[1],
  21953. value: mediaFeature.trim(),
  21954. };
  21955. mediaFeature.sourceIndex = mediaFeature.before.length + indexLocal;
  21956. result.push(mediaFeature);
  21957. if (colon !== null) {
  21958. colon.before = mediaFeature.after;
  21959. result.push(colon);
  21960. }
  21961. if (mediaFeatureValue !== null) {
  21962. result.push(mediaFeatureValue);
  21963. }
  21964. return result;
  21965. }
  21966. /**
  21967. * Parses a media query, e.g. `screen and (color)`, `only tv`
  21968. *
  21969. * @param {string} string - the source media query string
  21970. * @param {Number} index - the index of `string` in the overall input
  21971. *
  21972. * @return {Array} an array of Nodes and Containers
  21973. */
  21974. function parseMediaQuery(string, index = 0) {
  21975. const result = [];
  21976. // How many times the parser entered parens/curly braces
  21977. let localLevel = 0;
  21978. // Has any keyword, media type, media feature expression or interpolation
  21979. // ('element' hereafter) started
  21980. let insideSomeValue = false, node;
  21981. function resetNode() {
  21982. return {
  21983. before: "",
  21984. after: "",
  21985. value: "",
  21986. };
  21987. }
  21988. node = resetNode();
  21989. for (let i = 0; i < string.length; i++) {
  21990. const character = string[i];
  21991. // If not yet entered any element
  21992. if (!insideSomeValue) {
  21993. if (character.search(/\s/) !== -1) {
  21994. // A whitespace
  21995. // Don't form 'after' yet; will do it later
  21996. node.before += character;
  21997. } else {
  21998. // Not a whitespace - entering an element
  21999. // Expression start
  22000. if (character === "(") {
  22001. node.type = "media-feature-expression";
  22002. localLevel++;
  22003. }
  22004. node.value = character;
  22005. node.sourceIndex = index + i;
  22006. insideSomeValue = true;
  22007. }
  22008. } else {
  22009. // Already in the middle of some element
  22010. node.value += character;
  22011. // Here parens just increase localLevel and don't trigger a start of
  22012. // a media feature expression (since they can't be nested)
  22013. // Interpolation start
  22014. if (character === "{" || character === "(") { localLevel++; }
  22015. // Interpolation/function call/media feature expression end
  22016. if (character === ")" || character === "}") { localLevel--; }
  22017. }
  22018. // If exited all parens/curlies and the next symbol
  22019. if (insideSomeValue && localLevel === 0 &&
  22020. (character === ")" || i === string.length - 1 ||
  22021. string[i + 1].search(/\s/) !== -1)
  22022. ) {
  22023. if (["not", "only", "and"].indexOf(node.value) !== -1) {
  22024. node.type = "keyword";
  22025. }
  22026. // if it's an expression, parse its contents
  22027. if (node.type === "media-feature-expression") {
  22028. node.nodes = parseMediaFeature(node.value, node.sourceIndex);
  22029. }
  22030. result.push(Array.isArray(node.nodes) ?
  22031. new Container(node) : new Node$1(node));
  22032. node = resetNode();
  22033. insideSomeValue = false;
  22034. }
  22035. }
  22036. // Now process the result array - to specify undefined types of the nodes
  22037. // and specify the `after` prop
  22038. for (let i = 0; i < result.length; i++) {
  22039. node = result[i];
  22040. if (i > 0) { result[i - 1].after = node.before; }
  22041. // Node types. Might not be set because contains interpolation/function
  22042. // calls or fully consists of them
  22043. if (node.type === undefined) {
  22044. if (i > 0) {
  22045. // only `and` can follow an expression
  22046. if (result[i - 1].type === "media-feature-expression") {
  22047. node.type = "keyword";
  22048. continue;
  22049. }
  22050. // Anything after 'only|not' is a media type
  22051. if (result[i - 1].value === "not" || result[i - 1].value === "only") {
  22052. node.type = "media-type";
  22053. continue;
  22054. }
  22055. // Anything after 'and' is an expression
  22056. if (result[i - 1].value === "and") {
  22057. node.type = "media-feature-expression";
  22058. continue;
  22059. }
  22060. if (result[i - 1].type === "media-type") {
  22061. // if it is the last element - it might be an expression
  22062. // or 'and' depending on what is after it
  22063. if (!result[i + 1]) {
  22064. node.type = "media-feature-expression";
  22065. } else {
  22066. node.type = result[i + 1].type === "media-feature-expression" ?
  22067. "keyword" : "media-feature-expression";
  22068. }
  22069. }
  22070. }
  22071. if (i === 0) {
  22072. // `screen`, `fn( ... )`, `#{ ... }`. Not an expression, since then
  22073. // its type would have been set by now
  22074. if (!result[i + 1]) {
  22075. node.type = "media-type";
  22076. continue;
  22077. }
  22078. // `screen and` or `#{...} (max-width: 10px)`
  22079. if (result[i + 1] &&
  22080. (result[i + 1].type === "media-feature-expression" ||
  22081. result[i + 1].type === "keyword")
  22082. ) {
  22083. node.type = "media-type";
  22084. continue;
  22085. }
  22086. if (result[i + 2]) {
  22087. // `screen and (color) ...`
  22088. if (result[i + 2].type === "media-feature-expression") {
  22089. node.type = "media-type";
  22090. result[i + 1].type = "keyword";
  22091. continue;
  22092. }
  22093. // `only screen and ...`
  22094. if (result[i + 2].type === "keyword") {
  22095. node.type = "keyword";
  22096. result[i + 1].type = "media-type";
  22097. continue;
  22098. }
  22099. }
  22100. if (result[i + 3]) {
  22101. // `screen and (color) ...`
  22102. if (result[i + 3].type === "media-feature-expression") {
  22103. node.type = "keyword";
  22104. result[i + 1].type = "media-type";
  22105. result[i + 2].type = "keyword";
  22106. continue;
  22107. }
  22108. }
  22109. }
  22110. }
  22111. }
  22112. return result;
  22113. }
  22114. /**
  22115. * Parses a media query list. Takes a possible `url()` at the start into
  22116. * account, and divides the list into media queries that are parsed separately
  22117. *
  22118. * @param {string} string - the source media query list string
  22119. *
  22120. * @return {Array} an array of Nodes/Containers
  22121. */
  22122. function parseMediaList(string) {
  22123. const result = [];
  22124. let interimIndex = 0, levelLocal = 0;
  22125. // Check for a `url(...)` part (if it is contents of an @import rule)
  22126. const doesHaveUrl = /^(\s*)url\s*\(/.exec(string);
  22127. if (doesHaveUrl !== null) {
  22128. let i = doesHaveUrl[0].length;
  22129. let parenthesesLv = 1;
  22130. while (parenthesesLv > 0) {
  22131. const character = string[i];
  22132. if (character === "(") { parenthesesLv++; }
  22133. if (character === ")") { parenthesesLv--; }
  22134. i++;
  22135. }
  22136. result.unshift(new Node$1({
  22137. type: "url",
  22138. value: string.substring(0, i).trim(),
  22139. sourceIndex: doesHaveUrl[1].length,
  22140. before: doesHaveUrl[1],
  22141. after: /^(\s*)/.exec(string.substring(i))[1],
  22142. }));
  22143. interimIndex = i;
  22144. }
  22145. // Start processing the media query list
  22146. for (let i = interimIndex; i < string.length; i++) {
  22147. const character = string[i];
  22148. // Dividing the media query list into comma-separated media queries
  22149. // Only count commas that are outside of any parens
  22150. // (i.e., not part of function call params list, etc.)
  22151. if (character === "(") { levelLocal++; }
  22152. if (character === ")") { levelLocal--; }
  22153. if (levelLocal === 0 && character === ",") {
  22154. const mediaQueryString = string.substring(interimIndex, i);
  22155. const spaceBefore = /^(\s*)/.exec(mediaQueryString)[1];
  22156. result.push(new Container({
  22157. type: "media-query",
  22158. value: mediaQueryString.trim(),
  22159. sourceIndex: interimIndex + spaceBefore.length,
  22160. nodes: parseMediaQuery(mediaQueryString, interimIndex),
  22161. before: spaceBefore,
  22162. after: /(\s*)$/.exec(mediaQueryString)[1],
  22163. }));
  22164. interimIndex = i + 1;
  22165. }
  22166. }
  22167. const mediaQueryString = string.substring(interimIndex);
  22168. const spaceBefore = /^(\s*)/.exec(mediaQueryString)[1];
  22169. result.push(new Container({
  22170. type: "media-query",
  22171. value: mediaQueryString.trim(),
  22172. sourceIndex: interimIndex + spaceBefore.length,
  22173. nodes: parseMediaQuery(mediaQueryString, interimIndex),
  22174. before: spaceBefore,
  22175. after: /(\s*)$/.exec(mediaQueryString)[1],
  22176. }));
  22177. return result;
  22178. }
  22179. function Container(opts) {
  22180. this.constructor(opts);
  22181. this.nodes = opts.nodes;
  22182. if (this.after === undefined) {
  22183. this.after = this.nodes.length > 0 ?
  22184. this.nodes[this.nodes.length - 1].after : "";
  22185. }
  22186. if (this.before === undefined) {
  22187. this.before = this.nodes.length > 0 ?
  22188. this.nodes[0].before : "";
  22189. }
  22190. if (this.sourceIndex === undefined) {
  22191. this.sourceIndex = this.before.length;
  22192. }
  22193. this.nodes.forEach(node => {
  22194. node.parent = this; // eslint-disable-line no-param-reassign
  22195. });
  22196. }
  22197. Container.prototype = Object.create(Node$1.prototype);
  22198. Container.constructor = Node$1;
  22199. /**
  22200. * Iterate over descendant nodes of the node
  22201. *
  22202. * @param {RegExp|string} filter - Optional. Only nodes with node.type that
  22203. * satisfies the filter will be traversed over
  22204. * @param {function} cb - callback to call on each node. Takes these params:
  22205. * node - the node being processed, i - it's index, nodes - the array
  22206. * of all nodes
  22207. * If false is returned, the iteration breaks
  22208. *
  22209. * @return (boolean) false, if the iteration was broken
  22210. */
  22211. Container.prototype.walk = function walk(filter, cb) {
  22212. const hasFilter = typeof filter === "string" || filter instanceof RegExp;
  22213. const callback = hasFilter ? cb : filter;
  22214. const filterReg = typeof filter === "string" ? new RegExp(filter) : filter;
  22215. for (let i = 0; i < this.nodes.length; i++) {
  22216. const node = this.nodes[i];
  22217. const filtered = hasFilter ? filterReg.test(node.type) : true;
  22218. if (filtered && callback && callback(node, i, this.nodes) === false) {
  22219. return false;
  22220. }
  22221. if (node.nodes && node.walk(filter, cb) === false) { return false; }
  22222. }
  22223. return true;
  22224. };
  22225. /**
  22226. * Iterate over immediate children of the node
  22227. *
  22228. * @param {function} cb - callback to call on each node. Takes these params:
  22229. * node - the node being processed, i - it's index, nodes - the array
  22230. * of all nodes
  22231. * If false is returned, the iteration breaks
  22232. *
  22233. * @return (boolean) false, if the iteration was broken
  22234. */
  22235. Container.prototype.each = function each(cb = () => { }) {
  22236. for (let i = 0; i < this.nodes.length; i++) {
  22237. const node = this.nodes[i];
  22238. if (cb(node, i, this.nodes) === false) { return false; }
  22239. }
  22240. return true;
  22241. };
  22242. /**
  22243. * A very generic node. Pretty much any element of a media query
  22244. */
  22245. function Node$1(opts) {
  22246. this.after = opts.after;
  22247. this.before = opts.before;
  22248. this.type = opts.type;
  22249. this.value = opts.value;
  22250. this.sourceIndex = opts.sourceIndex;
  22251. }
  22252. /*
  22253. * The MIT License (MIT)
  22254. *
  22255. * Author: Gildas Lormeau
  22256. *
  22257. * Permission is hereby granted, free of charge, to any person obtaining a copy
  22258. * of this software and associated documentation files (the "Software"), to deal
  22259. * in the Software without restriction, including without limitation the rights
  22260. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  22261. * copies of the Software, and to permit persons to whom the Software is
  22262. * furnished to do so, subject to the following conditions:
  22263. *
  22264. * The above copyright notice and this permission notice shall be included in all
  22265. * copies or substantial portions of the Software.
  22266. *
  22267. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  22268. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  22269. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  22270. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22271. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22272. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22273. * SOFTWARE.
  22274. */
  22275. // derived from https://github.com/fmarcia/UglifyCSS
  22276. /**
  22277. * UglifyCSS
  22278. * Port of YUI CSS Compressor to NodeJS
  22279. * Author: Franck Marcia - https://github.com/fmarcia
  22280. * MIT licenced
  22281. */
  22282. /**
  22283. * cssmin.js
  22284. * Author: Stoyan Stefanov - http://phpied.com/
  22285. * This is a JavaScript port of the CSS minification tool
  22286. * distributed with YUICompressor, itself a port
  22287. * of the cssmin utility by Isaac Schlueter - http://foohack.com/
  22288. * Permission is hereby granted to use the JavaScript version under the same
  22289. * conditions as the YUICompressor (original YUICompressor note below).
  22290. */
  22291. /**
  22292. * YUI Compressor
  22293. * http://developer.yahoo.com/yui/compressor/
  22294. * Author: Julien Lecomte - http://www.julienlecomte.net/
  22295. * Copyright (c) 2011 Yahoo! Inc. All rights reserved.
  22296. * The copyrights embodied in the content of this file are licensed
  22297. * by Yahoo! Inc. under the BSD (revised) open source license.
  22298. */
  22299. /**
  22300. * @type {string} - placeholder prefix
  22301. */
  22302. const ___PRESERVED_TOKEN_ = "___PRESERVED_TOKEN_";
  22303. /**
  22304. * @typedef {object} options - UglifyCSS options
  22305. * @property {number} [maxLineLen=0] - Maximum line length of uglified CSS
  22306. * @property {boolean} [expandVars=false] - Expand variables
  22307. * @property {boolean} [uglyComments=false] - Removes newlines within preserved comments
  22308. * @property {boolean} [cuteComments=false] - Preserves newlines within and around preserved comments
  22309. * @property {boolean} [debug=false] - Prints full error stack on error
  22310. * @property {string} [output=''] - Output file name
  22311. */
  22312. /**
  22313. * @type {options} - UglifyCSS options
  22314. */
  22315. const defaultOptions = {
  22316. maxLineLen: 0,
  22317. expandVars: false,
  22318. uglyComments: false,
  22319. cuteComments: false,
  22320. debug: false,
  22321. output: ""
  22322. };
  22323. const REGEXP_DATA_URI = /url\(\s*(["']?)data:/g;
  22324. const REGEXP_WHITE_SPACES = /\s+/g;
  22325. const REGEXP_NEW_LINE = /\n/g;
  22326. /**
  22327. * extractDataUrls replaces all data urls with tokens before we start
  22328. * compressing, to avoid performance issues running some of the subsequent
  22329. * regexes against large strings chunks.
  22330. *
  22331. * @param {string} css - CSS content
  22332. * @param {string[]} preservedTokens - Global array of tokens to preserve
  22333. *
  22334. * @return {string} Processed CSS
  22335. */
  22336. function extractDataUrls(css, preservedTokens) {
  22337. // Leave data urls alone to increase parse performance.
  22338. const pattern = REGEXP_DATA_URI;
  22339. const maxIndex = css.length - 1;
  22340. const sb = [];
  22341. let appendIndex = 0, match;
  22342. // Since we need to account for non-base64 data urls, we need to handle
  22343. // ' and ) being part of the data string. Hence switching to indexOf,
  22344. // to determine whether or not we have matching string terminators and
  22345. // handling sb appends directly, instead of using matcher.append* methods.
  22346. while ((match = pattern.exec(css)) !== null) {
  22347. const startIndex = match.index + 4; // 'url('.length()
  22348. let terminator = match[1]; // ', " or empty (not quoted)
  22349. if (terminator.length === 0) {
  22350. terminator = ")";
  22351. }
  22352. let foundTerminator = false, endIndex = pattern.lastIndex - 1;
  22353. while (foundTerminator === false && endIndex + 1 <= maxIndex && endIndex != -1) {
  22354. endIndex = css.indexOf(terminator, endIndex + 1);
  22355. // endIndex == 0 doesn't really apply here
  22356. if ((endIndex > 0) && (css.charAt(endIndex - 1) !== "\\")) {
  22357. foundTerminator = true;
  22358. if (")" != terminator) {
  22359. endIndex = css.indexOf(")", endIndex);
  22360. }
  22361. }
  22362. }
  22363. // Enough searching, start moving stuff over to the buffer
  22364. sb.push(css.substring(appendIndex, match.index));
  22365. if (foundTerminator) {
  22366. let token = css.substring(startIndex, endIndex);
  22367. const parts = token.split(",");
  22368. if (parts.length > 1 && parts[0].slice(-7) == ";base64") {
  22369. token = token.replace(REGEXP_WHITE_SPACES, "");
  22370. } else {
  22371. token = token.replace(REGEXP_NEW_LINE, " ");
  22372. token = token.replace(REGEXP_WHITE_SPACES, " ");
  22373. token = token.replace(REGEXP_PRESERVE_HSLA1, "");
  22374. }
  22375. preservedTokens.push(token);
  22376. const preserver = "url(" + ___PRESERVED_TOKEN_ + (preservedTokens.length - 1) + "___)";
  22377. sb.push(preserver);
  22378. appendIndex = endIndex + 1;
  22379. } else {
  22380. // No end terminator found, re-add the whole match. Should we throw/warn here?
  22381. sb.push(css.substring(match.index, pattern.lastIndex));
  22382. appendIndex = pattern.lastIndex;
  22383. }
  22384. }
  22385. sb.push(css.substring(appendIndex));
  22386. return sb.join("");
  22387. }
  22388. const REGEXP_HEX_COLORS = /(=\s*?["']?)?#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])(\}|[^0-9a-f{][^{]*?\})/gi;
  22389. /**
  22390. * compressHexColors compresses hex color values of the form #AABBCC to #ABC.
  22391. *
  22392. * DOES NOT compress CSS ID selectors which match the above pattern (which would
  22393. * break things), like #AddressForm { ... }
  22394. *
  22395. * DOES NOT compress IE filters, which have hex color values (which would break
  22396. * things), like chroma(color='#FFFFFF');
  22397. *
  22398. * DOES NOT compress invalid hex values, like background-color: #aabbccdd
  22399. *
  22400. * @param {string} css - CSS content
  22401. *
  22402. * @return {string} Processed CSS
  22403. */
  22404. function compressHexColors(css) {
  22405. // Look for hex colors inside { ... } (to avoid IDs) and which don't have a =, or a " in front of them (to avoid filters)
  22406. const pattern = REGEXP_HEX_COLORS;
  22407. const sb = [];
  22408. let index = 0, match;
  22409. while ((match = pattern.exec(css)) !== null) {
  22410. sb.push(css.substring(index, match.index));
  22411. const isFilter = match[1];
  22412. if (isFilter) {
  22413. // Restore, maintain case, otherwise filter will break
  22414. sb.push(match[1] + "#" + (match[2] + match[3] + match[4] + match[5] + match[6] + match[7]));
  22415. } else {
  22416. if (match[2].toLowerCase() == match[3].toLowerCase() &&
  22417. match[4].toLowerCase() == match[5].toLowerCase() &&
  22418. match[6].toLowerCase() == match[7].toLowerCase()) {
  22419. // Compress.
  22420. sb.push("#" + (match[3] + match[5] + match[7]).toLowerCase());
  22421. } else {
  22422. // Non compressible color, restore but lower case.
  22423. sb.push("#" + (match[2] + match[3] + match[4] + match[5] + match[6] + match[7]).toLowerCase());
  22424. }
  22425. }
  22426. index = pattern.lastIndex = pattern.lastIndex - match[8].length;
  22427. }
  22428. sb.push(css.substring(index));
  22429. return sb.join("");
  22430. }
  22431. const REGEXP_KEYFRAMES = /@[a-z0-9-_]*keyframes\s+[a-z0-9-_]+\s*{/gi;
  22432. const REGEXP_WHITE_SPACE = /(^\s|\s$)/g;
  22433. /** keyframes preserves 0 followed by unit in keyframes steps
  22434. *
  22435. * @param {string} content - CSS content
  22436. * @param {string[]} preservedTokens - Global array of tokens to preserve
  22437. *
  22438. * @return {string} Processed CSS
  22439. */
  22440. function keyframes(content, preservedTokens) {
  22441. const pattern = REGEXP_KEYFRAMES;
  22442. let index = 0, buffer;
  22443. const preserve = (part, i) => {
  22444. part = part.replace(REGEXP_WHITE_SPACE, "");
  22445. if (part.charAt(0) === "0") {
  22446. preservedTokens.push(part);
  22447. buffer[i] = ___PRESERVED_TOKEN_ + (preservedTokens.length - 1) + "___";
  22448. }
  22449. };
  22450. while (true) { // eslint-disable-line no-constant-condition
  22451. let level = 0;
  22452. buffer = "";
  22453. let startIndex = content.slice(index).search(pattern);
  22454. if (startIndex < 0) {
  22455. break;
  22456. }
  22457. index += startIndex;
  22458. startIndex = index;
  22459. const len = content.length;
  22460. const buffers = [];
  22461. for (; index < len; ++index) {
  22462. const ch = content.charAt(index);
  22463. if (ch === "{") {
  22464. if (level === 0) {
  22465. buffers.push(buffer.replace(REGEXP_WHITE_SPACE, ""));
  22466. } else if (level === 1) {
  22467. buffer = buffer.split(",");
  22468. buffer.forEach(preserve);
  22469. buffers.push(buffer.join(",").replace(REGEXP_WHITE_SPACE, ""));
  22470. }
  22471. buffer = "";
  22472. level += 1;
  22473. } else if (ch === "}") {
  22474. if (level === 2) {
  22475. buffers.push("{" + buffer.replace(REGEXP_WHITE_SPACE, "") + "}");
  22476. buffer = "";
  22477. } else if (level === 1) {
  22478. content = content.slice(0, startIndex) +
  22479. buffers.shift() + "{" +
  22480. buffers.join("") +
  22481. content.slice(index);
  22482. break;
  22483. }
  22484. level -= 1;
  22485. }
  22486. if (level < 0) {
  22487. break;
  22488. } else if (ch !== "{" && ch !== "}") {
  22489. buffer += ch;
  22490. }
  22491. }
  22492. }
  22493. return content;
  22494. }
  22495. /**
  22496. * collectComments collects all comment blocks and return new content with comment placeholders
  22497. *
  22498. * @param {string} content - CSS content
  22499. * @param {string[]} comments - Global array of extracted comments
  22500. *
  22501. * @return {string} Processed CSS
  22502. */
  22503. function collectComments(content, comments) {
  22504. const table = [];
  22505. let from = 0, end;
  22506. while (true) { // eslint-disable-line no-constant-condition
  22507. const start = content.indexOf("/*", from);
  22508. if (start > -1) {
  22509. end = content.indexOf("*/", start + 2);
  22510. if (end > -1) {
  22511. comments.push(content.slice(start + 2, end));
  22512. table.push(content.slice(from, start));
  22513. table.push("/*___PRESERVE_CANDIDATE_COMMENT_" + (comments.length - 1) + "___*/");
  22514. from = end + 2;
  22515. } else {
  22516. // unterminated comment
  22517. end = -2;
  22518. break;
  22519. }
  22520. } else {
  22521. break;
  22522. }
  22523. }
  22524. table.push(content.slice(end + 2));
  22525. return table.join("");
  22526. }
  22527. /**
  22528. * processString uglifies a CSS string
  22529. *
  22530. * @param {string} content - CSS string
  22531. * @param {options} options - UglifyCSS options
  22532. *
  22533. * @return {string} Uglified result
  22534. */
  22535. // const REGEXP_EMPTY_RULES = /[^};{/]+\{\}/g;
  22536. const REGEXP_PRESERVE_STRING1 = /"([^\\"])*"/g;
  22537. const REGEXP_PRESERVE_STRING1_BIS = /"(\\.)*"/g;
  22538. const REGEXP_PRESERVE_STRING1_TER = /"(\\)*"/g;
  22539. const REGEXP_PRESERVE_STRING2 = /'([^\\'])*'/g;
  22540. const REGEXP_PRESERVE_STRING2_BIS = /'(\\.)*'/g;
  22541. const REGEXP_PRESERVE_STRING2_TER = /'(\\)*'/g;
  22542. const REGEXP_MINIFY_ALPHA = /progid:DXImageTransform.Microsoft.Alpha\(Opacity=/gi;
  22543. const REGEXP_PRESERVE_TOKEN1 = /\r\n/g;
  22544. const REGEXP_PRESERVE_TOKEN2 = /[\r\n]/g;
  22545. const REGEXP_VARIABLES = /@variables\s*\{\s*([^}]+)\s*\}/g;
  22546. const REGEXP_VARIABLE = /\s*([a-z0-9-]+)\s*:\s*([^;}]+)\s*/gi;
  22547. const REGEXP_VARIABLE_VALUE = /var\s*\(\s*([^)]+)\s*\)/g;
  22548. const REGEXP_PRESERVE_CALC = /calc\(([^;}]*)\)/g;
  22549. const REGEXP_TRIM = /(^\s*|\s*$)/g;
  22550. const REGEXP_PRESERVE_CALC2 = /\( /g;
  22551. const REGEXP_PRESERVE_CALC3 = / \)/g;
  22552. const REGEXP_PRESERVE_MATRIX = /\s*filter:\s*progid:DXImageTransform.Microsoft.Matrix\(([^)]+)\);/g;
  22553. const REGEXP_REMOVE_SPACES = /(^|\})(([^{:])+:)+([^{]*{)/g;
  22554. const REGEXP_REMOVE_SPACES2 = /\s+([!{;:>+()\],])/g;
  22555. const REGEXP_REMOVE_SPACES2_BIS = /([^\\])\s+([}])/g;
  22556. const REGEXP_RESTORE_SPACE_IMPORTANT = /!important/g;
  22557. const REGEXP_PSEUDOCLASSCOLON = /___PSEUDOCLASSCOLON___/g;
  22558. const REGEXP_COLUMN = /:/g;
  22559. const REGEXP_PRESERVE_ZERO_UNIT = /\s*(animation|animation-delay|animation-duration|transition|transition-delay|transition-duration):\s*([^;}]+)/gi;
  22560. const REGEXP_PRESERVE_ZERO_UNIT1 = /(^|\D)0?\.?0(m?s)/gi;
  22561. const REGEXP_PRESERVE_FLEX = /\s*(flex|flex-basis):\s*([^;}]+)/gi;
  22562. const REGEXP_SPACES = /\s+/;
  22563. const REGEXP_PRESERVE_HSLA = /(hsla?)\(([^)]+)\)/g;
  22564. const REGEXP_PRESERVE_HSLA1 = /(^\s+|\s+$)/g;
  22565. const REGEXP_RETAIN_SPACE_IE6 = /:first-(line|letter)(\{|,)/gi;
  22566. const REGEXP_CHARSET = /^(.*)(@charset)( "[^"]*";)/gi;
  22567. const REGEXP_REMOVE_SECOND_CHARSET = /^((\s*)(@charset)( [^;]+;\s*))+/gi;
  22568. const REGEXP_LOWERCASE_DIRECTIVES = /@(font-face|import|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?keyframe|media|page|namespace)/gi;
  22569. const REGEXP_LOWERCASE_PSEUDO_ELEMENTS = /:(active|after|before|checked|disabled|empty|enabled|first-(?:child|of-type)|focus|hover|last-(?:child|of-type)|link|only-(?:child|of-type)|root|:selection|target|visited)/gi;
  22570. const REGEXP_CHARSET2 = /^(.*)(@charset "[^"]*";)/g;
  22571. const REGEXP_CHARSET3 = /^(\s*@charset [^;]+;\s*)+/g;
  22572. const REGEXP_LOWERCASE_FUNCTIONS = /:(lang|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?any)\(/gi;
  22573. const REGEXP_LOWERCASE_FUNCTIONS2 = /([:,( ]\s*)(attr|color-stop|from|rgba|to|url|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?(?:calc|max|min|(?:repeating-)?(?:linear|radial)-gradient)|-webkit-gradient)/gi;
  22574. const REGEXP_NEWLINE1 = /\s*\/\*/g;
  22575. const REGEXP_NEWLINE2 = /\*\/\s*/g;
  22576. const REGEXP_RESTORE_SPACE1 = /\band\(/gi;
  22577. const REGEXP_RESTORE_SPACE2 = /([^:])not\(/gi;
  22578. const REGEXP_RESTORE_SPACE3 = /\bor\(/gi;
  22579. const REGEXP_REMOVE_SPACES3 = /([!{}:;>+([,])\s+/g;
  22580. const REGEXP_REMOVE_SEMI_COLUMNS = /;+\}/g;
  22581. // const REGEXP_REPLACE_ZERO = /(^|[^.0-9\\])(?:0?\.)?0(?:ex|ch|r?em|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|g?rad|turn|ms|k?Hz|dpi|dpcm|dppx|%)(?![a-z0-9])/gi;
  22582. const REGEXP_REPLACE_ZERO_DOT = /([0-9])\.0(ex|ch|r?em|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|g?rad|turn|m?s|k?Hz|dpi|dpcm|dppx|%| |;)/gi;
  22583. const REGEXP_REPLACE_4_ZEROS = /:0 0 0 0(;|\})/g;
  22584. const REGEXP_REPLACE_3_ZEROS = /:0 0 0(;|\})/g;
  22585. // const REGEXP_REPLACE_2_ZEROS = /:0 0(;|\})/g;
  22586. const REGEXP_REPLACE_1_ZERO = /(transform-origin|webkit-transform-origin|moz-transform-origin|o-transform-origin|ms-transform-origin|box-shadow):0(;|\})/gi;
  22587. const REGEXP_REPLACE_ZERO_DOT_DECIMAL = /(:|\s)0+\.(\d+)/g;
  22588. const REGEXP_REPLACE_RGB = /rgb\s*\(\s*([0-9,\s]+)\s*\)/gi;
  22589. const REGEXP_REPLACE_BORDER_ZERO = /(border|border-top|border-right|border-bottom|border-left|outline|background):none(;|\})/gi;
  22590. const REGEXP_REPLACE_IE_OPACITY = /progid:DXImageTransform\.Microsoft\.Alpha\(Opacity=/gi;
  22591. const REGEXP_REPLACE_QUERY_FRACTION = /\(([-A-Za-z]+):([0-9]+)\/([0-9]+)\)/g;
  22592. const REGEXP_QUERY_FRACTION = /___QUERY_FRACTION___/g;
  22593. const REGEXP_REPLACE_SEMI_COLUMNS = /;;+/g;
  22594. const REGEXP_REPLACE_HASH_COLOR = /(:|\s)(#f00)(;|})/g;
  22595. const REGEXP_PRESERVED_NEWLINE = /___PRESERVED_NEWLINE___/g;
  22596. const REGEXP_REPLACE_HASH_COLOR_SHORT1 = /(:|\s)(#000080)(;|})/g;
  22597. const REGEXP_REPLACE_HASH_COLOR_SHORT2 = /(:|\s)(#808080)(;|})/g;
  22598. const REGEXP_REPLACE_HASH_COLOR_SHORT3 = /(:|\s)(#808000)(;|})/g;
  22599. const REGEXP_REPLACE_HASH_COLOR_SHORT4 = /(:|\s)(#800080)(;|})/g;
  22600. const REGEXP_REPLACE_HASH_COLOR_SHORT5 = /(:|\s)(#c0c0c0)(;|})/g;
  22601. const REGEXP_REPLACE_HASH_COLOR_SHORT6 = /(:|\s)(#008080)(;|})/g;
  22602. const REGEXP_REPLACE_HASH_COLOR_SHORT7 = /(:|\s)(#ffa500)(;|})/g;
  22603. const REGEXP_REPLACE_HASH_COLOR_SHORT8 = /(:|\s)(#800000)(;|})/g;
  22604. function processString(content = "", options = defaultOptions) {
  22605. const comments = [];
  22606. const preservedTokens = [];
  22607. let pattern;
  22608. const originalContent = content;
  22609. content = extractDataUrls(content, preservedTokens);
  22610. content = collectComments(content, comments);
  22611. preserveString(REGEXP_PRESERVE_STRING1);
  22612. preserveString(REGEXP_PRESERVE_STRING1_BIS);
  22613. preserveString(REGEXP_PRESERVE_STRING1_TER);
  22614. preserveString(REGEXP_PRESERVE_STRING2);
  22615. preserveString(REGEXP_PRESERVE_STRING2_BIS);
  22616. preserveString(REGEXP_PRESERVE_STRING2_TER);
  22617. function preserveString(pattern) {
  22618. content = content.replace(pattern, token => {
  22619. const quote = token.substring(0, 1);
  22620. token = token.slice(1, -1);
  22621. // maybe the string contains a comment-like substring or more? put'em back then
  22622. if (token.indexOf("___PRESERVE_CANDIDATE_COMMENT_") >= 0) {
  22623. for (let i = 0, len = comments.length; i < len; i += 1) {
  22624. token = token.replace("___PRESERVE_CANDIDATE_COMMENT_" + i + "___", comments[i]);
  22625. }
  22626. }
  22627. // minify alpha opacity in filter strings
  22628. token = token.replace(REGEXP_MINIFY_ALPHA, "alpha(opacity=");
  22629. preservedTokens.push(token);
  22630. return quote + ___PRESERVED_TOKEN_ + (preservedTokens.length - 1) + "___" + quote;
  22631. });
  22632. }
  22633. // strings are safe, now wrestle the comments
  22634. for (let i = 0, len = comments.length; i < len; i += 1) {
  22635. const token = comments[i];
  22636. const placeholder = "___PRESERVE_CANDIDATE_COMMENT_" + i + "___";
  22637. // ! in the first position of the comment means preserve
  22638. // so push to the preserved tokens keeping the !
  22639. if (token.charAt(0) === "!") {
  22640. if (options.cuteComments) {
  22641. preservedTokens.push(token.substring(1).replace(REGEXP_PRESERVE_TOKEN1, "\n"));
  22642. } else if (options.uglyComments) {
  22643. preservedTokens.push(token.substring(1).replace(REGEXP_PRESERVE_TOKEN2, ""));
  22644. } else {
  22645. preservedTokens.push(token);
  22646. }
  22647. content = content.replace(placeholder, ___PRESERVED_TOKEN_ + (preservedTokens.length - 1) + "___");
  22648. continue;
  22649. }
  22650. // \ in the last position looks like hack for Mac/IE5
  22651. // shorten that to /*\*/ and the next one to /**/
  22652. if (token.charAt(token.length - 1) === "\\") {
  22653. preservedTokens.push("\\");
  22654. content = content.replace(placeholder, ___PRESERVED_TOKEN_ + (preservedTokens.length - 1) + "___");
  22655. i = i + 1; // attn: advancing the loop
  22656. preservedTokens.push("");
  22657. content = content.replace(
  22658. "___PRESERVE_CANDIDATE_COMMENT_" + i + "___",
  22659. ___PRESERVED_TOKEN_ + (preservedTokens.length - 1) + "___"
  22660. );
  22661. continue;
  22662. }
  22663. // keep empty comments after child selectors (IE7 hack)
  22664. // e.g. html >/**/ body
  22665. if (token.length === 0) {
  22666. const startIndex = content.indexOf(placeholder);
  22667. if (startIndex > 2) {
  22668. if (content.charAt(startIndex - 3) === ">") {
  22669. preservedTokens.push("");
  22670. content = content.replace(placeholder, ___PRESERVED_TOKEN_ + (preservedTokens.length - 1) + "___");
  22671. }
  22672. }
  22673. }
  22674. // in all other cases kill the comment
  22675. content = content.replace(`/*${placeholder}*/`, "");
  22676. }
  22677. // parse simple @variables blocks and remove them
  22678. if (options.expandVars) {
  22679. const vars = {};
  22680. pattern = REGEXP_VARIABLES;
  22681. content = content.replace(pattern, (_, f1) => {
  22682. pattern = REGEXP_VARIABLE;
  22683. f1.replace(pattern, (_, f1, f2) => {
  22684. if (f1 && f2) {
  22685. vars[f1] = f2;
  22686. }
  22687. return "";
  22688. });
  22689. return "";
  22690. });
  22691. // replace var(x) with the value of x
  22692. pattern = REGEXP_VARIABLE_VALUE;
  22693. content = content.replace(pattern, (_, f1) => {
  22694. return vars[f1] || "none";
  22695. });
  22696. }
  22697. // normalize all whitespace strings to single spaces. Easier to work with that way.
  22698. content = content.replace(REGEXP_WHITE_SPACES, " ");
  22699. // preserve formulas in calc() before removing spaces
  22700. pattern = REGEXP_PRESERVE_CALC;
  22701. content = content.replace(pattern, (_, f1) => {
  22702. preservedTokens.push(
  22703. "calc(" +
  22704. f1.replace(REGEXP_TRIM, "")
  22705. .replace(REGEXP_PRESERVE_CALC2, "(")
  22706. .replace(REGEXP_PRESERVE_CALC3, ")") +
  22707. ")"
  22708. );
  22709. return ___PRESERVED_TOKEN_ + (preservedTokens.length - 1) + "___";
  22710. });
  22711. // preserve matrix
  22712. pattern = REGEXP_PRESERVE_MATRIX;
  22713. content = content.replace(pattern, (_, f1) => {
  22714. preservedTokens.push(f1);
  22715. return "filter:progid:DXImageTransform.Microsoft.Matrix(" + ___PRESERVED_TOKEN_ + (preservedTokens.length - 1) + "___);";
  22716. });
  22717. // remove the spaces before the things that should not have spaces before them.
  22718. // but, be careful not to turn 'p :link {...}' into 'p:link{...}'
  22719. // swap out any pseudo-class colons with the token, and then swap back.
  22720. try {
  22721. pattern = REGEXP_REMOVE_SPACES;
  22722. content = content.replace(pattern, token => token.replace(REGEXP_COLUMN, "___PSEUDOCLASSCOLON___"));
  22723. } catch (_error) {
  22724. // ignored
  22725. }
  22726. // remove spaces before the things that should not have spaces before them.
  22727. content = content.replace(REGEXP_REMOVE_SPACES2, "$1");
  22728. content = content.replace(REGEXP_REMOVE_SPACES2_BIS, "$1$2");
  22729. // restore spaces for !important
  22730. content = content.replace(REGEXP_RESTORE_SPACE_IMPORTANT, " !important");
  22731. // bring back the colon
  22732. content = content.replace(REGEXP_PSEUDOCLASSCOLON, ":");
  22733. // preserve 0 followed by a time unit for properties using time units
  22734. pattern = REGEXP_PRESERVE_ZERO_UNIT;
  22735. content = content.replace(pattern, (_, f1, f2) => {
  22736. f2 = f2.replace(REGEXP_PRESERVE_ZERO_UNIT1, (_, g1, g2) => {
  22737. preservedTokens.push("0" + g2);
  22738. return g1 + ___PRESERVED_TOKEN_ + (preservedTokens.length - 1) + "___";
  22739. });
  22740. return f1 + ":" + f2;
  22741. });
  22742. // preserve unit for flex-basis within flex and flex-basis (ie10 bug)
  22743. pattern = REGEXP_PRESERVE_FLEX;
  22744. content = content.replace(pattern, (_, f1, f2) => {
  22745. let f2b = f2.split(REGEXP_SPACES);
  22746. preservedTokens.push(f2b.pop());
  22747. f2b.push(___PRESERVED_TOKEN_ + (preservedTokens.length - 1) + "___");
  22748. f2b = f2b.join(" ");
  22749. return `${f1}:${f2b}`;
  22750. });
  22751. // preserve 0% in hsl and hsla color definitions
  22752. content = content.replace(REGEXP_PRESERVE_HSLA, (_, f1, f2) => {
  22753. const f0 = [];
  22754. f2.split(",").forEach(part => {
  22755. part = part.replace(REGEXP_PRESERVE_HSLA1, "");
  22756. if (part === "0%") {
  22757. preservedTokens.push("0%");
  22758. f0.push(___PRESERVED_TOKEN_ + (preservedTokens.length - 1) + "___");
  22759. } else {
  22760. f0.push(part);
  22761. }
  22762. });
  22763. return f1 + "(" + f0.join(",") + ")";
  22764. });
  22765. // preserve 0 followed by unit in keyframes steps (WIP)
  22766. content = keyframes(content, preservedTokens);
  22767. // retain space for special IE6 cases
  22768. content = content.replace(REGEXP_RETAIN_SPACE_IE6, (_, f1, f2) => ":first-" + f1.toLowerCase() + " " + f2);
  22769. // newlines before and after the end of a preserved comment
  22770. if (options.cuteComments) {
  22771. content = content.replace(REGEXP_NEWLINE1, "___PRESERVED_NEWLINE___/*");
  22772. content = content.replace(REGEXP_NEWLINE2, "*/___PRESERVED_NEWLINE___");
  22773. // no space after the end of a preserved comment
  22774. } else {
  22775. content = content.replace(REGEXP_NEWLINE2, "*/");
  22776. }
  22777. // If there are multiple @charset directives, push them to the top of the file.
  22778. pattern = REGEXP_CHARSET;
  22779. content = content.replace(pattern, (_, f1, f2, f3) => f2.toLowerCase() + f3 + f1);
  22780. // When all @charset are at the top, remove the second and after (as they are completely ignored).
  22781. pattern = REGEXP_REMOVE_SECOND_CHARSET;
  22782. content = content.replace(pattern, (_, __, f2, f3, f4) => f2 + f3.toLowerCase() + f4);
  22783. // lowercase some popular @directives (@charset is done right above)
  22784. pattern = REGEXP_LOWERCASE_DIRECTIVES;
  22785. content = content.replace(pattern, (_, f1) => "@" + f1.toLowerCase());
  22786. // lowercase some more common pseudo-elements
  22787. pattern = REGEXP_LOWERCASE_PSEUDO_ELEMENTS;
  22788. content = content.replace(pattern, (_, f1) => ":" + f1.toLowerCase());
  22789. // if there is a @charset, then only allow one, and push to the top of the file.
  22790. content = content.replace(REGEXP_CHARSET2, "$2$1");
  22791. content = content.replace(REGEXP_CHARSET3, "$1");
  22792. // lowercase some more common functions
  22793. pattern = REGEXP_LOWERCASE_FUNCTIONS;
  22794. content = content.replace(pattern, (_, f1) => ":" + f1.toLowerCase() + "(");
  22795. // lower case some common function that can be values
  22796. // NOTE: rgb() isn't useful as we replace with #hex later, as well as and() is already done for us right after this
  22797. pattern = REGEXP_LOWERCASE_FUNCTIONS2;
  22798. content = content.replace(pattern, (_, f1, f2) => f1 + f2.toLowerCase());
  22799. // put the space back in some cases, to support stuff like
  22800. // @media screen and (-webkit-min-device-pixel-ratio:0){
  22801. content = content.replace(REGEXP_RESTORE_SPACE1, "and (");
  22802. content = content.replace(REGEXP_RESTORE_SPACE2, "$1not (");
  22803. content = content.replace(REGEXP_RESTORE_SPACE3, "or (");
  22804. // remove the spaces after the things that should not have spaces after them.
  22805. content = content.replace(REGEXP_REMOVE_SPACES3, "$1");
  22806. // remove unnecessary semicolons
  22807. content = content.replace(REGEXP_REMOVE_SEMI_COLUMNS, "}");
  22808. // replace 0(px,em,%) with 0.
  22809. // content = content.replace(REGEXP_REPLACE_ZERO, "$10");
  22810. // Replace x.0(px,em,%) with x(px,em,%).
  22811. content = content.replace(REGEXP_REPLACE_ZERO_DOT, "$1$2");
  22812. // replace 0 0 0 0; with 0.
  22813. content = content.replace(REGEXP_REPLACE_4_ZEROS, ":0$1");
  22814. content = content.replace(REGEXP_REPLACE_3_ZEROS, ":0$1");
  22815. // content = content.replace(REGEXP_REPLACE_2_ZEROS, ":0$1");
  22816. // replace background-position:0; with background-position:0 0;
  22817. // same for transform-origin and box-shadow
  22818. pattern = REGEXP_REPLACE_1_ZERO;
  22819. content = content.replace(pattern, (_, f1, f2) => f1.toLowerCase() + ":0 0" + f2);
  22820. // replace 0.6 to .6, but only when preceded by : or a white-space
  22821. content = content.replace(REGEXP_REPLACE_ZERO_DOT_DECIMAL, "$1.$2");
  22822. // shorten colors from rgb(51,102,153) to #336699
  22823. // this makes it more likely that it'll get further compressed in the next step.
  22824. pattern = REGEXP_REPLACE_RGB;
  22825. content = content.replace(pattern, (_, f1) => {
  22826. const rgbcolors = f1.split(",");
  22827. let hexcolor = "#";
  22828. for (let i = 0; i < rgbcolors.length; i += 1) {
  22829. let val = parseInt(rgbcolors[i], 10);
  22830. if (val < 16) {
  22831. hexcolor += "0";
  22832. }
  22833. if (val > 255) {
  22834. val = 255;
  22835. }
  22836. hexcolor += val.toString(16);
  22837. }
  22838. return hexcolor;
  22839. });
  22840. // Shorten colors from #AABBCC to #ABC.
  22841. content = compressHexColors(content);
  22842. // Replace #f00 -> red
  22843. content = content.replace(REGEXP_REPLACE_HASH_COLOR, "$1red$3");
  22844. // Replace other short color keywords
  22845. content = content.replace(REGEXP_REPLACE_HASH_COLOR_SHORT1, "$1navy$3");
  22846. content = content.replace(REGEXP_REPLACE_HASH_COLOR_SHORT2, "$1gray$3");
  22847. content = content.replace(REGEXP_REPLACE_HASH_COLOR_SHORT3, "$1olive$3");
  22848. content = content.replace(REGEXP_REPLACE_HASH_COLOR_SHORT4, "$1purple$3");
  22849. content = content.replace(REGEXP_REPLACE_HASH_COLOR_SHORT5, "$1silver$3");
  22850. content = content.replace(REGEXP_REPLACE_HASH_COLOR_SHORT6, "$1teal$3");
  22851. content = content.replace(REGEXP_REPLACE_HASH_COLOR_SHORT7, "$1orange$3");
  22852. content = content.replace(REGEXP_REPLACE_HASH_COLOR_SHORT8, "$1maroon$3");
  22853. // border: none -> border:0
  22854. pattern = REGEXP_REPLACE_BORDER_ZERO;
  22855. content = content.replace(pattern, (_, f1, f2) => f1.toLowerCase() + ":0" + f2);
  22856. // shorter opacity IE filter
  22857. content = content.replace(REGEXP_REPLACE_IE_OPACITY, "alpha(opacity=");
  22858. // Find a fraction that is used for Opera's -o-device-pixel-ratio query
  22859. // Add token to add the '\' back in later
  22860. content = content.replace(REGEXP_REPLACE_QUERY_FRACTION, "($1:$2___QUERY_FRACTION___$3)");
  22861. // remove empty rules.
  22862. // content = content.replace(REGEXP_EMPTY_RULES, "");
  22863. // Add '\' back to fix Opera -o-device-pixel-ratio query
  22864. content = content.replace(REGEXP_QUERY_FRACTION, "/");
  22865. // some source control tools don't like it when files containing lines longer
  22866. // than, say 8000 characters, are checked in. The linebreak option is used in
  22867. // that case to split long lines after a specific column.
  22868. if (options.maxLineLen > 0) {
  22869. const lines = [];
  22870. let line = [];
  22871. for (let i = 0, len = content.length; i < len; i += 1) {
  22872. const ch = content.charAt(i);
  22873. line.push(ch);
  22874. if (ch === "}" && line.length > options.maxLineLen) {
  22875. lines.push(line.join(""));
  22876. line = [];
  22877. }
  22878. }
  22879. if (line.length) {
  22880. lines.push(line.join(""));
  22881. }
  22882. content = lines.join("\n");
  22883. }
  22884. // replace multiple semi-colons in a row by a single one
  22885. // see SF bug #1980989
  22886. content = content.replace(REGEXP_REPLACE_SEMI_COLUMNS, ";");
  22887. // trim the final string (for any leading or trailing white spaces)
  22888. content = content.replace(REGEXP_TRIM, "");
  22889. if (preservedTokens.length > 1000) {
  22890. return originalContent;
  22891. }
  22892. // restore preserved tokens
  22893. for (let i = preservedTokens.length - 1; i >= 0; i--) {
  22894. content = content.replace(___PRESERVED_TOKEN_ + i + "___", preservedTokens[i], "g");
  22895. }
  22896. // restore preserved newlines
  22897. content = content.replace(REGEXP_PRESERVED_NEWLINE, "\n");
  22898. // return
  22899. return content;
  22900. }
  22901. /*
  22902. * The MIT License (MIT)
  22903. *
  22904. * Author: Gildas Lormeau
  22905. *
  22906. * Permission is hereby granted, free of charge, to any person obtaining a copy
  22907. * of this software and associated documentation files (the "Software"), to deal
  22908. * in the Software without restriction, including without limitation the rights
  22909. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  22910. * copies of the Software, and to permit persons to whom the Software is
  22911. * furnished to do so, subject to the following conditions:
  22912. *
  22913. * The above copyright notice and this permission notice shall be included in all
  22914. * copies or substantial portions of the Software.
  22915. *
  22916. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  22917. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  22918. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  22919. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22920. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22921. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  22922. * SOFTWARE.
  22923. */
  22924. // 1. Let input be the value passed to this algorithm.
  22925. function process$5(input) {
  22926. // UTILITY FUNCTIONS
  22927. // Manual is faster than RegEx
  22928. // http://bjorn.tipling.com/state-and-regular-expressions-in-javascript
  22929. // http://jsperf.com/whitespace-character/5
  22930. function isSpace(c) {
  22931. return (c === "\u0020" || // space
  22932. c === "\u0009" || // horizontal tab
  22933. c === "\u000A" || // new line
  22934. c === "\u000C" || // form feed
  22935. c === "\u000D"); // carriage return
  22936. }
  22937. function collectCharacters(regEx) {
  22938. let chars;
  22939. const match = regEx.exec(input.substring(pos));
  22940. if (match) {
  22941. chars = match[0];
  22942. pos += chars.length;
  22943. return chars;
  22944. }
  22945. }
  22946. const inputLength = input.length;
  22947. // (Don"t use \s, to avoid matching non-breaking space)
  22948. /* eslint-disable no-control-regex */
  22949. const regexLeadingSpaces = /^[ \t\n\r\u000c]+/;
  22950. const regexLeadingCommasOrSpaces = /^[, \t\n\r\u000c]+/;
  22951. const regexLeadingNotSpaces = /^[^ \t\n\r\u000c]+/;
  22952. const regexTrailingCommas = /[,]+$/;
  22953. const regexNonNegativeInteger = /^\d+$/;
  22954. /* eslint-enable no-control-regex */
  22955. // ( Positive or negative or unsigned integers or decimals, without or without exponents.
  22956. // Must include at least one digit.
  22957. // According to spec tests any decimal point must be followed by a digit.
  22958. // No leading plus sign is allowed.)
  22959. // https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number
  22960. const regexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/;
  22961. let url, descriptors, currentDescriptor, state, c,
  22962. // 2. Let position be a pointer into input, initially pointing at the start
  22963. // of the string.
  22964. pos = 0;
  22965. // 3. Let candidates be an initially empty source set.
  22966. const candidates = [];
  22967. // 4. Splitting loop: Collect a sequence of characters that are space
  22968. // characters or U+002C COMMA characters. If any U+002C COMMA characters
  22969. // were collected, that is a parse error.
  22970. while (true) { // eslint-disable-line no-constant-condition
  22971. collectCharacters(regexLeadingCommasOrSpaces);
  22972. // 5. If position is past the end of input, return candidates and abort these steps.
  22973. if (pos >= inputLength) {
  22974. return candidates; // (we"re done, this is the sole return path)
  22975. }
  22976. // 6. Collect a sequence of characters that are not space characters,
  22977. // and let that be url.
  22978. url = collectCharacters(regexLeadingNotSpaces);
  22979. // 7. Let descriptors be a new empty list.
  22980. descriptors = [];
  22981. // 8. If url ends with a U+002C COMMA character (,), follow these substeps:
  22982. // (1). Remove all trailing U+002C COMMA characters from url. If this removed
  22983. // more than one character, that is a parse error.
  22984. if (url.slice(-1) === ",") {
  22985. url = url.replace(regexTrailingCommas, "");
  22986. // (Jump ahead to step 9 to skip tokenization and just push the candidate).
  22987. parseDescriptors();
  22988. // Otherwise, follow these substeps:
  22989. } else {
  22990. tokenize();
  22991. } // (close else of step 8)
  22992. // 16. Return to the step labeled splitting loop.
  22993. } // (Close of big while loop.)
  22994. /**
  22995. * Tokenizes descriptor properties prior to parsing
  22996. * Returns undefined.
  22997. */
  22998. function tokenize() {
  22999. // 8.1. Descriptor tokeniser: Skip whitespace
  23000. collectCharacters(regexLeadingSpaces);
  23001. // 8.2. Let current descriptor be the empty string.
  23002. currentDescriptor = "";
  23003. // 8.3. Let state be in descriptor.
  23004. state = "in descriptor";
  23005. while (true) { // eslint-disable-line no-constant-condition
  23006. // 8.4. Let c be the character at position.
  23007. c = input.charAt(pos);
  23008. // Do the following depending on the value of state.
  23009. // For the purpose of this step, "EOF" is a special character representing
  23010. // that position is past the end of input.
  23011. // In descriptor
  23012. if (state === "in descriptor") {
  23013. // Do the following, depending on the value of c:
  23014. // Space character
  23015. // If current descriptor is not empty, append current descriptor to
  23016. // descriptors and let current descriptor be the empty string.
  23017. // Set state to after descriptor.
  23018. if (isSpace(c)) {
  23019. if (currentDescriptor) {
  23020. descriptors.push(currentDescriptor);
  23021. currentDescriptor = "";
  23022. state = "after descriptor";
  23023. }
  23024. // U+002C COMMA (,)
  23025. // Advance position to the next character in input. If current descriptor
  23026. // is not empty, append current descriptor to descriptors. Jump to the step
  23027. // labeled descriptor parser.
  23028. } else if (c === ",") {
  23029. pos += 1;
  23030. if (currentDescriptor) {
  23031. descriptors.push(currentDescriptor);
  23032. }
  23033. parseDescriptors();
  23034. return;
  23035. // U+0028 LEFT PARENTHESIS (()
  23036. // Append c to current descriptor. Set state to in parens.
  23037. } else if (c === "\u0028") {
  23038. currentDescriptor = currentDescriptor + c;
  23039. state = "in parens";
  23040. // EOF
  23041. // If current descriptor is not empty, append current descriptor to
  23042. // descriptors. Jump to the step labeled descriptor parser.
  23043. } else if (c === "") {
  23044. if (currentDescriptor) {
  23045. descriptors.push(currentDescriptor);
  23046. }
  23047. parseDescriptors();
  23048. return;
  23049. // Anything else
  23050. // Append c to current descriptor.
  23051. } else {
  23052. currentDescriptor = currentDescriptor + c;
  23053. }
  23054. // (end "in descriptor"
  23055. // In parens
  23056. } else if (state === "in parens") {
  23057. // U+0029 RIGHT PARENTHESIS ())
  23058. // Append c to current descriptor. Set state to in descriptor.
  23059. if (c === ")") {
  23060. currentDescriptor = currentDescriptor + c;
  23061. state = "in descriptor";
  23062. // EOF
  23063. // Append current descriptor to descriptors. Jump to the step labeled
  23064. // descriptor parser.
  23065. } else if (c === "") {
  23066. descriptors.push(currentDescriptor);
  23067. parseDescriptors();
  23068. return;
  23069. // Anything else
  23070. // Append c to current descriptor.
  23071. } else {
  23072. currentDescriptor = currentDescriptor + c;
  23073. }
  23074. // After descriptor
  23075. } else if (state === "after descriptor") {
  23076. // Do the following, depending on the value of c:
  23077. // Space character: Stay in this state.
  23078. if (isSpace(c)) ; else if (c === "") {
  23079. parseDescriptors();
  23080. return;
  23081. // Anything else
  23082. // Set state to in descriptor. Set position to the previous character in input.
  23083. } else {
  23084. state = "in descriptor";
  23085. pos -= 1;
  23086. }
  23087. }
  23088. // Advance position to the next character in input.
  23089. pos += 1;
  23090. // Repeat this step.
  23091. } // (close while true loop)
  23092. }
  23093. /**
  23094. * Adds descriptor properties to a candidate, pushes to the candidates array
  23095. * @return undefined
  23096. */
  23097. // Declared outside of the while loop so that it"s only created once.
  23098. function parseDescriptors() {
  23099. // 9. Descriptor parser: Let error be no.
  23100. let pError = false,
  23101. // 10. Let width be absent.
  23102. // 11. Let density be absent.
  23103. // 12. Let future-compat-h be absent. (We"re implementing it now as h)
  23104. w, d, h, i,
  23105. desc, lastChar, value, intVal, floatVal;
  23106. const candidate = {};
  23107. // 13. For each descriptor in descriptors, run the appropriate set of steps
  23108. // from the following list:
  23109. for (i = 0; i < descriptors.length; i++) {
  23110. desc = descriptors[i];
  23111. lastChar = desc[desc.length - 1];
  23112. value = desc.substring(0, desc.length - 1);
  23113. intVal = parseInt(value, 10);
  23114. floatVal = parseFloat(value);
  23115. // If the descriptor consists of a valid non-negative integer followed by
  23116. // a U+0077 LATIN SMALL LETTER W character
  23117. if (regexNonNegativeInteger.test(value) && (lastChar === "w")) {
  23118. // If width and density are not both absent, then let error be yes.
  23119. if (w || d) { pError = true; }
  23120. // Apply the rules for parsing non-negative integers to the descriptor.
  23121. // If the result is zero, let error be yes.
  23122. // Otherwise, let width be the result.
  23123. if (intVal === 0) { pError = true; } else { w = intVal; }
  23124. // If the descriptor consists of a valid floating-point number followed by
  23125. // a U+0078 LATIN SMALL LETTER X character
  23126. } else if (regexFloatingPoint.test(value) && (lastChar === "x")) {
  23127. // If width, density and future-compat-h are not all absent, then let error
  23128. // be yes.
  23129. if (w || d || h) { pError = true; }
  23130. // Apply the rules for parsing floating-point number values to the descriptor.
  23131. // If the result is less than zero, let error be yes. Otherwise, let density
  23132. // be the result.
  23133. if (floatVal < 0) { pError = true; } else { d = floatVal; }
  23134. // If the descriptor consists of a valid non-negative integer followed by
  23135. // a U+0068 LATIN SMALL LETTER H character
  23136. } else if (regexNonNegativeInteger.test(value) && (lastChar === "h")) {
  23137. // If height and density are not both absent, then let error be yes.
  23138. if (h || d) { pError = true; }
  23139. // Apply the rules for parsing non-negative integers to the descriptor.
  23140. // If the result is zero, let error be yes. Otherwise, let future-compat-h
  23141. // be the result.
  23142. if (intVal === 0) { pError = true; } else { h = intVal; }
  23143. // Anything else, Let error be yes.
  23144. } else { pError = true; }
  23145. } // (close step 13 for loop)
  23146. // 15. If error is still no, then append a new image source to candidates whose
  23147. // URL is url, associated with a width width if not absent and a pixel
  23148. // density density if not absent. Otherwise, there is a parse error.
  23149. if (!pError) {
  23150. candidate.url = url;
  23151. if (w) { candidate.w = w; }
  23152. if (d) { candidate.d = d; }
  23153. if (h) { candidate.h = h; }
  23154. candidates.push(candidate);
  23155. } else if (console && console.log) { // eslint-disable-line no-console
  23156. console.log("Invalid srcset descriptor found in \"" + input + "\" at \"" + desc + "\"."); // eslint-disable-line no-console
  23157. }
  23158. } // (close parseDescriptors fn)
  23159. }
  23160. /*
  23161. * The MIT License (MIT)
  23162. *
  23163. * Author: Gildas Lormeau
  23164. *
  23165. * Permission is hereby granted, free of charge, to any person obtaining a copy
  23166. * of this software and associated documentation files (the "Software"), to deal
  23167. * in the Software without restriction, including without limitation the rights
  23168. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  23169. * copies of the Software, and to permit persons to whom the Software is
  23170. * furnished to do so, subject to the following conditions:
  23171. *
  23172. * The above copyright notice and this permission notice shall be included in all
  23173. * copies or substantial portions of the Software.
  23174. *
  23175. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  23176. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  23177. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  23178. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  23179. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23180. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  23181. * SOFTWARE.
  23182. */
  23183. // derived from https://github.com/jsdom/whatwg-mimetype
  23184. /*
  23185. * Copyright © 2017–2018 Domenic Denicola <d@domenic.me>
  23186. *
  23187. * Permission is hereby granted, free of charge, to any person obtaining a copy
  23188. * of this software and associated documentation files (the "Software"), to deal
  23189. * in the Software without restriction, including without limitation the rights
  23190. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  23191. * copies of the Software, and to permit persons to whom the Software is
  23192. * furnished to do so, subject to the following conditions:
  23193. * The above copyright notice and this permission notice shall be included in all
  23194. * copies or substantial portions of the Software.
  23195. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  23196. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  23197. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  23198. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  23199. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23200. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  23201. * SOFTWARE.
  23202. */
  23203. let utils, parser, serializer, MIMEType;
  23204. // lib/utils.js
  23205. {
  23206. utils = {};
  23207. utils.removeLeadingAndTrailingHTTPWhitespace = string => {
  23208. return string.replace(/^[ \t\n\r]+/, "").replace(/[ \t\n\r]+$/, "");
  23209. };
  23210. utils.removeTrailingHTTPWhitespace = string => {
  23211. return string.replace(/[ \t\n\r]+$/, "");
  23212. };
  23213. utils.isHTTPWhitespaceChar = char => {
  23214. return char === " " || char === "\t" || char === "\n" || char === "\r";
  23215. };
  23216. utils.solelyContainsHTTPTokenCodePoints = string => {
  23217. return /^[-!#$%&'*+.^_`|~A-Za-z0-9]*$/.test(string);
  23218. };
  23219. utils.soleyContainsHTTPQuotedStringTokenCodePoints = string => {
  23220. return /^[\t\u0020-\u007E\u0080-\u00FF]*$/.test(string);
  23221. };
  23222. utils.asciiLowercase = string => {
  23223. return string.replace(/[A-Z]/g, l => l.toLowerCase());
  23224. };
  23225. // This variant only implements it with the extract-value flag set.
  23226. utils.collectAnHTTPQuotedString = (input, position) => {
  23227. let value = "";
  23228. position++;
  23229. // eslint-disable-next-line no-constant-condition
  23230. while (true) {
  23231. while (position < input.length && input[position] !== "\"" && input[position] !== "\\") {
  23232. value += input[position];
  23233. ++position;
  23234. }
  23235. if (position >= input.length) {
  23236. break;
  23237. }
  23238. const quoteOrBackslash = input[position];
  23239. ++position;
  23240. if (quoteOrBackslash === "\\") {
  23241. if (position >= input.length) {
  23242. value += "\\";
  23243. break;
  23244. }
  23245. value += input[position];
  23246. ++position;
  23247. } else {
  23248. break;
  23249. }
  23250. }
  23251. return [value, position];
  23252. };
  23253. }
  23254. // lib/serializer.js
  23255. {
  23256. const { solelyContainsHTTPTokenCodePoints } = utils;
  23257. serializer = mimeType => {
  23258. let serialization = `${mimeType.type}/${mimeType.subtype}`;
  23259. if (mimeType.parameters.size === 0) {
  23260. return serialization;
  23261. }
  23262. for (let [name, value] of mimeType.parameters) {
  23263. serialization += ";";
  23264. serialization += name;
  23265. serialization += "=";
  23266. if (!solelyContainsHTTPTokenCodePoints(value) || value.length === 0) {
  23267. value = value.replace(/(["\\])/g, "\\$1");
  23268. value = `"${value}"`;
  23269. }
  23270. serialization += value;
  23271. }
  23272. return serialization;
  23273. };
  23274. }
  23275. // lib/parser.js
  23276. {
  23277. const {
  23278. removeLeadingAndTrailingHTTPWhitespace,
  23279. removeTrailingHTTPWhitespace,
  23280. isHTTPWhitespaceChar,
  23281. solelyContainsHTTPTokenCodePoints,
  23282. soleyContainsHTTPQuotedStringTokenCodePoints,
  23283. asciiLowercase,
  23284. collectAnHTTPQuotedString
  23285. } = utils;
  23286. parser = input => {
  23287. input = removeLeadingAndTrailingHTTPWhitespace(input);
  23288. let position = 0;
  23289. let type = "";
  23290. while (position < input.length && input[position] !== "/") {
  23291. type += input[position];
  23292. ++position;
  23293. }
  23294. if (type.length === 0 || !solelyContainsHTTPTokenCodePoints(type)) {
  23295. return null;
  23296. }
  23297. if (position >= input.length) {
  23298. return null;
  23299. }
  23300. // Skips past "/"
  23301. ++position;
  23302. let subtype = "";
  23303. while (position < input.length && input[position] !== ";") {
  23304. subtype += input[position];
  23305. ++position;
  23306. }
  23307. subtype = removeTrailingHTTPWhitespace(subtype);
  23308. if (subtype.length === 0 || !solelyContainsHTTPTokenCodePoints(subtype)) {
  23309. return null;
  23310. }
  23311. const mimeType = {
  23312. type: asciiLowercase(type),
  23313. subtype: asciiLowercase(subtype),
  23314. parameters: new Map()
  23315. };
  23316. while (position < input.length) {
  23317. // Skip past ";"
  23318. ++position;
  23319. while (isHTTPWhitespaceChar(input[position])) {
  23320. ++position;
  23321. }
  23322. let parameterName = "";
  23323. while (position < input.length && input[position] !== ";" && input[position] !== "=") {
  23324. parameterName += input[position];
  23325. ++position;
  23326. }
  23327. parameterName = asciiLowercase(parameterName);
  23328. if (position < input.length) {
  23329. if (input[position] === ";") {
  23330. continue;
  23331. }
  23332. // Skip past "="
  23333. ++position;
  23334. }
  23335. let parameterValue = null;
  23336. if (input[position] === "\"") {
  23337. [parameterValue, position] = collectAnHTTPQuotedString(input, position);
  23338. while (position < input.length && input[position] !== ";") {
  23339. ++position;
  23340. }
  23341. } else {
  23342. parameterValue = "";
  23343. while (position < input.length && input[position] !== ";") {
  23344. parameterValue += input[position];
  23345. ++position;
  23346. }
  23347. parameterValue = removeTrailingHTTPWhitespace(parameterValue);
  23348. if (parameterValue === "") {
  23349. continue;
  23350. }
  23351. }
  23352. if (parameterName.length > 0 &&
  23353. solelyContainsHTTPTokenCodePoints(parameterName) &&
  23354. soleyContainsHTTPQuotedStringTokenCodePoints(parameterValue) &&
  23355. !mimeType.parameters.has(parameterName)) {
  23356. mimeType.parameters.set(parameterName, parameterValue);
  23357. }
  23358. }
  23359. return mimeType;
  23360. };
  23361. }
  23362. // lib/mime-type.js
  23363. {
  23364. const parse = parser;
  23365. const serialize = serializer;
  23366. const {
  23367. asciiLowercase,
  23368. solelyContainsHTTPTokenCodePoints,
  23369. soleyContainsHTTPQuotedStringTokenCodePoints
  23370. } = utils;
  23371. MIMEType = class MIMEType {
  23372. constructor(string) {
  23373. string = String(string);
  23374. const result = parse(string);
  23375. if (result === null) {
  23376. throw new Error(`Could not parse MIME type string "${string}"`);
  23377. }
  23378. this._type = result.type;
  23379. this._subtype = result.subtype;
  23380. this._parameters = new MIMETypeParameters(result.parameters);
  23381. }
  23382. static parse(string) {
  23383. try {
  23384. return new this(string);
  23385. } catch (e) {
  23386. return null;
  23387. }
  23388. }
  23389. get essence() {
  23390. return `${this.type}/${this.subtype}`;
  23391. }
  23392. get type() {
  23393. return this._type;
  23394. }
  23395. set type(value) {
  23396. value = asciiLowercase(String(value));
  23397. if (value.length === 0) {
  23398. throw new Error("Invalid type: must be a non-empty string");
  23399. }
  23400. if (!solelyContainsHTTPTokenCodePoints(value)) {
  23401. throw new Error(`Invalid type ${value}: must contain only HTTP token code points`);
  23402. }
  23403. this._type = value;
  23404. }
  23405. get subtype() {
  23406. return this._subtype;
  23407. }
  23408. set subtype(value) {
  23409. value = asciiLowercase(String(value));
  23410. if (value.length === 0) {
  23411. throw new Error("Invalid subtype: must be a non-empty string");
  23412. }
  23413. if (!solelyContainsHTTPTokenCodePoints(value)) {
  23414. throw new Error(`Invalid subtype ${value}: must contain only HTTP token code points`);
  23415. }
  23416. this._subtype = value;
  23417. }
  23418. get parameters() {
  23419. return this._parameters;
  23420. }
  23421. toString() {
  23422. // The serialize function works on both "MIME type records" (i.e. the results of parse) and on this class, since
  23423. // this class's interface is identical.
  23424. return serialize(this);
  23425. }
  23426. isJavaScript({ allowParameters = false } = {}) {
  23427. switch (this._type) {
  23428. case "text": {
  23429. switch (this._subtype) {
  23430. case "ecmascript":
  23431. case "javascript":
  23432. case "javascript1.0":
  23433. case "javascript1.1":
  23434. case "javascript1.2":
  23435. case "javascript1.3":
  23436. case "javascript1.4":
  23437. case "javascript1.5":
  23438. case "jscript":
  23439. case "livescript":
  23440. case "x-ecmascript":
  23441. case "x-javascript": {
  23442. return allowParameters || this._parameters.size === 0;
  23443. }
  23444. default: {
  23445. return false;
  23446. }
  23447. }
  23448. }
  23449. case "application": {
  23450. switch (this._subtype) {
  23451. case "ecmascript":
  23452. case "javascript":
  23453. case "x-ecmascript":
  23454. case "x-javascript": {
  23455. return allowParameters || this._parameters.size === 0;
  23456. }
  23457. default: {
  23458. return false;
  23459. }
  23460. }
  23461. }
  23462. default: {
  23463. return false;
  23464. }
  23465. }
  23466. }
  23467. isXML() {
  23468. return (this._subtype === "xml" && (this._type === "text" || this._type === "application")) ||
  23469. this._subtype.endsWith("+xml");
  23470. }
  23471. isHTML() {
  23472. return this._subtype === "html" && this._type === "text";
  23473. }
  23474. };
  23475. class MIMETypeParameters {
  23476. constructor(map) {
  23477. this._map = map;
  23478. }
  23479. get size() {
  23480. return this._map.size;
  23481. }
  23482. get(name) {
  23483. name = asciiLowercase(String(name));
  23484. return this._map.get(name);
  23485. }
  23486. has(name) {
  23487. name = asciiLowercase(String(name));
  23488. return this._map.has(name);
  23489. }
  23490. set(name, value) {
  23491. name = asciiLowercase(String(name));
  23492. value = String(value);
  23493. if (!solelyContainsHTTPTokenCodePoints(name)) {
  23494. throw new Error(`Invalid MIME type parameter name "${name}": only HTTP token code points are valid.`);
  23495. }
  23496. if (!soleyContainsHTTPQuotedStringTokenCodePoints(value)) {
  23497. throw new Error(`Invalid MIME type parameter value "${value}": only HTTP quoted-string token code points are valid.`);
  23498. }
  23499. return this._map.set(name, value);
  23500. }
  23501. clear() {
  23502. this._map.clear();
  23503. }
  23504. delete(name) {
  23505. name = asciiLowercase(String(name));
  23506. return this._map.delete(name);
  23507. }
  23508. forEach(callbackFn, thisArg) {
  23509. this._map.forEach(callbackFn, thisArg);
  23510. }
  23511. keys() {
  23512. return this._map.keys();
  23513. }
  23514. values() {
  23515. return this._map.values();
  23516. }
  23517. entries() {
  23518. return this._map.entries();
  23519. }
  23520. [Symbol.iterator]() {
  23521. return this._map[Symbol.iterator]();
  23522. }
  23523. }
  23524. }
  23525. /*
  23526. * Copyright 2010-2022 Gildas Lormeau
  23527. * contact : gildas.lormeau <at> gmail.com
  23528. *
  23529. * This file is part of SingleFile.
  23530. *
  23531. * The code in this file is free software: you can redistribute it and/or
  23532. * modify it under the terms of the GNU Affero General Public License
  23533. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  23534. * of the License, or (at your option) any later version.
  23535. *
  23536. * The code in this file is distributed in the hope that it will be useful,
  23537. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  23538. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  23539. * General Public License for more details.
  23540. *
  23541. * As additional permission under GNU AGPL version 3 section 7, you may
  23542. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  23543. * AGPL normally required by section 4, provided you include this license
  23544. * notice and a URL through which recipients can access the Corresponding
  23545. * Source.
  23546. */
  23547. const helper$2 = {
  23548. normalizeFontFamily,
  23549. flatten,
  23550. getFontWeight,
  23551. removeQuotes: removeQuotes$1
  23552. };
  23553. const REGEXP_COMMA = /\s*,\s*/;
  23554. const REGEXP_DASH = /-/;
  23555. const REGEXP_QUESTION_MARK = /\?/g;
  23556. const REGEXP_STARTS_U_PLUS = /^U\+/i;
  23557. const VALID_FONT_STYLES = [/^normal$/, /^italic$/, /^oblique$/, /^oblique\s+/];
  23558. function process$4(doc, stylesheets, styles, options) {
  23559. const stats = { rules: { processed: 0, discarded: 0 }, fonts: { processed: 0, discarded: 0 } };
  23560. const fontsInfo = { declared: [], used: [] };
  23561. const workStyleElement = doc.createElement("style");
  23562. let docContent = "";
  23563. doc.body.appendChild(workStyleElement);
  23564. stylesheets.forEach(stylesheetInfo => {
  23565. const cssRules = stylesheetInfo.stylesheet.children;
  23566. if (cssRules) {
  23567. stats.processed += cssRules.size;
  23568. stats.discarded += cssRules.size;
  23569. getFontsInfo(cssRules, fontsInfo, options);
  23570. docContent = getRulesTextContent(doc, cssRules, workStyleElement, docContent);
  23571. }
  23572. });
  23573. styles.forEach(declarations => {
  23574. const fontFamilyNames = getFontFamilyNames(declarations, options);
  23575. if (fontFamilyNames.length) {
  23576. fontsInfo.used.push(fontFamilyNames);
  23577. }
  23578. docContent = getDeclarationsTextContent(declarations.children, workStyleElement, docContent);
  23579. });
  23580. workStyleElement.remove();
  23581. docContent += doc.body.innerText;
  23582. if (globalThis.getComputedStyle && options.doc) {
  23583. fontsInfo.used = fontsInfo.used.map(fontNames => fontNames.map(familyName => {
  23584. const matchedVar = familyName.match(/^var\((--.*)\)$/);
  23585. if (matchedVar && matchedVar[1]) {
  23586. const computedFamilyName = globalThis.getComputedStyle(options.doc.body).getPropertyValue(matchedVar[1]);
  23587. return (computedFamilyName && computedFamilyName.split(",").map(name => helper$2.normalizeFontFamily(name))) || familyName;
  23588. }
  23589. return familyName;
  23590. }));
  23591. fontsInfo.used = fontsInfo.used.map(fontNames => helper$2.flatten(fontNames));
  23592. }
  23593. const variableFound = fontsInfo.used.find(fontNames => fontNames.find(fontName => fontName.match(/^var\(--/)));
  23594. let unusedFonts, filteredUsedFonts;
  23595. if (variableFound) {
  23596. unusedFonts = [];
  23597. } else {
  23598. filteredUsedFonts = new Map();
  23599. fontsInfo.used.forEach(fontNames => fontNames.forEach(familyName => {
  23600. if (fontsInfo.declared.find(fontInfo => fontInfo.fontFamily == familyName)) {
  23601. const optionalData = options.usedFonts && options.usedFonts.filter(fontInfo => fontInfo[0] == familyName);
  23602. if (optionalData && optionalData.length) {
  23603. filteredUsedFonts.set(familyName, optionalData);
  23604. }
  23605. }
  23606. }));
  23607. unusedFonts = fontsInfo.declared.filter(fontInfo => !filteredUsedFonts.has(fontInfo.fontFamily));
  23608. }
  23609. const docChars = Array.from(new Set(docContent)).map(char => char.charCodeAt(0)).sort((value1, value2) => value1 - value2);
  23610. stylesheets.forEach(stylesheetInfo => {
  23611. const cssRules = stylesheetInfo.stylesheet.children;
  23612. if (cssRules) {
  23613. filterUnusedFonts(cssRules, fontsInfo.declared, unusedFonts, filteredUsedFonts, docChars);
  23614. stats.rules.discarded -= cssRules.size;
  23615. }
  23616. });
  23617. return stats;
  23618. }
  23619. function getFontsInfo(cssRules, fontsInfo, options) {
  23620. cssRules.forEach(ruleData => {
  23621. if (ruleData.type == "Atrule" && (ruleData.name == "media" || ruleData.name == "supports" || ruleData.name == "layer") && ruleData.block && ruleData.block.children) {
  23622. getFontsInfo(ruleData.block.children, fontsInfo, options);
  23623. } else if (ruleData.type == "Rule") {
  23624. const fontFamilyNames = getFontFamilyNames(ruleData.block, options);
  23625. if (fontFamilyNames.length) {
  23626. fontsInfo.used.push(fontFamilyNames);
  23627. }
  23628. } else {
  23629. if (ruleData.type == "Atrule" && ruleData.name == "font-face") {
  23630. const fontFamily = helper$2.normalizeFontFamily(getDeclarationValue(ruleData.block.children, "font-family"));
  23631. if (fontFamily) {
  23632. const fontWeight = getDeclarationValue(ruleData.block.children, "font-weight") || "400";
  23633. const fontStyle = getDeclarationValue(ruleData.block.children, "font-style") || "normal";
  23634. const fontVariant = getDeclarationValue(ruleData.block.children, "font-variant") || "normal";
  23635. fontWeight.split(",").forEach(weightValue =>
  23636. fontsInfo.declared.push({ fontFamily, fontWeight: helper$2.getFontWeight(helper$2.removeQuotes(weightValue)), fontStyle, fontVariant }));
  23637. }
  23638. }
  23639. }
  23640. });
  23641. }
  23642. function filterUnusedFonts(cssRules, declaredFonts, unusedFonts, filteredUsedFonts, docChars) {
  23643. const removedRules = [];
  23644. for (let cssRule = cssRules.head; cssRule; cssRule = cssRule.next) {
  23645. const ruleData = cssRule.data;
  23646. if (ruleData.type == "Atrule" && ruleData.name == "import" && ruleData.prelude && ruleData.prelude.children && ruleData.prelude.children.head.data.importedChildren) {
  23647. filterUnusedFonts(ruleData.prelude.children.head.data.importedChildren, declaredFonts, unusedFonts, filteredUsedFonts, docChars);
  23648. } else if (ruleData.type == "Atrule" && (ruleData.name == "media" || ruleData.name == "supports" || ruleData.name == "layer") && ruleData.block && ruleData.block.children) {
  23649. filterUnusedFonts(ruleData.block.children, declaredFonts, unusedFonts, filteredUsedFonts, docChars);
  23650. } else if (ruleData.type == "Atrule" && ruleData.name == "font-face") {
  23651. const fontFamily = helper$2.normalizeFontFamily(getDeclarationValue(ruleData.block.children, "font-family"));
  23652. if (fontFamily) {
  23653. const unicodeRange = getDeclarationValue(ruleData.block.children, "unicode-range");
  23654. if (unusedFonts.find(fontInfo => fontInfo.fontFamily == fontFamily) || !testUnicodeRange(docChars, unicodeRange) || !testUsedFont(ruleData, fontFamily, declaredFonts, filteredUsedFonts)) {
  23655. removedRules.push(cssRule);
  23656. }
  23657. }
  23658. const removedDeclarations = [];
  23659. for (let declaration = ruleData.block.children.head; declaration; declaration = declaration.next) {
  23660. if (declaration.data.property == "font-display") {
  23661. removedDeclarations.push(declaration);
  23662. }
  23663. }
  23664. if (removedDeclarations.length) {
  23665. removedDeclarations.forEach(removedDeclaration => ruleData.block.children.remove(removedDeclaration));
  23666. }
  23667. }
  23668. }
  23669. removedRules.forEach(cssRule => cssRules.remove(cssRule));
  23670. }
  23671. function testUsedFont(ruleData, familyName, declaredFonts, filteredUsedFonts) {
  23672. let test;
  23673. const optionalUsedFonts = filteredUsedFonts && filteredUsedFonts.get(familyName);
  23674. if (optionalUsedFonts && optionalUsedFonts.length) {
  23675. let fontStyle = getDeclarationValue(ruleData.block.children, "font-style") || "normal";
  23676. if (VALID_FONT_STYLES.find(rule => fontStyle.trim().match(rule))) {
  23677. const fontWeight = helper$2.getFontWeight(getDeclarationValue(ruleData.block.children, "font-weight") || "400");
  23678. const declaredFontsWeights = declaredFonts
  23679. .filter(fontInfo => fontInfo.fontFamily == familyName && fontInfo.fontStyle == fontStyle)
  23680. .map(fontInfo => fontInfo.fontWeight.split(" "))
  23681. .sort((weight1, weight2) => Number.parseInt(weight1[0], 10) - Number.parseInt(weight2[0], 10));
  23682. let usedFontWeights = optionalUsedFonts
  23683. .map(fontInfo => getUsedFontWeight(fontInfo, fontStyle, declaredFontsWeights))
  23684. .filter(fontWeight => fontWeight);
  23685. test = testFontweight(fontWeight, usedFontWeights);
  23686. if (!test) {
  23687. usedFontWeights = optionalUsedFonts
  23688. .map(fontInfo => {
  23689. fontInfo = Array.from(fontInfo);
  23690. fontInfo[2] = "normal";
  23691. return getUsedFontWeight(fontInfo, fontStyle, declaredFontsWeights);
  23692. })
  23693. .filter(fontWeight => fontWeight);
  23694. test = testFontweight(fontWeight, usedFontWeights);
  23695. if (!test) {
  23696. usedFontWeights = optionalUsedFonts
  23697. .map(fontInfo => {
  23698. fontInfo = Array.from(fontInfo);
  23699. fontInfo[2] = fontStyle = "normal";
  23700. return getUsedFontWeight(fontInfo, fontStyle, declaredFontsWeights);
  23701. })
  23702. .filter(fontWeight => fontWeight);
  23703. test = testFontweight(fontWeight, usedFontWeights);
  23704. }
  23705. }
  23706. } else {
  23707. test = true;
  23708. }
  23709. } else {
  23710. test = true;
  23711. }
  23712. return test;
  23713. }
  23714. function testFontweight(fontWeight, usedFontWeights) {
  23715. let test;
  23716. for (const fontWeightValue of fontWeight.split(",")) {
  23717. let { min: fontWeightMin, max: fontWeightMax } = parseFontWeight(fontWeightValue);
  23718. if (!fontWeightMax) {
  23719. fontWeightMax = 900;
  23720. }
  23721. test = test || usedFontWeights.find(usedFontWeight => {
  23722. let { min: usedFontWeightMin, max: usedFontWeightMax } = parseFontWeight(usedFontWeight);
  23723. if (!usedFontWeightMax) {
  23724. usedFontWeightMax = usedFontWeightMin;
  23725. }
  23726. return usedFontWeightMin >= fontWeightMin && usedFontWeightMax <= fontWeightMax;
  23727. });
  23728. }
  23729. return test;
  23730. }
  23731. function parseFontWeight(fontWeight) {
  23732. const fontWeightValues = fontWeight.split(" ");
  23733. const min = Number.parseInt(helper$2.getFontWeight(fontWeightValues[0]), 10);
  23734. const max = fontWeightValues[1] && Number.parseInt(helper$2.getFontWeight(fontWeightValues[1]), 10);
  23735. return {
  23736. min, max
  23737. };
  23738. }
  23739. function getDeclarationValue(declarations, propertyName) {
  23740. let property;
  23741. if (declarations) {
  23742. property = declarations.filter(declaration => declaration.property == propertyName).tail;
  23743. }
  23744. if (property) {
  23745. try {
  23746. return helper$2.removeQuotes(gb(property.data.value)).toLowerCase();
  23747. } catch (error) {
  23748. // ignored
  23749. }
  23750. }
  23751. }
  23752. function getFontFamilyNames(declarations, options) {
  23753. let fontFamilyName = declarations.children.filter(node => node.property == "font-family").tail;
  23754. let fontFamilyNames = [];
  23755. if (fontFamilyName) {
  23756. if (fontFamilyName.data.value.children) {
  23757. parseFamilyNames(fontFamilyName.data.value, fontFamilyNames);
  23758. } else {
  23759. fontFamilyName = gb(fontFamilyName.data.value);
  23760. if (fontFamilyName) {
  23761. fontFamilyNames.push(helper$2.normalizeFontFamily(fontFamilyName));
  23762. }
  23763. }
  23764. }
  23765. const font = declarations.children.filter(node => node.property == "font").tail;
  23766. if (font && font.data && font.data.value) {
  23767. try {
  23768. let value = font.data.value;
  23769. let fontFamilyName = gb(value);
  23770. const matchedVar = fontFamilyName.match(/^var\((--.*)\)$/);
  23771. if (matchedVar && matchedVar[1]) {
  23772. value = db(globalThis.getComputedStyle(options.doc.body).getPropertyValue(matchedVar[1]), { context: "value" });
  23773. }
  23774. const parsedFont = parse(value);
  23775. parsedFont.family.forEach(familyName => fontFamilyNames.push(helper$2.normalizeFontFamily(familyName)));
  23776. } catch (error) {
  23777. // ignored
  23778. }
  23779. }
  23780. return fontFamilyNames;
  23781. }
  23782. function parseFamilyNames(fontFamilyNameTokenData, fontFamilyNames) {
  23783. let nextToken = fontFamilyNameTokenData.children.head;
  23784. while (nextToken) {
  23785. if (nextToken.data.type == "Identifier") {
  23786. let familyName = nextToken.data.name;
  23787. let nextIdentifierToken = nextToken.next;
  23788. while (nextIdentifierToken && nextIdentifierToken.data.type != "Operator" && nextIdentifierToken.data.value != ",") {
  23789. familyName += " " + nextIdentifierToken.data.name;
  23790. nextIdentifierToken = nextIdentifierToken.next;
  23791. }
  23792. fontFamilyNames.push(helper$2.normalizeFontFamily(familyName));
  23793. nextToken = nextToken.next;
  23794. } else if (nextToken.data.type == "Function" && nextToken.data.name == "var" && nextToken.data.children) {
  23795. const varName = nextToken.data.children.head.data.name;
  23796. fontFamilyNames.push(helper$2.normalizeFontFamily("var(" + varName + ")"));
  23797. let nextValueToken = nextToken.data.children.head.next;
  23798. while (nextValueToken && nextValueToken.data.type == "Operator" && nextValueToken.data.value == ",") {
  23799. nextValueToken = nextValueToken.next;
  23800. }
  23801. const fallbackToken = nextValueToken;
  23802. if (fallbackToken) {
  23803. if (fallbackToken.data.children) {
  23804. parseFamilyNames(fallbackToken.data, fontFamilyNames);
  23805. } else {
  23806. fontFamilyNames.push(helper$2.normalizeFontFamily(fallbackToken.data.value));
  23807. }
  23808. }
  23809. nextToken = nextToken.next;
  23810. } else if (nextToken.data.type == "String") {
  23811. fontFamilyNames.push(helper$2.normalizeFontFamily(nextToken.data.value));
  23812. nextToken = nextToken.next;
  23813. } else if (nextToken.data.type == "Number") {
  23814. fontFamilyNames.push(helper$2.normalizeFontFamily(String(nextToken.data.value)));
  23815. nextToken = nextToken.next;
  23816. } else {
  23817. nextToken = nextToken.next;
  23818. }
  23819. }
  23820. }
  23821. function getUsedFontWeight(fontInfo, fontStyle, fontWeights) {
  23822. let foundWeight;
  23823. fontWeights = fontWeights.map(weights => weights.map(value => String(Number.parseInt(value, 10))));
  23824. if (fontInfo[2] == fontStyle) {
  23825. let fontWeight = Number(fontInfo[1]);
  23826. if (fontWeights.length > 1) {
  23827. if (fontWeight >= 400 && fontWeight <= 500) {
  23828. foundWeight = fontWeights.find(weights => weights[0] >= fontWeight && weights[0] <= 500);
  23829. if (!foundWeight) {
  23830. foundWeight = findDescendingFontWeight(fontWeight, fontWeights);
  23831. }
  23832. if (!foundWeight) {
  23833. foundWeight = findAscendingFontWeight(fontWeight, fontWeights);
  23834. }
  23835. }
  23836. if (fontWeight < 400) {
  23837. foundWeight = fontWeights.slice().reverse().find(weights => weights[weights.length - 1] <= fontWeight);
  23838. if (!foundWeight) {
  23839. foundWeight = findAscendingFontWeight(fontWeight, fontWeights);
  23840. }
  23841. }
  23842. if (fontWeight > 500) {
  23843. foundWeight = fontWeights.find(weights => weights[0] >= fontWeight);
  23844. if (!foundWeight) {
  23845. foundWeight = findDescendingFontWeight(fontWeight, fontWeights);
  23846. }
  23847. }
  23848. if (!foundWeight) {
  23849. foundWeight = fontWeights.find(weights => weights[0] <= fontWeight && weights[weights.length - 1] >= fontWeight);
  23850. }
  23851. } else {
  23852. foundWeight = fontWeights[0];
  23853. }
  23854. }
  23855. return foundWeight ? foundWeight.join(" ") : undefined;
  23856. }
  23857. function findDescendingFontWeight(fontWeight, fontWeights) {
  23858. return fontWeights.slice().reverse().find(weights => weights[weights.length - 1] < fontWeight);
  23859. }
  23860. function findAscendingFontWeight(fontWeight, fontWeights) {
  23861. return fontWeights.find(weights => weights[0] > fontWeight);
  23862. }
  23863. function getRulesTextContent(doc, cssRules, workStylesheet, content) {
  23864. cssRules.forEach(ruleData => {
  23865. if (ruleData.block && ruleData.block.children && ruleData.prelude && ruleData.prelude.children) {
  23866. if (ruleData.type == "Atrule" && (ruleData.name == "media" || ruleData.name == "supports" || ruleData.name == "layer")) {
  23867. content = getRulesTextContent(doc, ruleData.block.children, workStylesheet, content);
  23868. } else if (ruleData.type == "Rule") {
  23869. content = getDeclarationsTextContent(ruleData.block.children, workStylesheet, content);
  23870. }
  23871. }
  23872. });
  23873. return content;
  23874. }
  23875. function getDeclarationsTextContent(declarations, workStylesheet, content) {
  23876. const contentText = getDeclarationUnescapedValue(declarations, "content", workStylesheet);
  23877. const quotesText = getDeclarationUnescapedValue(declarations, "quotes", workStylesheet);
  23878. if (!content.includes(contentText)) {
  23879. content += contentText;
  23880. }
  23881. if (!content.includes(quotesText)) {
  23882. content += quotesText;
  23883. }
  23884. return content;
  23885. }
  23886. function getDeclarationUnescapedValue(declarations, property, workStylesheet) {
  23887. const rawValue = getDeclarationValue(declarations, property) || "";
  23888. if (rawValue) {
  23889. workStylesheet.textContent = "tmp { content:\"" + rawValue + "\"}";
  23890. if (workStylesheet.sheet && workStylesheet.sheet.cssRules) {
  23891. return helper$2.removeQuotes(workStylesheet.sheet.cssRules[0].style.getPropertyValue("content"));
  23892. } else {
  23893. return rawValue;
  23894. }
  23895. }
  23896. return "";
  23897. }
  23898. function testUnicodeRange(docCharCodes, unicodeRange) {
  23899. if (unicodeRange) {
  23900. const unicodeRanges = unicodeRange.split(REGEXP_COMMA);
  23901. const result = unicodeRanges.filter(rangeValue => {
  23902. const range = rangeValue.split(REGEXP_DASH);
  23903. if (range.length == 2) {
  23904. range[0] = transformRange(range[0]);
  23905. range[1] = transformRange(range[1]);
  23906. } else if (range.length == 1) {
  23907. if (range[0].includes("?")) {
  23908. const firstRange = range[0];
  23909. const secondRange = firstRange;
  23910. range[0] = transformRange(firstRange.replace(REGEXP_QUESTION_MARK, "0"));
  23911. range[1] = transformRange(secondRange.replace(REGEXP_QUESTION_MARK, "F"));
  23912. } else if (range[0]) {
  23913. range[0] = transformRange(range[0]);
  23914. }
  23915. }
  23916. if (!range[0] || docCharCodes.find(charCode => charCode >= range[0] && charCode <= range[1])) {
  23917. return true;
  23918. }
  23919. });
  23920. return (!unicodeRanges.length || result.length);
  23921. }
  23922. return true;
  23923. }
  23924. function transformRange(range) {
  23925. range = range.replace(REGEXP_STARTS_U_PLUS, "");
  23926. return parseInt(range, 16);
  23927. }
  23928. /*
  23929. * Copyright 2010-2022 Gildas Lormeau
  23930. * contact : gildas.lormeau <at> gmail.com
  23931. *
  23932. * This file is part of SingleFile.
  23933. *
  23934. * The code in this file is free software: you can redistribute it and/or
  23935. * modify it under the terms of the GNU Affero General Public License
  23936. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  23937. * of the License, or (at your option) any later version.
  23938. *
  23939. * The code in this file is distributed in the hope that it will be useful,
  23940. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  23941. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  23942. * General Public License for more details.
  23943. *
  23944. * As additional permission under GNU AGPL version 3 section 7, you may
  23945. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  23946. * AGPL normally required by section 4, provided you include this license
  23947. * notice and a URL through which recipients can access the Corresponding
  23948. * Source.
  23949. */
  23950. const MEDIA_ALL$1 = "all";
  23951. const IGNORED_PSEUDO_ELEMENTS = ["after", "before", "first-letter", "first-line", "placeholder", "selection", "part", "marker"];
  23952. const SINGLE_FILE_HIDDEN_CLASS_NAME = "sf-hidden";
  23953. const DISPLAY_STYLE = "display";
  23954. const REGEXP_VENDOR_IDENTIFIER = /-(ms|webkit|moz|o)-/;
  23955. class MatchedRules {
  23956. constructor(doc, stylesheets, styles) {
  23957. this.doc = doc;
  23958. this.mediaAllInfo = createMediaInfo(MEDIA_ALL$1);
  23959. const matchedElementsCache = new Map();
  23960. let sheetIndex = 0;
  23961. const workStyleSheet = doc.createElement("style");
  23962. doc.body.appendChild(workStyleSheet);
  23963. const workStyleElement = doc.createElement("span");
  23964. doc.body.appendChild(workStyleElement);
  23965. stylesheets.forEach((stylesheetInfo, key) => {
  23966. if (!stylesheetInfo.scoped && !key.urlNode) {
  23967. const cssRules = stylesheetInfo.stylesheet.children;
  23968. if (cssRules) {
  23969. if (stylesheetInfo.mediaText && stylesheetInfo.mediaText != MEDIA_ALL$1) {
  23970. const mediaInfo = createMediaInfo(stylesheetInfo.mediaText);
  23971. this.mediaAllInfo.medias.set("style-" + sheetIndex + "-" + stylesheetInfo.mediaText, mediaInfo);
  23972. getMatchedElementsRules(doc, cssRules, stylesheets, mediaInfo, sheetIndex, styles, matchedElementsCache, workStyleSheet);
  23973. } else {
  23974. getMatchedElementsRules(doc, cssRules, stylesheets, this.mediaAllInfo, sheetIndex, styles, matchedElementsCache, workStyleSheet);
  23975. }
  23976. }
  23977. }
  23978. sheetIndex++;
  23979. });
  23980. sortRules(this.mediaAllInfo);
  23981. computeCascade(this.mediaAllInfo, [], this.mediaAllInfo, workStyleSheet, workStyleElement);
  23982. workStyleSheet.remove();
  23983. workStyleElement.remove();
  23984. }
  23985. getMediaAllInfo() {
  23986. return this.mediaAllInfo;
  23987. }
  23988. }
  23989. function getMediaAllInfo(doc, stylesheets, styles) {
  23990. return new MatchedRules(doc, stylesheets, styles).getMediaAllInfo();
  23991. }
  23992. function createMediaInfo(media) {
  23993. const mediaInfo = {
  23994. media: media,
  23995. elements: new Map(),
  23996. medias: new Map(),
  23997. rules: new Map(),
  23998. pseudoRules: new Map()
  23999. };
  24000. if (media == MEDIA_ALL$1) {
  24001. mediaInfo.matchedStyles = new Map();
  24002. }
  24003. return mediaInfo;
  24004. }
  24005. function getMatchedElementsRules(doc, cssRules, stylesheets, mediaInfo, sheetIndex, styles, matchedElementsCache, workStylesheet, indexes = {
  24006. mediaIndex: 0, ruleIndex: 0
  24007. }) {
  24008. cssRules.forEach(ruleData => {
  24009. if (ruleData.type == "Atrule" && ruleData.name == "import" && ruleData.prelude && ruleData.prelude.children && ruleData.prelude.children.head.data.importedChildren) {
  24010. getMatchedElementsRules(doc, ruleData.prelude.children.head.data.importedChildren, stylesheets, mediaInfo, sheetIndex, styles, matchedElementsCache, workStylesheet, indexes);
  24011. } else if (ruleData.block && ruleData.block.children && ruleData.prelude && ruleData.prelude.children) {
  24012. if (ruleData.type == "Atrule" && ruleData.name == "media") {
  24013. const mediaText = gb(ruleData.prelude);
  24014. const ruleMediaInfo = createMediaInfo(mediaText);
  24015. mediaInfo.medias.set("rule-" + sheetIndex + "-" + indexes.mediaIndex + "-" + mediaText, ruleMediaInfo);
  24016. getMatchedElementsRules(doc, ruleData.block.children, stylesheets, ruleMediaInfo, sheetIndex, styles, matchedElementsCache, workStylesheet);
  24017. indexes.mediaIndex++;
  24018. } else if (ruleData.type == "Rule") {
  24019. const selectors = ruleData.prelude.children.toArray();
  24020. const selectorsText = ruleData.prelude.children.toArray().map(selector => gb(selector));
  24021. const ruleInfo = { ruleData, mediaInfo, ruleIndex: indexes.ruleIndex, sheetIndex, matchedSelectors: new Set(), declarations: new Set(), selectors, selectorsText };
  24022. if (!invalidSelector(selectorsText.join(","), workStylesheet) || selectorsText.find(selectorText => selectorText.includes("|"))) {
  24023. for (let selector = ruleData.prelude.children.head, selectorIndex = 0; selector; selector = selector.next, selectorIndex++) {
  24024. const selectorText = selectorsText[selectorIndex];
  24025. const selectorInfo = { selector, selectorText, ruleInfo };
  24026. getMatchedElementsSelector(doc, selectorInfo, styles, matchedElementsCache);
  24027. }
  24028. }
  24029. indexes.ruleIndex++;
  24030. }
  24031. }
  24032. });
  24033. }
  24034. function invalidSelector(selectorText, workStylesheet) {
  24035. workStylesheet.textContent = selectorText + "{}";
  24036. return workStylesheet.sheet ? !workStylesheet.sheet.cssRules.length : workStylesheet.sheet;
  24037. }
  24038. function getMatchedElementsSelector(doc, selectorInfo, styles, matchedElementsCache) {
  24039. const filteredSelectorText = getFilteredSelector(selectorInfo.selector, selectorInfo.selectorText);
  24040. const selectorText = filteredSelectorText != selectorInfo.selectorText ? filteredSelectorText : selectorInfo.selectorText;
  24041. const cachedMatchedElements = matchedElementsCache.get(selectorText);
  24042. let matchedElements = cachedMatchedElements;
  24043. if (!matchedElements) {
  24044. try {
  24045. matchedElements = doc.querySelectorAll(selectorText);
  24046. if (selectorText != "." + SINGLE_FILE_HIDDEN_CLASS_NAME) {
  24047. matchedElements = Array.from(doc.querySelectorAll(selectorText)).filter(matchedElement =>
  24048. !matchedElement.classList.contains(SINGLE_FILE_HIDDEN_CLASS_NAME) &&
  24049. (matchedElement.style.getPropertyValue(DISPLAY_STYLE) != "none" || matchedElement.style.getPropertyPriority("display") != "important")
  24050. );
  24051. }
  24052. } catch (error) {
  24053. // ignored
  24054. }
  24055. }
  24056. if (matchedElements) {
  24057. if (!cachedMatchedElements) {
  24058. matchedElementsCache.set(selectorText, matchedElements);
  24059. }
  24060. if (matchedElements.length) {
  24061. if (filteredSelectorText == selectorInfo.selectorText) {
  24062. matchedElements.forEach(element => addRule(element, selectorInfo, styles));
  24063. } else {
  24064. let pseudoSelectors = selectorInfo.ruleInfo.mediaInfo.pseudoRules.get(selectorInfo.ruleInfo.ruleData);
  24065. if (!pseudoSelectors) {
  24066. pseudoSelectors = new Set();
  24067. selectorInfo.ruleInfo.mediaInfo.pseudoRules.set(selectorInfo.ruleInfo.ruleData, pseudoSelectors);
  24068. }
  24069. pseudoSelectors.add(selectorInfo.selectorText);
  24070. }
  24071. }
  24072. }
  24073. }
  24074. function getFilteredSelector(selector, selectorText) {
  24075. const removedSelectors = [];
  24076. let namespaceFound;
  24077. selector = { data: db(gb(selector.data), { context: "selector" }) };
  24078. filterNamespace(selector);
  24079. if (namespaceFound) {
  24080. selectorText = gb(selector.data).trim();
  24081. }
  24082. filterPseudoClasses(selector);
  24083. if (removedSelectors.length) {
  24084. removedSelectors.forEach(({ parentSelector, selector }) => {
  24085. if (parentSelector.data.children.size == 0 || !selector.prev || selector.prev.data.type == "Combinator" || selector.prev.data.type == "WhiteSpace") {
  24086. parentSelector.data.children.replace(selector, db("*", { context: "selector" }).children.head);
  24087. } else {
  24088. parentSelector.data.children.remove(selector);
  24089. }
  24090. });
  24091. selectorText = gb(selector.data).trim();
  24092. }
  24093. return selectorText;
  24094. function filterPseudoClasses(selector, parentSelector) {
  24095. if (selector.data.children) {
  24096. for (let childSelector = selector.data.children.head; childSelector; childSelector = childSelector.next) {
  24097. filterPseudoClasses(childSelector, selector);
  24098. }
  24099. }
  24100. if ((selector.data.type == "PseudoClassSelector") ||
  24101. (selector.data.type == "PseudoElementSelector" && (testVendorPseudo(selector) || IGNORED_PSEUDO_ELEMENTS.includes(selector.data.name)))) {
  24102. removedSelectors.push({ parentSelector, selector });
  24103. }
  24104. }
  24105. function filterNamespace(selector) {
  24106. if (selector.data.children) {
  24107. for (let childSelector = selector.data.children.head; childSelector; childSelector = childSelector.next) {
  24108. filterNamespace(childSelector);
  24109. }
  24110. }
  24111. if (selector.data.type == "TypeSelector" && selector.data.name.includes("|")) {
  24112. namespaceFound = true;
  24113. selector.data.name = selector.data.name.substring(selector.data.name.lastIndexOf("|") + 1);
  24114. }
  24115. }
  24116. function testVendorPseudo(selector) {
  24117. const name = selector.data.name;
  24118. return name.startsWith("-") || name.startsWith("\\-");
  24119. }
  24120. }
  24121. function addRule(element, selectorInfo, styles) {
  24122. const mediaInfo = selectorInfo.ruleInfo.mediaInfo;
  24123. const elementStyle = styles.get(element);
  24124. let elementInfo = mediaInfo.elements.get(element);
  24125. if (!elementInfo) {
  24126. elementInfo = [];
  24127. if (elementStyle) {
  24128. elementInfo.push({ styleInfo: { styleData: elementStyle, declarations: new Set() } });
  24129. }
  24130. mediaInfo.elements.set(element, elementInfo);
  24131. }
  24132. const specificity = computeSpecificity(selectorInfo.selector.data);
  24133. specificity.ruleIndex = selectorInfo.ruleInfo.ruleIndex;
  24134. specificity.sheetIndex = selectorInfo.ruleInfo.sheetIndex;
  24135. selectorInfo.specificity = specificity;
  24136. elementInfo.push(selectorInfo);
  24137. }
  24138. function computeCascade(mediaInfo, parentMediaInfo, mediaAllInfo, workStylesheet, workStyleElement) {
  24139. mediaInfo.elements.forEach((elementInfo/*, element*/) =>
  24140. getDeclarationsInfo(elementInfo, workStylesheet, workStyleElement/*, element*/).forEach((declarationsInfo, property) => {
  24141. if (declarationsInfo.selectorInfo.ruleInfo || mediaInfo == mediaAllInfo) {
  24142. let info;
  24143. if (declarationsInfo.selectorInfo.ruleInfo) {
  24144. info = declarationsInfo.selectorInfo.ruleInfo;
  24145. const ruleData = info.ruleData;
  24146. const ascendantMedia = [mediaInfo, ...parentMediaInfo].find(media => media.rules.get(ruleData)) || mediaInfo;
  24147. ascendantMedia.rules.set(ruleData, info);
  24148. if (ruleData) {
  24149. info.matchedSelectors.add(declarationsInfo.selectorInfo.selectorText);
  24150. }
  24151. } else {
  24152. info = declarationsInfo.selectorInfo.styleInfo;
  24153. const styleData = info.styleData;
  24154. const matchedStyleInfo = mediaAllInfo.matchedStyles.get(styleData);
  24155. if (!matchedStyleInfo) {
  24156. mediaAllInfo.matchedStyles.set(styleData, info);
  24157. }
  24158. }
  24159. if (!info.declarations.has(property)) {
  24160. info.declarations.add(property);
  24161. }
  24162. }
  24163. }));
  24164. delete mediaInfo.elements;
  24165. mediaInfo.medias.forEach(childMediaInfo => computeCascade(childMediaInfo, [mediaInfo, ...parentMediaInfo], mediaAllInfo, workStylesheet, workStyleElement));
  24166. }
  24167. function getDeclarationsInfo(elementInfo, workStylesheet, workStyleElement/*, element*/) {
  24168. const declarationsInfo = new Map();
  24169. const processedProperties = new Set();
  24170. elementInfo.forEach(selectorInfo => {
  24171. let declarations;
  24172. if (selectorInfo.styleInfo) {
  24173. declarations = selectorInfo.styleInfo.styleData.children;
  24174. } else {
  24175. declarations = selectorInfo.ruleInfo.ruleData.block.children;
  24176. }
  24177. processDeclarations(declarationsInfo, declarations, selectorInfo, processedProperties, workStylesheet, workStyleElement);
  24178. });
  24179. return declarationsInfo;
  24180. }
  24181. function processDeclarations(declarationsInfo, declarations, selectorInfo, processedProperties, workStylesheet, workStyleElement) {
  24182. for (let declaration = declarations.tail; declaration; declaration = declaration.prev) {
  24183. const declarationData = declaration.data;
  24184. const declarationText = gb(declarationData);
  24185. if (declarationData.type == "Declaration" &&
  24186. (declarationText.match(REGEXP_VENDOR_IDENTIFIER) || !processedProperties.has(declarationData.property) || declarationData.important) && !invalidDeclaration(declarationText, workStyleElement)) {
  24187. const declarationInfo = declarationsInfo.get(declarationData);
  24188. if (!declarationInfo || (declarationData.important && !declarationInfo.important)) {
  24189. declarationsInfo.set(declarationData, { selectorInfo, important: declarationData.important });
  24190. if (!declarationText.match(REGEXP_VENDOR_IDENTIFIER)) {
  24191. processedProperties.add(declarationData.property);
  24192. }
  24193. }
  24194. }
  24195. }
  24196. }
  24197. function invalidDeclaration(declarationText, workStyleElement) {
  24198. let invalidDeclaration;
  24199. workStyleElement.style = declarationText;
  24200. if (!workStyleElement.style.length) {
  24201. if (!declarationText.match(REGEXP_VENDOR_IDENTIFIER)) {
  24202. invalidDeclaration = true;
  24203. }
  24204. }
  24205. return invalidDeclaration;
  24206. }
  24207. function sortRules(media) {
  24208. media.elements.forEach(elementRules => elementRules.sort((ruleInfo1, ruleInfo2) =>
  24209. ruleInfo1.styleInfo && !ruleInfo2.styleInfo ? -1 :
  24210. !ruleInfo1.styleInfo && ruleInfo2.styleInfo ? 1 :
  24211. compareSpecificity(ruleInfo1.specificity, ruleInfo2.specificity)));
  24212. media.medias.forEach(sortRules);
  24213. }
  24214. function computeSpecificity(selector, specificity = { a: 0, b: 0, c: 0 }) {
  24215. if (selector.type == "IdSelector") {
  24216. specificity.a++;
  24217. }
  24218. if (selector.type == "ClassSelector" || selector.type == "AttributeSelector" || (selector.type == "PseudoClassSelector" && selector.name != "not")) {
  24219. specificity.b++;
  24220. }
  24221. if ((selector.type == "TypeSelector" && selector.name != "*") || selector.type == "PseudoElementSelector") {
  24222. specificity.c++;
  24223. }
  24224. if (selector.children) {
  24225. selector.children.forEach(selector => computeSpecificity(selector, specificity));
  24226. }
  24227. return specificity;
  24228. }
  24229. function compareSpecificity(specificity1, specificity2) {
  24230. if (specificity1.a > specificity2.a) {
  24231. return -1;
  24232. } else if (specificity1.a < specificity2.a) {
  24233. return 1;
  24234. } else if (specificity1.b > specificity2.b) {
  24235. return -1;
  24236. } else if (specificity1.b < specificity2.b) {
  24237. return 1;
  24238. } else if (specificity1.c > specificity2.c) {
  24239. return -1;
  24240. } else if (specificity1.c < specificity2.c) {
  24241. return 1;
  24242. } else if (specificity1.sheetIndex > specificity2.sheetIndex) {
  24243. return -1;
  24244. } else if (specificity1.sheetIndex < specificity2.sheetIndex) {
  24245. return 1;
  24246. } else if (specificity1.ruleIndex > specificity2.ruleIndex) {
  24247. return -1;
  24248. } else if (specificity1.ruleIndex < specificity2.ruleIndex) {
  24249. return 1;
  24250. } else {
  24251. return -1;
  24252. }
  24253. }
  24254. /*
  24255. * Copyright 2010-2022 Gildas Lormeau
  24256. * contact : gildas.lormeau <at> gmail.com
  24257. *
  24258. * This file is part of SingleFile.
  24259. *
  24260. * The code in this file is free software: you can redistribute it and/or
  24261. * modify it under the terms of the GNU Affero General Public License
  24262. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  24263. * of the License, or (at your option) any later version.
  24264. *
  24265. * The code in this file is distributed in the hope that it will be useful,
  24266. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  24267. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  24268. * General Public License for more details.
  24269. *
  24270. * As additional permission under GNU AGPL version 3 section 7, you may
  24271. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  24272. * AGPL normally required by section 4, provided you include this license
  24273. * notice and a URL through which recipients can access the Corresponding
  24274. * Source.
  24275. */
  24276. const helper$1 = {
  24277. flatten
  24278. };
  24279. const MEDIA_ALL = "all";
  24280. const MEDIA_SCREEN = "screen";
  24281. function process$3(stylesheets) {
  24282. const stats = { processed: 0, discarded: 0 };
  24283. stylesheets.forEach((stylesheetInfo, key) => {
  24284. if (matchesMediaType(stylesheetInfo.mediaText || MEDIA_ALL) && stylesheetInfo.stylesheet.children) {
  24285. const removedRules = processRules$1(stylesheetInfo.stylesheet.children, stats);
  24286. removedRules.forEach(({ cssRules, cssRule }) => cssRules.remove(cssRule));
  24287. } else {
  24288. stylesheets.delete(key);
  24289. if (key.element) {
  24290. key.element.remove();
  24291. }
  24292. }
  24293. });
  24294. return stats;
  24295. }
  24296. function processRules$1(cssRules, stats, removedRules = []) {
  24297. for (let cssRule = cssRules.head; cssRule; cssRule = cssRule.next) {
  24298. const ruleData = cssRule.data;
  24299. if (ruleData.type == "Atrule" && ruleData.name == "media" && ruleData.block && ruleData.block.children && ruleData.prelude && ruleData.prelude.children) {
  24300. stats.processed++;
  24301. if (matchesMediaType(gb(ruleData.prelude))) {
  24302. processRules$1(ruleData.block.children, stats, removedRules);
  24303. } else {
  24304. removedRules.push({ cssRules, cssRule });
  24305. stats.discarded++;
  24306. }
  24307. }
  24308. }
  24309. return removedRules;
  24310. }
  24311. function matchesMediaType(mediaText) {
  24312. const foundMediaTypes = helper$1.flatten(parseMediaList(mediaText).map(node => getMediaTypes(node)));
  24313. return foundMediaTypes.find(mediaTypeInfo =>
  24314. (!mediaTypeInfo.not && (mediaTypeInfo.value == MEDIA_SCREEN || mediaTypeInfo.value == MEDIA_ALL)) ||
  24315. (mediaTypeInfo.not && (mediaTypeInfo.value != MEDIA_SCREEN && mediaTypeInfo.value != MEDIA_ALL)));
  24316. }
  24317. function getMediaTypes(parentNode, mediaTypes = []) {
  24318. parentNode.nodes.map((node, indexNode) => {
  24319. if (node.type == "media-query") {
  24320. return getMediaTypes(node);
  24321. } else {
  24322. if (node.type == "media-type") {
  24323. const nodeMediaType = {
  24324. not: Boolean(indexNode && parentNode.nodes[0].type == "keyword" && parentNode.nodes[0].value == "not"),
  24325. value: node.value
  24326. };
  24327. mediaTypes.push(nodeMediaType);
  24328. }
  24329. }
  24330. });
  24331. if (!mediaTypes.length) {
  24332. mediaTypes.push({ not: false, value: MEDIA_ALL });
  24333. }
  24334. return mediaTypes;
  24335. }
  24336. /*
  24337. * Copyright 2010-2022 Gildas Lormeau
  24338. * contact : gildas.lormeau <at> gmail.com
  24339. *
  24340. * This file is part of SingleFile.
  24341. *
  24342. * The code in this file is free software: you can redistribute it and/or
  24343. * modify it under the terms of the GNU Affero General Public License
  24344. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  24345. * of the License, or (at your option) any later version.
  24346. *
  24347. * The code in this file is distributed in the hope that it will be useful,
  24348. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  24349. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  24350. * General Public License for more details.
  24351. *
  24352. * As additional permission under GNU AGPL version 3 section 7, you may
  24353. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  24354. * AGPL normally required by section 4, provided you include this license
  24355. * notice and a URL through which recipients can access the Corresponding
  24356. * Source.
  24357. */
  24358. function process$2(stylesheets, styles, mediaAllInfo) {
  24359. const stats = { processed: 0, discarded: 0 };
  24360. let sheetIndex = 0;
  24361. stylesheets.forEach((stylesheetInfo, key) => {
  24362. if (!stylesheetInfo.scoped && !key.urlNode) {
  24363. const cssRules = stylesheetInfo.stylesheet.children;
  24364. if (cssRules) {
  24365. stats.processed += cssRules.size;
  24366. stats.discarded += cssRules.size;
  24367. let mediaInfo;
  24368. if (stylesheetInfo.mediaText && stylesheetInfo.mediaText != "all") {
  24369. mediaInfo = mediaAllInfo.medias.get("style-" + sheetIndex + "-" + stylesheetInfo.mediaText);
  24370. } else {
  24371. mediaInfo = mediaAllInfo;
  24372. }
  24373. processRules(cssRules, sheetIndex, mediaInfo);
  24374. stats.discarded -= cssRules.size;
  24375. }
  24376. }
  24377. sheetIndex++;
  24378. });
  24379. styles.forEach(style => processStyleAttribute(style, mediaAllInfo));
  24380. return stats;
  24381. }
  24382. function processRules(cssRules, sheetIndex, mediaInfo, indexes = { mediaRuleIndex: 0 }) {
  24383. const removedCssRules = [];
  24384. for (let cssRule = cssRules.head; cssRule; cssRule = cssRule.next) {
  24385. const ruleData = cssRule.data;
  24386. if (ruleData.type == "Atrule" && ruleData.name == "import" && ruleData.prelude && ruleData.prelude.children && ruleData.prelude.children.head.data.importedChildren) {
  24387. processRules(ruleData.prelude.children.head.data.importedChildren, sheetIndex, mediaInfo, indexes);
  24388. } else if (ruleData.block && ruleData.block.children && ruleData.prelude && ruleData.prelude.children) {
  24389. if (ruleData.type == "Atrule" && ruleData.name == "media") {
  24390. const mediaText = gb(ruleData.prelude);
  24391. processRules(ruleData.block.children, sheetIndex, mediaInfo.medias.get("rule-" + sheetIndex + "-" + indexes.mediaRuleIndex + "-" + mediaText));
  24392. indexes.mediaRuleIndex++;
  24393. } else if (ruleData.type == "Rule") {
  24394. const ruleInfo = mediaInfo.rules.get(ruleData);
  24395. const pseudoSelectors = mediaInfo.pseudoRules.get(ruleData);
  24396. if (!ruleInfo && !pseudoSelectors) {
  24397. removedCssRules.push(cssRule);
  24398. } else if (ruleInfo) {
  24399. processRuleInfo(ruleData, ruleInfo, pseudoSelectors);
  24400. if (!ruleData.prelude.children.size || !ruleData.block.children.size) {
  24401. removedCssRules.push(cssRule);
  24402. }
  24403. }
  24404. }
  24405. } else {
  24406. if (!ruleData || ruleData.type == "Raw" || (ruleData.type == "Rule" && (!ruleData.prelude || ruleData.prelude.type == "Raw"))) {
  24407. removedCssRules.push(cssRule);
  24408. }
  24409. }
  24410. }
  24411. removedCssRules.forEach(cssRule => cssRules.remove(cssRule));
  24412. }
  24413. function processRuleInfo(ruleData, ruleInfo, pseudoSelectors) {
  24414. const removedDeclarations = [];
  24415. const removedSelectors = [];
  24416. let pseudoSelectorFound;
  24417. for (let selector = ruleData.prelude.children.head; selector; selector = selector.next) {
  24418. const selectorText = gb(selector.data);
  24419. if (pseudoSelectors && pseudoSelectors.has(selectorText)) {
  24420. pseudoSelectorFound = true;
  24421. }
  24422. if (!ruleInfo.matchedSelectors.has(selectorText) && (!pseudoSelectors || !pseudoSelectors.has(selectorText))) {
  24423. removedSelectors.push(selector);
  24424. }
  24425. }
  24426. if (!pseudoSelectorFound) {
  24427. for (let declaration = ruleData.block.children.tail; declaration; declaration = declaration.prev) {
  24428. if (!ruleInfo.declarations.has(declaration.data)) {
  24429. removedDeclarations.push(declaration);
  24430. }
  24431. }
  24432. }
  24433. removedDeclarations.forEach(declaration => ruleData.block.children.remove(declaration));
  24434. removedSelectors.forEach(selector => ruleData.prelude.children.remove(selector));
  24435. }
  24436. function processStyleAttribute(styleData, mediaAllInfo) {
  24437. const removedDeclarations = [];
  24438. const styleInfo = mediaAllInfo.matchedStyles.get(styleData);
  24439. if (styleInfo) {
  24440. let propertyFound;
  24441. for (let declaration = styleData.children.head; declaration && !propertyFound; declaration = declaration.next) {
  24442. if (!styleInfo.declarations.has(declaration.data)) {
  24443. removedDeclarations.push(declaration);
  24444. }
  24445. }
  24446. removedDeclarations.forEach(declaration => styleData.children.remove(declaration));
  24447. }
  24448. }
  24449. /*
  24450. * Copyright 2010-2022 Gildas Lormeau
  24451. * contact : gildas.lormeau <at> gmail.com
  24452. *
  24453. * This file is part of SingleFile.
  24454. *
  24455. * The code in this file is free software: you can redistribute it and/or
  24456. * modify it under the terms of the GNU Affero General Public License
  24457. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  24458. * of the License, or (at your option) any later version.
  24459. *
  24460. * The code in this file is distributed in the hope that it will be useful,
  24461. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  24462. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  24463. * General Public License for more details.
  24464. *
  24465. * As additional permission under GNU AGPL version 3 section 7, you may
  24466. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  24467. * AGPL normally required by section 4, provided you include this license
  24468. * notice and a URL through which recipients can access the Corresponding
  24469. * Source.
  24470. */
  24471. const EMPTY_RESOURCE = "data:,";
  24472. function process$1(doc) {
  24473. doc.querySelectorAll("picture").forEach(pictureElement => {
  24474. const imgElement = pictureElement.querySelector("img");
  24475. if (imgElement) {
  24476. let { src, srcset } = getImgSrcData(imgElement);
  24477. if (!src) {
  24478. const data = getSourceSrcData(Array.from(pictureElement.querySelectorAll("source")).reverse());
  24479. src = data.src;
  24480. if (!srcset) {
  24481. srcset = data.srcset;
  24482. }
  24483. }
  24484. setSrc({ src, srcset }, imgElement, pictureElement);
  24485. }
  24486. });
  24487. doc.querySelectorAll(":not(picture) > img[srcset]").forEach(imgElement => setSrc(getImgSrcData(imgElement), imgElement));
  24488. }
  24489. function getImgSrcData(imgElement) {
  24490. let src = imgElement.getAttribute("src");
  24491. if (src == EMPTY_RESOURCE) {
  24492. src = null;
  24493. }
  24494. let srcset = getSourceSrc(imgElement.getAttribute("srcset"));
  24495. if (srcset == EMPTY_RESOURCE) {
  24496. srcset = null;
  24497. }
  24498. return { src, srcset };
  24499. }
  24500. function getSourceSrcData(sources) {
  24501. let source = sources.find(source => source.src);
  24502. let src = source && source.src;
  24503. let srcset = source && source.srcset;
  24504. if (!src) {
  24505. source = sources.find(source => getSourceSrc(source.src));
  24506. src = source && source.src;
  24507. if (src == EMPTY_RESOURCE) {
  24508. src = null;
  24509. }
  24510. }
  24511. if (!srcset) {
  24512. source = sources.find(source => getSourceSrc(source.srcset));
  24513. srcset = source && source.srcset;
  24514. if (srcset == EMPTY_RESOURCE) {
  24515. srcset = null;
  24516. }
  24517. }
  24518. return { src, srcset };
  24519. }
  24520. function setSrc(srcData, imgElement, pictureElement) {
  24521. if (srcData.src) {
  24522. imgElement.setAttribute("src", srcData.src);
  24523. imgElement.setAttribute("srcset", "");
  24524. imgElement.setAttribute("sizes", "");
  24525. } else {
  24526. imgElement.setAttribute("src", EMPTY_RESOURCE);
  24527. if (srcData.srcset) {
  24528. imgElement.setAttribute("srcset", srcData.srcset);
  24529. } else {
  24530. imgElement.setAttribute("srcset", "");
  24531. imgElement.setAttribute("sizes", "");
  24532. }
  24533. }
  24534. if (pictureElement) {
  24535. pictureElement.querySelectorAll("source").forEach(sourceElement => sourceElement.remove());
  24536. }
  24537. }
  24538. function getSourceSrc(sourceSrcSet) {
  24539. if (sourceSrcSet) {
  24540. try {
  24541. const srcset = process$5(sourceSrcSet);
  24542. if (srcset.length) {
  24543. return (srcset.find(srcset => srcset.url)).url;
  24544. }
  24545. } catch (error) {
  24546. // ignored
  24547. }
  24548. }
  24549. }
  24550. /*
  24551. * Copyright 2010-2022 Gildas Lormeau
  24552. * contact : gildas.lormeau <at> gmail.com
  24553. *
  24554. * This file is part of SingleFile.
  24555. *
  24556. * The code in this file is free software: you can redistribute it and/or
  24557. * modify it under the terms of the GNU Affero General Public License
  24558. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  24559. * of the License, or (at your option) any later version.
  24560. *
  24561. * The code in this file is distributed in the hope that it will be useful,
  24562. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  24563. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  24564. * General Public License for more details.
  24565. *
  24566. * As additional permission under GNU AGPL version 3 section 7, you may
  24567. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  24568. * AGPL normally required by section 4, provided you include this license
  24569. * notice and a URL through which recipients can access the Corresponding
  24570. * Source.
  24571. */
  24572. // Derived from the work of Kirill Maltsev - https://github.com/posthtml/htmlnano
  24573. // Source: https://github.com/kangax/html-minifier/issues/63
  24574. const booleanAttributes = [
  24575. "allowfullscreen",
  24576. "async",
  24577. "autofocus",
  24578. "autoplay",
  24579. "checked",
  24580. "compact",
  24581. "controls",
  24582. "declare",
  24583. "default",
  24584. "defaultchecked",
  24585. "defaultmuted",
  24586. "defaultselected",
  24587. "defer",
  24588. "disabled",
  24589. "enabled",
  24590. "formnovalidate",
  24591. "hidden",
  24592. "indeterminate",
  24593. "inert",
  24594. "ismap",
  24595. "itemscope",
  24596. "loop",
  24597. "multiple",
  24598. "muted",
  24599. "nohref",
  24600. "noresize",
  24601. "noshade",
  24602. "novalidate",
  24603. "nowrap",
  24604. "open",
  24605. "pauseonexit",
  24606. "readonly",
  24607. "required",
  24608. "reversed",
  24609. "scoped",
  24610. "seamless",
  24611. "selected",
  24612. "sortable",
  24613. "truespeed",
  24614. "typemustmatch",
  24615. "visible"
  24616. ];
  24617. const noWhitespaceCollapseElements = ["SCRIPT", "STYLE", "PRE", "TEXTAREA"];
  24618. // Source: https://www.w3.org/TR/html4/sgml/dtd.html#events (Generic Attributes)
  24619. const safeToRemoveAttrs = [
  24620. "id",
  24621. "class",
  24622. "style",
  24623. "lang",
  24624. "dir",
  24625. "onclick",
  24626. "ondblclick",
  24627. "onmousedown",
  24628. "onmouseup",
  24629. "onmouseover",
  24630. "onmousemove",
  24631. "onmouseout",
  24632. "onkeypress",
  24633. "onkeydown",
  24634. "onkeyup"
  24635. ];
  24636. const redundantAttributes = {
  24637. "FORM": {
  24638. "method": "get"
  24639. },
  24640. "SCRIPT": {
  24641. "language": "javascript",
  24642. "type": "text/javascript",
  24643. // Remove attribute if the function returns false
  24644. "charset": node => {
  24645. // The charset attribute only really makes sense on “external” SCRIPT elements:
  24646. // http://perfectionkills.com/optimizing-html/#8_script_charset
  24647. return !node.getAttribute("src");
  24648. }
  24649. },
  24650. "STYLE": {
  24651. "media": "all",
  24652. "type": "text/css"
  24653. },
  24654. "LINK": {
  24655. "media": "all"
  24656. }
  24657. };
  24658. const REGEXP_WHITESPACE = /[ \t\f\r]+/g;
  24659. const REGEXP_NEWLINE = /[\n]+/g;
  24660. const REGEXP_ENDS_WHITESPACE = /^\s+$/;
  24661. const NodeFilter_SHOW_ALL = 4294967295;
  24662. const Node_ELEMENT_NODE = 1;
  24663. const Node_TEXT_NODE = 3;
  24664. const Node_COMMENT_NODE = 8;
  24665. const modules = [
  24666. collapseBooleanAttributes,
  24667. mergeTextNodes,
  24668. collapseWhitespace,
  24669. removeComments,
  24670. removeEmptyAttributes,
  24671. removeRedundantAttributes,
  24672. compressJSONLD
  24673. ];
  24674. function process(doc, options) {
  24675. removeEmptyInlineElements(doc);
  24676. const nodesWalker = doc.createTreeWalker(doc.documentElement, NodeFilter_SHOW_ALL, null, false);
  24677. let node = nodesWalker.nextNode();
  24678. while (node) {
  24679. const deletedNode = modules.find(module => module(node, options));
  24680. const previousNode = node;
  24681. node = nodesWalker.nextNode();
  24682. if (deletedNode) {
  24683. previousNode.remove();
  24684. }
  24685. }
  24686. }
  24687. function collapseBooleanAttributes(node) {
  24688. if (node.nodeType == Node_ELEMENT_NODE) {
  24689. Array.from(node.attributes).forEach(attribute => {
  24690. if (booleanAttributes.includes(attribute.name)) {
  24691. node.setAttribute(attribute.name, "");
  24692. }
  24693. });
  24694. }
  24695. }
  24696. function mergeTextNodes(node) {
  24697. if (node.nodeType == Node_TEXT_NODE) {
  24698. if (node.previousSibling && node.previousSibling.nodeType == Node_TEXT_NODE) {
  24699. node.textContent = node.previousSibling.textContent + node.textContent;
  24700. node.previousSibling.remove();
  24701. }
  24702. }
  24703. }
  24704. function collapseWhitespace(node, options) {
  24705. if (node.nodeType == Node_TEXT_NODE) {
  24706. let element = node.parentElement;
  24707. const spacePreserved = element.getAttribute(options.PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME) == "";
  24708. if (!spacePreserved) {
  24709. const textContent = node.textContent;
  24710. let noWhitespace = noWhitespaceCollapse(element);
  24711. while (noWhitespace) {
  24712. element = element.parentElement;
  24713. noWhitespace = element && noWhitespaceCollapse(element);
  24714. }
  24715. if ((!element || noWhitespace) && textContent.length > 1) {
  24716. node.textContent = textContent.replace(REGEXP_WHITESPACE, getWhiteSpace(node)).replace(REGEXP_NEWLINE, "\n");
  24717. }
  24718. }
  24719. }
  24720. }
  24721. function getWhiteSpace(node) {
  24722. return node.parentElement && getTagName(node.parentElement) == "HEAD" ? "\n" : " ";
  24723. }
  24724. function noWhitespaceCollapse(element) {
  24725. return element && !noWhitespaceCollapseElements.includes(getTagName(element));
  24726. }
  24727. function removeComments(node) {
  24728. if (node.nodeType == Node_COMMENT_NODE && getTagName(node.parentElement) != "HTML") {
  24729. return !node.textContent.toLowerCase().trim().startsWith("[if");
  24730. }
  24731. }
  24732. function removeEmptyAttributes(node) {
  24733. if (node.nodeType == Node_ELEMENT_NODE) {
  24734. Array.from(node.attributes).forEach(attribute => {
  24735. if (safeToRemoveAttrs.includes(attribute.name.toLowerCase())) {
  24736. const attributeValue = node.getAttribute(attribute.name);
  24737. if (attributeValue == "" || (attributeValue || "").match(REGEXP_ENDS_WHITESPACE)) {
  24738. node.removeAttribute(attribute.name);
  24739. }
  24740. }
  24741. });
  24742. }
  24743. }
  24744. function removeRedundantAttributes(node) {
  24745. if (node.nodeType == Node_ELEMENT_NODE) {
  24746. const tagRedundantAttributes = redundantAttributes[getTagName(node)];
  24747. if (tagRedundantAttributes) {
  24748. Object.keys(tagRedundantAttributes).forEach(redundantAttributeName => {
  24749. const tagRedundantAttributeValue = tagRedundantAttributes[redundantAttributeName];
  24750. if (typeof tagRedundantAttributeValue == "function" ? tagRedundantAttributeValue(node) : node.getAttribute(redundantAttributeName) == tagRedundantAttributeValue) {
  24751. node.removeAttribute(redundantAttributeName);
  24752. }
  24753. });
  24754. }
  24755. }
  24756. }
  24757. function compressJSONLD(node) {
  24758. if (node.nodeType == Node_ELEMENT_NODE && getTagName(node) == "SCRIPT" && node.type == "application/ld+json" && node.textContent.trim()) {
  24759. try {
  24760. node.textContent = JSON.stringify(JSON.parse(node.textContent));
  24761. } catch (error) {
  24762. // ignored
  24763. }
  24764. }
  24765. }
  24766. function removeEmptyInlineElements(doc) {
  24767. doc.querySelectorAll("style, script:not([src])").forEach(element => {
  24768. if (!element.textContent.trim()) {
  24769. element.remove();
  24770. }
  24771. });
  24772. }
  24773. function getTagName(element) {
  24774. return element.tagName && element.tagName.toUpperCase();
  24775. }
  24776. /*
  24777. * Copyright 2010-2022 Gildas Lormeau
  24778. * contact : gildas.lormeau <at> gmail.com
  24779. *
  24780. * This file is part of SingleFile.
  24781. *
  24782. * The code in this file is free software: you can redistribute it and/or
  24783. * modify it under the terms of the GNU Affero General Public License
  24784. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  24785. * of the License, or (at your option) any later version.
  24786. *
  24787. * The code in this file is distributed in the hope that it will be useful,
  24788. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  24789. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  24790. * General Public License for more details.
  24791. *
  24792. * As additional permission under GNU AGPL version 3 section 7, you may
  24793. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  24794. * AGPL normally required by section 4, provided you include this license
  24795. * notice and a URL through which recipients can access the Corresponding
  24796. * Source.
  24797. */
  24798. const DEBUG = false;
  24799. const ONE_MB = 1024 * 1024;
  24800. const PREFIX_CONTENT_TYPE_TEXT = "text/";
  24801. const DEFAULT_REPLACED_CHARACTERS = ["~", "+", "\\\\", "?", "%", "*", ":", "|", "\"", "<", ">", "\x00-\x1f", "\x7F"];
  24802. const DEFAULT_REPLACEMENT_CHARACTER = "_";
  24803. const CONTENT_TYPE_EXTENSIONS = {
  24804. "image/svg+xml": ".svg",
  24805. "image/png": ".png",
  24806. "image/gif": ".gif",
  24807. "image/tiff": ".tiff",
  24808. "image/bmp": ".bmp",
  24809. "image/x-icon": ".ico",
  24810. "image/heif": ".heif",
  24811. "image/heic": ".heic",
  24812. "image/avif": ".avif",
  24813. "image/apng": ".apng",
  24814. "image/jpeg": ".jpg",
  24815. "image/webp": ".webp",
  24816. "audio/mpeg": ".mp3",
  24817. "audio/ogg": ".ogg",
  24818. "audio/wav": ".wav",
  24819. "audio/webm": ".webm",
  24820. "video/3gpp": ".3gp",
  24821. "video/3gpp2": ".3g2",
  24822. "video/mpeg": ".mpeg",
  24823. "video/quicktime": ".mov",
  24824. "video/x-msvideo": ".avi",
  24825. "video/webm": ".webm",
  24826. "video/ogg": ".ogv",
  24827. "video/mp4": ".mp4",
  24828. "video/mp2t": ".ts",
  24829. "font/otf": ".otf",
  24830. "font/ttf": ".ttf",
  24831. "font/woff": ".woff",
  24832. "font/woff2": ".woff2",
  24833. "application/vnd.ms-fontobject": ".eot",
  24834. "font/collection": ".ttc"
  24835. };
  24836. const CONTENT_TYPE_OCTET_STREAM = "application/octet-stream";
  24837. const URL$1 = globalThis.URL;
  24838. const DOMParser$1 = globalThis.DOMParser;
  24839. const Blob$1 = globalThis.Blob;
  24840. const FileReader$1 = globalThis.FileReader;
  24841. const fetch$1 = (url, options) => globalThis.fetch(url, options);
  24842. const TextDecoder = globalThis.TextDecoder;
  24843. const URLSearchParams = globalThis.URLSearchParams;
  24844. function getInstance(utilOptions) {
  24845. utilOptions = utilOptions || {};
  24846. utilOptions.fetch = utilOptions.fetch || fetch$1;
  24847. utilOptions.frameFetch = utilOptions.frameFetch || utilOptions.fetch || fetch$1;
  24848. return {
  24849. getDoctypeString,
  24850. getFilenameExtension(resourceURL, replacedCharacters, replacementCharacter) {
  24851. let matchExtension;
  24852. try {
  24853. matchExtension = new URL$1(resourceURL).pathname.match(/(\.[^\\/.]*)$/);
  24854. } catch (error) {
  24855. // ignored
  24856. }
  24857. return ((matchExtension && matchExtension[1] && this.getValidFilename(matchExtension[1], replacedCharacters, replacementCharacter)) || "").toLowerCase();
  24858. },
  24859. getContentTypeExtension(contentType) {
  24860. return CONTENT_TYPE_EXTENSIONS[contentType] || "";
  24861. },
  24862. getContent,
  24863. parseURL(resourceURL, baseURI) {
  24864. if (baseURI === undefined) {
  24865. return new URL$1(resourceURL);
  24866. } else {
  24867. return new URL$1(resourceURL, baseURI);
  24868. }
  24869. },
  24870. resolveURL(resourceURL, baseURI) {
  24871. return this.parseURL(resourceURL, baseURI).href;
  24872. },
  24873. getSearchParams(searchParams) {
  24874. return Array.from(new URLSearchParams(searchParams));
  24875. },
  24876. getValidFilename(filename, replacedCharacters = DEFAULT_REPLACED_CHARACTERS, replacementCharacter = DEFAULT_REPLACEMENT_CHARACTER) {
  24877. replacedCharacters.forEach(replacedCharacter => filename = filename.replace(new RegExp("[" + replacedCharacter + "]+", "g"), replacementCharacter));
  24878. filename = filename
  24879. .replace(/\.\.\//g, "")
  24880. .replace(/^\/+/, "")
  24881. .replace(/\/+/g, "/")
  24882. .replace(/\/$/, "")
  24883. .replace(/\.$/, "")
  24884. .replace(/\.\//g, "." + replacementCharacter)
  24885. .replace(/\/\./g, "/" + replacementCharacter);
  24886. return filename;
  24887. },
  24888. parseDocContent(content, baseURI) {
  24889. const doc = (new DOMParser$1()).parseFromString(content, "text/html");
  24890. if (!doc.head) {
  24891. doc.documentElement.insertBefore(doc.createElement("HEAD"), doc.body);
  24892. }
  24893. let baseElement = doc.querySelector("base");
  24894. if (!baseElement || !baseElement.getAttribute("href")) {
  24895. if (baseElement) {
  24896. baseElement.remove();
  24897. }
  24898. baseElement = doc.createElement("base");
  24899. baseElement.setAttribute("href", baseURI);
  24900. doc.head.insertBefore(baseElement, doc.head.firstChild);
  24901. }
  24902. return doc;
  24903. },
  24904. parseXMLContent(content) {
  24905. return (new DOMParser$1()).parseFromString(content, "text/xml");
  24906. },
  24907. parseSVGContent(content) {
  24908. const doc = (new DOMParser$1()).parseFromString(content, "image/svg+xml");
  24909. if (doc.querySelector("parsererror")) {
  24910. return (new DOMParser$1()).parseFromString(content, "text/html");
  24911. } else {
  24912. return doc;
  24913. }
  24914. },
  24915. async digest(algo, text) {
  24916. return digest(algo, text);
  24917. },
  24918. getContentSize(content) {
  24919. return getContentSize(content);
  24920. },
  24921. formatFilename(content, doc, options) {
  24922. return formatFilename(content, doc, options);
  24923. },
  24924. getMimeType(options) {
  24925. return !options.compressContent || options.selfExtractingArchive ? "text/html" : "application/zip";
  24926. },
  24927. async evalTemplate(template, options, content, doc, dontReplaceSlash) {
  24928. return evalTemplate(template, options, content, doc, dontReplaceSlash);
  24929. },
  24930. minifyHTML(doc, options) {
  24931. return process(doc, options);
  24932. },
  24933. minifyCSSRules(stylesheets, styles, mediaAllInfo) {
  24934. return process$2(stylesheets, styles, mediaAllInfo);
  24935. },
  24936. removeUnusedFonts(doc, stylesheets, styles, options) {
  24937. return process$4(doc, stylesheets, styles, options);
  24938. },
  24939. getMediaAllInfo(doc, stylesheets, styles) {
  24940. return getMediaAllInfo(doc, stylesheets, styles);
  24941. },
  24942. compressCSS(content, options) {
  24943. return processString(content, options);
  24944. },
  24945. minifyMedias(stylesheets) {
  24946. return process$3(stylesheets);
  24947. },
  24948. removeAlternativeImages(doc) {
  24949. return process$1(doc);
  24950. },
  24951. parseSrcset(srcset) {
  24952. return process$5(srcset);
  24953. },
  24954. preProcessDoc(doc, win, options) {
  24955. return preProcessDoc(doc, win, options);
  24956. },
  24957. postProcessDoc(doc, markedElements, invalidElements) {
  24958. postProcessDoc(doc, markedElements, invalidElements);
  24959. },
  24960. serialize(doc, compressHTML) {
  24961. return process$7(doc, compressHTML);
  24962. },
  24963. removeQuotes(string) {
  24964. return removeQuotes$1(string);
  24965. },
  24966. appendInfobar(doc, options) {
  24967. return appendInfobar(doc, options);
  24968. },
  24969. findLast(array, callback) {
  24970. if (array.findLast && typeof array.findLast == "function") {
  24971. return array.findLast(callback);
  24972. } else {
  24973. let index = array.length;
  24974. while (index--) {
  24975. if (callback(array[index], index, array)) {
  24976. return array[index];
  24977. }
  24978. }
  24979. }
  24980. },
  24981. ON_BEFORE_CAPTURE_EVENT_NAME: ON_BEFORE_CAPTURE_EVENT_NAME,
  24982. ON_AFTER_CAPTURE_EVENT_NAME: ON_AFTER_CAPTURE_EVENT_NAME,
  24983. WIN_ID_ATTRIBUTE_NAME: WIN_ID_ATTRIBUTE_NAME,
  24984. REMOVED_CONTENT_ATTRIBUTE_NAME: REMOVED_CONTENT_ATTRIBUTE_NAME,
  24985. HIDDEN_CONTENT_ATTRIBUTE_NAME: HIDDEN_CONTENT_ATTRIBUTE_NAME,
  24986. HIDDEN_FRAME_ATTRIBUTE_NAME: HIDDEN_FRAME_ATTRIBUTE_NAME,
  24987. IMAGE_ATTRIBUTE_NAME: IMAGE_ATTRIBUTE_NAME,
  24988. POSTER_ATTRIBUTE_NAME: POSTER_ATTRIBUTE_NAME,
  24989. VIDEO_ATTRIBUTE_NAME: VIDEO_ATTRIBUTE_NAME,
  24990. CANVAS_ATTRIBUTE_NAME: CANVAS_ATTRIBUTE_NAME,
  24991. STYLE_ATTRIBUTE_NAME: STYLE_ATTRIBUTE_NAME,
  24992. INPUT_VALUE_ATTRIBUTE_NAME: INPUT_VALUE_ATTRIBUTE_NAME,
  24993. SHADOW_ROOT_ATTRIBUTE_NAME: SHADOW_ROOT_ATTRIBUTE_NAME,
  24994. PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME: PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME,
  24995. STYLESHEET_ATTRIBUTE_NAME: STYLESHEET_ATTRIBUTE_NAME,
  24996. SELECTED_CONTENT_ATTRIBUTE_NAME: SELECTED_CONTENT_ATTRIBUTE_NAME,
  24997. INVALID_ELEMENT_ATTRIBUTE_NAME: INVALID_ELEMENT_ATTRIBUTE_NAME,
  24998. COMMENT_HEADER: COMMENT_HEADER,
  24999. COMMENT_HEADER_LEGACY: COMMENT_HEADER_LEGACY,
  25000. SINGLE_FILE_UI_ELEMENT_CLASS: SINGLE_FILE_UI_ELEMENT_CLASS,
  25001. EMPTY_RESOURCE: EMPTY_RESOURCE$1,
  25002. INFOBAR_TAGNAME: INFOBAR_TAGNAME,
  25003. WAIT_FOR_USERSCRIPT_PROPERTY_NAME: WAIT_FOR_USERSCRIPT_PROPERTY_NAME,
  25004. NO_SCRIPT_PROPERTY_NAME: NO_SCRIPT_PROPERTY_NAME
  25005. };
  25006. async function getContent(resourceURL, options) {
  25007. let response, startTime, networkTimeoutId, networkTimeoutPromise, resolveNetworkTimeoutPromise;
  25008. const fetchResource = utilOptions.fetch;
  25009. const fetchFrameResource = utilOptions.frameFetch;
  25010. if (options.blockMixedContent && /^https:/i.test(options.baseURI) && !/^https:/i.test(resourceURL)) {
  25011. return getFetchResponse(resourceURL, options);
  25012. }
  25013. if (options.networkTimeout) {
  25014. networkTimeoutPromise = new Promise((resolve, reject) => {
  25015. resolveNetworkTimeoutPromise = resolve;
  25016. networkTimeoutId = globalThis.setTimeout(() => reject(new Error("network timeout")), options.networkTimeout);
  25017. });
  25018. } else {
  25019. networkTimeoutPromise = new Promise(resolve => {
  25020. resolveNetworkTimeoutPromise = resolve;
  25021. });
  25022. }
  25023. try {
  25024. const accept = options.acceptHeaders ? options.acceptHeaders[options.expectedType] : "*/*";
  25025. if (options.frameId) {
  25026. try {
  25027. response = await Promise.race([
  25028. fetchFrameResource(resourceURL, { frameId: options.frameId, referrer: options.resourceReferrer, headers: { accept } }),
  25029. networkTimeoutPromise
  25030. ]);
  25031. } catch (error) {
  25032. response = await Promise.race([
  25033. fetchResource(resourceURL, { headers: { accept } }),
  25034. networkTimeoutPromise
  25035. ]);
  25036. }
  25037. } else {
  25038. response = await Promise.race([
  25039. fetchResource(resourceURL, { referrer: options.resourceReferrer, headers: { accept } }),
  25040. networkTimeoutPromise
  25041. ]);
  25042. }
  25043. } catch (error) {
  25044. return getFetchResponse(resourceURL, options);
  25045. } finally {
  25046. resolveNetworkTimeoutPromise();
  25047. if (options.networkTimeout) {
  25048. globalThis.clearTimeout(networkTimeoutId);
  25049. }
  25050. }
  25051. let buffer;
  25052. try {
  25053. buffer = await response.arrayBuffer();
  25054. } catch (error) {
  25055. return options.inline ? { data: options.asBinary ? EMPTY_RESOURCE$1 : "", resourceURL } : { resourceURL };
  25056. }
  25057. resourceURL = response.url || resourceURL;
  25058. let contentType = "", charset;
  25059. try {
  25060. const mimeType = new MIMEType(response.headers.get("content-type"));
  25061. contentType = mimeType.type + "/" + mimeType.subtype;
  25062. charset = mimeType.parameters.get("charset");
  25063. } catch (error) {
  25064. // ignored
  25065. }
  25066. if (!contentType || (contentType == CONTENT_TYPE_OCTET_STREAM && options.asBinary)) {
  25067. contentType = guessMIMEType(options.expectedType, buffer);
  25068. if (!contentType) {
  25069. contentType = options.contentType ? options.contentType : options.asBinary ? CONTENT_TYPE_OCTET_STREAM : "";
  25070. }
  25071. }
  25072. if (!charset && options.charset) {
  25073. charset = options.charset;
  25074. }
  25075. if (options.asBinary) {
  25076. if (response.status >= 400) {
  25077. return getFetchResponse(resourceURL, options);
  25078. }
  25079. try {
  25080. if (DEBUG) ;
  25081. if (options.maxResourceSizeEnabled && buffer.byteLength > options.maxResourceSize * ONE_MB) {
  25082. return getFetchResponse(resourceURL, options);
  25083. } else {
  25084. return getFetchResponse(resourceURL, options, buffer, null, contentType);
  25085. }
  25086. } catch (error) {
  25087. return getFetchResponse(resourceURL, options);
  25088. }
  25089. } else {
  25090. if (response.status >= 400 || (options.validateTextContentType && contentType && !contentType.startsWith(PREFIX_CONTENT_TYPE_TEXT))) {
  25091. return getFetchResponse(resourceURL, options);
  25092. }
  25093. if (!charset) {
  25094. charset = "utf-8";
  25095. }
  25096. if (options.maxResourceSizeEnabled && buffer.byteLength > options.maxResourceSize * ONE_MB) {
  25097. return getFetchResponse(resourceURL, options, null, charset);
  25098. } else {
  25099. try {
  25100. return getFetchResponse(resourceURL, options, buffer, charset, contentType);
  25101. } catch (error) {
  25102. return getFetchResponse(resourceURL, options, null, charset);
  25103. }
  25104. }
  25105. }
  25106. }
  25107. }
  25108. async function getFetchResponse(resourceURL, options, data, charset, contentType) {
  25109. if (data) {
  25110. if (options.asBinary) {
  25111. if (options.inline) {
  25112. const reader = new FileReader$1();
  25113. reader.readAsDataURL(new Blob$1([data], { type: contentType + (options.charset ? ";charset=" + options.charset : "") }));
  25114. data = await new Promise((resolve, reject) => {
  25115. reader.addEventListener("load", () => resolve(reader.result), false);
  25116. reader.addEventListener("error", reject, false);
  25117. });
  25118. } else {
  25119. data = new Uint8Array(data);
  25120. }
  25121. } else {
  25122. const firstBytes = new Uint8Array(data.slice(0, 4));
  25123. if (firstBytes[0] == 132 && firstBytes[1] == 49 && firstBytes[2] == 149 && firstBytes[3] == 51) {
  25124. charset = "gb18030";
  25125. } else if (firstBytes[0] == 255 && firstBytes[1] == 254) {
  25126. charset = "utf-16le";
  25127. } else if (firstBytes[0] == 254 && firstBytes[1] == 255) {
  25128. charset = "utf-16be";
  25129. }
  25130. try {
  25131. data = new TextDecoder(charset).decode(data);
  25132. } catch (error) {
  25133. charset = "utf-8";
  25134. data = new TextDecoder(charset).decode(data);
  25135. }
  25136. data = data.replace(/\ufeff/gi, "");
  25137. }
  25138. } else if (options.inline) {
  25139. data = options.asBinary ? EMPTY_RESOURCE$1 : "";
  25140. }
  25141. return { data, resourceURL, charset, contentType };
  25142. }
  25143. function guessMIMEType(expectedType, buffer) {
  25144. if (expectedType == "image") {
  25145. if (compareBytes([255, 255, 255, 255], [0, 0, 1, 0])) {
  25146. return "image/x-icon";
  25147. }
  25148. if (compareBytes([255, 255, 255, 255], [0, 0, 2, 0])) {
  25149. return "image/x-icon";
  25150. }
  25151. if (compareBytes([255, 255], [78, 77])) {
  25152. return "image/bmp";
  25153. }
  25154. if (compareBytes([255, 255, 255, 255, 255, 255], [71, 73, 70, 56, 57, 97])) {
  25155. return "image/gif";
  25156. }
  25157. if (compareBytes([255, 255, 255, 255, 255, 255], [71, 73, 70, 56, 59, 97])) {
  25158. return "image/gif";
  25159. }
  25160. if (compareBytes([255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255], [82, 73, 70, 70, 0, 0, 0, 0, 87, 69, 66, 80, 86, 80])) {
  25161. return "image/webp";
  25162. }
  25163. if (compareBytes([255, 255, 255, 255, 255, 255, 255, 255], [137, 80, 78, 71, 13, 10, 26, 10])) {
  25164. return "image/png";
  25165. }
  25166. if (compareBytes([255, 255, 255], [255, 216, 255])) {
  25167. return "image/jpeg";
  25168. }
  25169. }
  25170. if (expectedType == "font") {
  25171. if (compareBytes([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255],
  25172. [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 80])) {
  25173. return "application/vnd.ms-fontobject";
  25174. }
  25175. if (compareBytes([255, 255, 255, 255], [0, 1, 0, 0])) {
  25176. return "font/ttf";
  25177. }
  25178. if (compareBytes([255, 255, 255, 255], [79, 84, 84, 79])) {
  25179. return "font/otf";
  25180. }
  25181. if (compareBytes([255, 255, 255, 255], [116, 116, 99, 102])) {
  25182. return "font/collection";
  25183. }
  25184. if (compareBytes([255, 255, 255, 255], [119, 79, 70, 70])) {
  25185. return "font/woff";
  25186. }
  25187. if (compareBytes([255, 255, 255, 255], [119, 79, 70, 50])) {
  25188. return "font/woff2";
  25189. }
  25190. }
  25191. if (expectedType == "video") {
  25192. if (compareBytes([0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255], [0, 0, 0, 0, 102, 116, 121, 112, 105, 115, 111, 109])) {
  25193. return "video/mp4";
  25194. }
  25195. if (compareBytes([255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255], [82, 73, 70, 70, 0, 0, 0, 0, 87, 65, 86, 69])) {
  25196. return "video/x-msvideo";
  25197. }
  25198. if (compareBytes([255, 255, 255, 255], [0, 0, 1, 179]) || compareBytes([255, 255, 255, 255], [0, 0, 1, 186])) {
  25199. return "video/mpeg";
  25200. }
  25201. if (compareBytes([255, 255, 255, 255], [79, 103, 103, 83])) {
  25202. return "video/ogg";
  25203. }
  25204. if (compareBytes([255], [71])) {
  25205. return "video/mp2t";
  25206. }
  25207. if (compareBytes([255, 255, 255, 255], [26, 69, 223, 163])) {
  25208. return "video/webm";
  25209. }
  25210. if (compareBytes([0, 0, 0, 0, 255, 255, 255, 255, 255, 255], [0, 0, 0, 0, 102, 116, 121, 112, 51, 103])) {
  25211. return "video/3gpp";
  25212. }
  25213. }
  25214. if (expectedType == "audio") {
  25215. if (compareBytes([255, 255], [255, 249]) || compareBytes([255, 255], [255, 254])) {
  25216. return "audio/aac";
  25217. }
  25218. if (compareBytes([255, 255, 255, 255], [77, 84, 104, 100])) {
  25219. return "audio/midi";
  25220. }
  25221. if (compareBytes([255, 255, 255, 255], [0, 0, 1, 179]) || compareBytes([255, 255, 255, 255], [0, 0, 1, 186])) {
  25222. return "audio/mpeg";
  25223. }
  25224. if (compareBytes([255, 255], [255, 251]) || compareBytes([255, 255], [255, 243]) || compareBytes([255, 255], [255, 242]) || compareBytes([255, 255, 255], [73, 68, 51])) {
  25225. return "audio/mpeg";
  25226. }
  25227. if (compareBytes([255, 255, 255, 255], [79, 103, 103, 83])) {
  25228. return "audio/ogg";
  25229. }
  25230. if (compareBytes([255, 255, 255, 255, 0, 0, 0, 0, 255, 255, 255, 255], [82, 73, 70, 70, 0, 0, 0, 0, 87, 65, 86, 69])) {
  25231. return "audio/wav";
  25232. }
  25233. if (compareBytes([255, 255, 255, 255], [26, 69, 223, 163])) {
  25234. return "audio/webm";
  25235. }
  25236. if (compareBytes([0, 0, 0, 0, 255, 255, 255, 255, 255, 255], [0, 0, 0, 0, 102, 116, 121, 112, 51, 103])) {
  25237. return "audio/3gpp";
  25238. }
  25239. }
  25240. function compareBytes(mask, pattern) {
  25241. let patternMatch = true, index = 0;
  25242. if (buffer.byteLength >= pattern.length) {
  25243. const value = new Uint8Array(buffer, 0, mask.length);
  25244. for (index = 0; index < mask.length && patternMatch; index++) {
  25245. patternMatch = patternMatch && ((value[index] & mask[index]) == pattern[index]);
  25246. }
  25247. return patternMatch;
  25248. }
  25249. }
  25250. }
  25251. function getDoctypeString(doc) {
  25252. const docType = doc.doctype;
  25253. let docTypeString = "";
  25254. if (docType) {
  25255. docTypeString = "<!DOCTYPE " + docType.nodeName;
  25256. if (docType.publicId) {
  25257. docTypeString += " PUBLIC \"" + docType.publicId + "\"";
  25258. if (docType.systemId)
  25259. docTypeString += " \"" + docType.systemId + "\"";
  25260. } else if (docType.systemId)
  25261. docTypeString += " SYSTEM \"" + docType.systemId + "\"";
  25262. if (docType.internalSubset)
  25263. docTypeString += " [" + docType.internalSubset + "]";
  25264. docTypeString += "> ";
  25265. }
  25266. return docTypeString;
  25267. }
  25268. function log(...args) {
  25269. console.log("S-File <browser>", ...args); // eslint-disable-line no-console
  25270. }
  25271. /*
  25272. * Copyright 2010-2022 Gildas Lormeau
  25273. * contact : gildas.lormeau <at> gmail.com
  25274. *
  25275. * This file is part of SingleFile.
  25276. *
  25277. * The code in this file is free software: you can redistribute it and/or
  25278. * modify it under the terms of the GNU Affero General Public License
  25279. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  25280. * of the License, or (at your option) any later version.
  25281. *
  25282. * The code in this file is distributed in the hope that it will be useful,
  25283. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  25284. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  25285. * General Public License for more details.
  25286. *
  25287. * As additional permission under GNU AGPL version 3 section 7, you may
  25288. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  25289. * AGPL normally required by section 4, provided you include this license
  25290. * notice and a URL through which recipients can access the Corresponding
  25291. * Source.
  25292. */
  25293. async function extract(content, { password, prompt = () => { }, shadowRootScriptURL, zipOptions = { useWebWorkers: false }, noBlobURL } = {}) {
  25294. const KNOWN_MIMETYPES = {
  25295. "gif": "image/gif",
  25296. "jpg": "image/jpeg",
  25297. "png": "image/png",
  25298. "tif": "image/tiff",
  25299. "tiff": "image/tiff",
  25300. "bmp": "image/bmp",
  25301. "ico": "image/vnd.microsoft.icon",
  25302. "webp": "image/webp",
  25303. "svg": "image/svg+xml",
  25304. "avi": "video/x-msvideo",
  25305. "ogv": "video/ogg",
  25306. "mp4": "video/mp4",
  25307. "mpeg": "video/mpeg",
  25308. "ts": "video/mp2t",
  25309. "webm": "video/webm",
  25310. "3gp": "video/3gpp",
  25311. "3g2": "video/3gpp",
  25312. "mp3": "audio/mpeg",
  25313. "oga": "audio/ogg",
  25314. "mid": "audio/midi",
  25315. "midi": "audio/midi",
  25316. "opus": "audio/opus",
  25317. "wav": "audio/wav",
  25318. "weba": "audio/webm",
  25319. "heif": "image/heif",
  25320. "heic": "image/heic",
  25321. "avif": "image/avif",
  25322. "apng": "image/apng",
  25323. "mov": "video/quicktime",
  25324. "otf": "font/otf",
  25325. "ttf": "font/ttf",
  25326. "woff": "font/woff",
  25327. "woff2": "font/woff2",
  25328. "eot": "application/vnd.ms-fontobject",
  25329. "pdf": "application/pdf"
  25330. };
  25331. const REGEXP_MATCH_STYLESHEET = /stylesheet_[0-9]+\.css/;
  25332. const REGEXP_MATCH_SCRIPT = /scripts\/[0-9]+\.js/;
  25333. const REGEXP_MATCH_ROOT_INDEX = /^([0-9_]+\/)?index\.html$/;
  25334. const REGEXP_MATCH_INDEX = /index\.html$/;
  25335. const REGEXP_MATCH_FRAMES = /frames\//;
  25336. const REGEXP_MATCH_MANIFEST = /manifest\.json$/;
  25337. const CHARSET_UTF8 = ";charset=utf-8";
  25338. const REGEXP_ESCAPE = /([{}()^$&.*?/+|[\\\\]|\]|-)/g;
  25339. if (Array.isArray(content)) {
  25340. content = new Blob([new Uint8Array(content)]);
  25341. }
  25342. zip.configure(zipOptions);
  25343. const blobReader = new zip.BlobReader(content);
  25344. const zipReader = new zip.ZipReader(blobReader);
  25345. const entries = await zipReader.getEntries();
  25346. const options = { password };
  25347. let docContent, origDocContent, url, resources = [], indexPages = [], textResources = [];
  25348. await Promise.all(entries.map(async entry => {
  25349. const { filename } = entry;
  25350. let dataWriter, content, textContent, mimeType;
  25351. const resourceInfo = {};
  25352. if (!options.password && entry.encrypted) {
  25353. options.password = prompt("Please enter the password to view the page");
  25354. }
  25355. if (filename.match(REGEXP_MATCH_INDEX) || filename.match(REGEXP_MATCH_STYLESHEET) || filename.match(REGEXP_MATCH_SCRIPT)) {
  25356. if (filename.match(REGEXP_MATCH_INDEX)) {
  25357. indexPages.push(resourceInfo);
  25358. } else {
  25359. textResources.push(resourceInfo);
  25360. }
  25361. dataWriter = new zip.TextWriter();
  25362. textContent = await entry.getData(dataWriter, options);
  25363. if (filename.match(REGEXP_MATCH_INDEX)) {
  25364. mimeType = "text/html" + CHARSET_UTF8;
  25365. } else {
  25366. if (filename.match(REGEXP_MATCH_STYLESHEET)) {
  25367. mimeType = "text/css" + CHARSET_UTF8;
  25368. } else if (filename.match(REGEXP_MATCH_SCRIPT)) {
  25369. mimeType = "text/javascript" + CHARSET_UTF8;
  25370. }
  25371. }
  25372. } else {
  25373. resources.push(resourceInfo);
  25374. const extension = filename.match(/\.([^.]+)/);
  25375. if (extension && extension[1] && KNOWN_MIMETYPES[extension[1]]) {
  25376. mimeType = KNOWN_MIMETYPES[extension[1]];
  25377. } else {
  25378. mimeType = "application/octet-stream";
  25379. }
  25380. if (filename.match(REGEXP_MATCH_FRAMES) || noBlobURL) {
  25381. content = await entry.getData(new zip.Data64URIWriter(mimeType), options);
  25382. } else {
  25383. const blob = await entry.getData(new zip.BlobWriter(mimeType), options);
  25384. content = URL.createObjectURL(blob);
  25385. }
  25386. }
  25387. const name = entry.filename.match(/^([0-9_]+\/)?(.*)$/)[2];
  25388. let prefixPath = "";
  25389. const prefixPathMatch = filename.match(/(.*\/)[^/]+$/);
  25390. if (prefixPathMatch && prefixPathMatch[1]) {
  25391. prefixPath = prefixPathMatch[1];
  25392. }
  25393. Object.assign(resourceInfo, {
  25394. prefixPath,
  25395. filename: entry.filename,
  25396. name,
  25397. url: entry.comment,
  25398. content,
  25399. mimeType,
  25400. textContent,
  25401. parentResources: []
  25402. });
  25403. }));
  25404. await zipReader.close();
  25405. indexPages.sort(sortByFilenameLengthDec);
  25406. textResources.sort(sortByFilenameLengthInc);
  25407. resources = resources.sort(sortByFilenameLengthDec).concat(...textResources).concat(...indexPages);
  25408. for (const resource of resources) {
  25409. const { filename, prefixPath } = resource;
  25410. let { textContent } = resource;
  25411. if (textContent !== undefined) {
  25412. if (filename.match(REGEXP_MATCH_ROOT_INDEX)) {
  25413. origDocContent = textContent;
  25414. }
  25415. if (!filename.match(REGEXP_MATCH_SCRIPT)) {
  25416. resources.forEach(innerResource => {
  25417. const { filename, parentResources, content } = innerResource;
  25418. if (filename.startsWith(prefixPath) && filename != resource.filename) {
  25419. const relativeFilename = filename.substring(prefixPath.length);
  25420. if (!relativeFilename.match(REGEXP_MATCH_MANIFEST)) {
  25421. if (textContent.includes(relativeFilename)) {
  25422. parentResources.push(resource.filename);
  25423. if (innerResource.textContent === undefined) {
  25424. textContent = replaceAll(textContent, relativeFilename, content);
  25425. }
  25426. }
  25427. }
  25428. }
  25429. });
  25430. resource.textContent = textContent;
  25431. }
  25432. }
  25433. }
  25434. for (const resource of resources) {
  25435. let { textContent, prefixPath, filename } = resource;
  25436. if (textContent !== undefined) {
  25437. if (!filename.match(REGEXP_MATCH_SCRIPT)) {
  25438. const resourceFilename = filename;
  25439. for (const innerResource of resources) {
  25440. const { filename } = innerResource;
  25441. if (filename.startsWith(prefixPath) && filename != resourceFilename) {
  25442. const relativeFilename = filename.substring(prefixPath.length);
  25443. if (!relativeFilename.match(REGEXP_MATCH_MANIFEST)) {
  25444. const position = textContent.indexOf(relativeFilename);
  25445. if (position != -1) {
  25446. innerResource.content = await getContent(innerResource);
  25447. textContent = replaceAll(textContent, relativeFilename, innerResource.content);
  25448. }
  25449. }
  25450. }
  25451. }
  25452. resource.textContent = textContent;
  25453. resource.content = await getContent(resource);
  25454. }
  25455. if (filename.match(REGEXP_MATCH_INDEX)) {
  25456. if (shadowRootScriptURL) {
  25457. resource.textContent = textContent.replace(/<script data-template-shadow-root.*<\/script>/g, "<script data-template-shadow-root src=" + shadowRootScriptURL + "></" + "script>");
  25458. }
  25459. }
  25460. if (filename.match(REGEXP_MATCH_ROOT_INDEX)) {
  25461. docContent = textContent;
  25462. url = resource.url;
  25463. }
  25464. }
  25465. }
  25466. return { docContent, origDocContent, resources, url };
  25467. async function getContent(resource) {
  25468. return resource.filename.match(REGEXP_MATCH_FRAMES) || noBlobURL ? await getDataURI(resource.textContent, resource.mimeType) : URL.createObjectURL(new Blob([resource.textContent], { type: resource.mimeType }));
  25469. }
  25470. async function getDataURI(textContent, mimeType) {
  25471. const reader = new FileReader();
  25472. reader.readAsDataURL(new Blob([textContent], { type: mimeType }));
  25473. return new Promise((resolve, reject) => {
  25474. reader.onload = () => resolve(reader.result.replace(CHARSET_UTF8, ""));
  25475. reader.onerror = reject;
  25476. });
  25477. }
  25478. function replaceAll(string, search, replacement) {
  25479. if (typeof string.replaceAll == "function") {
  25480. return string.replaceAll(search, replacement);
  25481. } else {
  25482. const searchRegExp = new RegExp(search.replace(REGEXP_ESCAPE, "\\$1"), "g");
  25483. return string.replace(searchRegExp, replacement);
  25484. }
  25485. }
  25486. function sortByFilenameLengthDec(resourceLeft, resourceRight) {
  25487. const lengthDifference = resourceRight.filename.length - resourceLeft.filename.length;
  25488. if (lengthDifference) {
  25489. return lengthDifference;
  25490. } else {
  25491. return resourceRight.filename.localeCompare(resourceLeft.filename);
  25492. }
  25493. }
  25494. function sortByFilenameLengthInc(resourceLeft, resourceRight) {
  25495. const lengthDifference = resourceLeft.filename.length - resourceRight.filename.length;
  25496. if (lengthDifference) {
  25497. return lengthDifference;
  25498. } else {
  25499. return resourceLeft.filename.localeCompare(resourceRight.filename);
  25500. }
  25501. }
  25502. }
  25503. /*
  25504. * Copyright 2010-2022 Gildas Lormeau
  25505. * contact : gildas.lormeau <at> gmail.com
  25506. *
  25507. * This file is part of SingleFile.
  25508. *
  25509. * The code in this file is free software: you can redistribute it and/or
  25510. * modify it under the terms of the GNU Affero General Public License
  25511. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  25512. * of the License, or (at your option) any later version.
  25513. *
  25514. * The code in this file is distributed in the hope that it will be useful,
  25515. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  25516. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  25517. * General Public License for more details.
  25518. *
  25519. * As additional permission under GNU AGPL version 3 section 7, you may
  25520. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  25521. * AGPL normally required by section 4, provided you include this license
  25522. * notice and a URL through which recipients can access the Corresponding
  25523. * Source.
  25524. */
  25525. async function display(document, docContent, { disableFramePointerEvents } = {}) {
  25526. docContent = docContent.replace(/<noscript/gi, "<template disabled-noscript");
  25527. docContent = docContent.replaceAll(/<\/noscript/gi, "</template");
  25528. const doc = (new DOMParser()).parseFromString(docContent, "text/html");
  25529. if (disableFramePointerEvents) {
  25530. doc.querySelectorAll("iframe").forEach(element => {
  25531. const pointerEvents = "pointer-events";
  25532. element.style.setProperty("-sf-" + pointerEvents, element.style.getPropertyValue(pointerEvents), element.style.getPropertyPriority(pointerEvents));
  25533. element.style.setProperty(pointerEvents, "none", "important");
  25534. });
  25535. }
  25536. document.open();
  25537. document.write(getDoctypeString(doc));
  25538. document.write(doc.documentElement.outerHTML);
  25539. document.close();
  25540. document.querySelectorAll("template[disabled-noscript]").forEach(element => {
  25541. const noscriptElement = document.createElement("noscript");
  25542. element.removeAttribute("disabled-noscript");
  25543. Array.from(element.attributes).forEach(attribute => noscriptElement.setAttribute(attribute.name, attribute.value));
  25544. noscriptElement.textContent = element.innerHTML;
  25545. element.parentElement.replaceChild(noscriptElement, element);
  25546. });
  25547. document.documentElement.setAttribute("data-sfz", "");
  25548. document.querySelectorAll("link[rel*=icon]").forEach(element => element.parentElement.replaceChild(element, element));
  25549. function getDoctypeString(doc) {
  25550. const docType = doc.doctype;
  25551. let docTypeString = "";
  25552. if (docType) {
  25553. docTypeString = "<!DOCTYPE " + docType.nodeName;
  25554. if (docType.publicId) {
  25555. docTypeString += " PUBLIC \"" + docType.publicId + "\"";
  25556. if (docType.systemId)
  25557. docTypeString += " \"" + docType.systemId + "\"";
  25558. } else if (docType.systemId)
  25559. docTypeString += " SYSTEM \"" + docType.systemId + "\"";
  25560. if (docType.internalSubset)
  25561. docTypeString += " [" + docType.internalSubset + "]";
  25562. docTypeString += "> ";
  25563. }
  25564. return docTypeString;
  25565. }
  25566. }
  25567. /*
  25568. * Copyright 2010-2020 Gildas Lormeau
  25569. * contact : gildas.lormeau <at> gmail.com
  25570. *
  25571. * This file is part of SingleFile.
  25572. *
  25573. * The code in this file is free software: you can redistribute it and/or
  25574. * modify it under the terms of the GNU Affero General Public License
  25575. * (GNU AGPL) as published by the Free Software Foundation, either version 3
  25576. * of the License, or (at your option) any later version.
  25577. *
  25578. * The code in this file is distributed in the hope that it will be useful,
  25579. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  25580. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
  25581. * General Public License for more details.
  25582. *
  25583. * As additional permission under GNU AGPL version 3 section 7, you may
  25584. * distribute UNMODIFIED VERSIONS OF THIS file without the copy of the GNU
  25585. * AGPL normally required by section 4, provided you include this license
  25586. * notice and a URL through which recipients can access the Corresponding
  25587. * Source.
  25588. */
  25589. const util = getInstance();
  25590. const helper = {
  25591. serialize(doc, compressHTML) {
  25592. return process$7(doc, compressHTML);
  25593. },
  25594. getDoctypeString(doc) {
  25595. return util.getDoctypeString(doc);
  25596. },
  25597. appendInfobar(doc, options, useShadowRoot) {
  25598. return appendInfobar$1(doc, options, useShadowRoot);
  25599. },
  25600. extractInfobarData(doc) {
  25601. return extractInfobarData(doc);
  25602. },
  25603. displayIcon(doc, useShadowRoot) {
  25604. return displayIcon(doc, useShadowRoot);
  25605. },
  25606. zip: zip$1,
  25607. extract,
  25608. display,
  25609. formatFilename,
  25610. INFOBAR_TAGNAME: INFOBAR_TAGNAME$1
  25611. };
  25612. exports.helper = helper;
  25613. Object.defineProperty(exports, '__esModule', { value: true });
  25614. }));