main.js 1.0 MB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281
  1. 'use strict';
  2. var obsidian = require('obsidian');
  3. /*! *****************************************************************************
  4. Copyright (c) Microsoft Corporation.
  5. Permission to use, copy, modify, and/or distribute this software for any
  6. purpose with or without fee is hereby granted.
  7. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
  8. REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  12. OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. PERFORMANCE OF THIS SOFTWARE.
  14. ***************************************************************************** */
  15. /* global Reflect, Promise */
  16. var extendStatics = function(d, b) {
  17. extendStatics = Object.setPrototypeOf ||
  18. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  19. function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
  20. return extendStatics(d, b);
  21. };
  22. function __extends(d, b) {
  23. if (typeof b !== "function" && b !== null)
  24. throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
  25. extendStatics(d, b);
  26. function __() { this.constructor = d; }
  27. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  28. }
  29. function __awaiter(thisArg, _arguments, P, generator) {
  30. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  31. return new (P || (P = Promise))(function (resolve, reject) {
  32. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  33. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  34. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  35. step((generator = generator.apply(thisArg, _arguments || [])).next());
  36. });
  37. }
  38. function __generator(thisArg, body) {
  39. var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
  40. return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
  41. function verb(n) { return function (v) { return step([n, v]); }; }
  42. function step(op) {
  43. if (f) throw new TypeError("Generator is already executing.");
  44. while (_) try {
  45. if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
  46. if (y = 0, t) op = [op[0] & 2, t.value];
  47. switch (op[0]) {
  48. case 0: case 1: t = op; break;
  49. case 4: _.label++; return { value: op[1], done: false };
  50. case 5: _.label++; y = op[1]; op = [0]; continue;
  51. case 7: op = _.ops.pop(); _.trys.pop(); continue;
  52. default:
  53. if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
  54. if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
  55. if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
  56. if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
  57. if (t[2]) _.ops.pop();
  58. _.trys.pop(); continue;
  59. }
  60. op = body.call(thisArg, _);
  61. } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
  62. if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
  63. }
  64. }
  65. // ------------------------------------------------------------
  66. // Card block
  67. // ------------------------------------------------------------
  68. var CardStyle;
  69. (function (CardStyle) {
  70. CardStyle[CardStyle["Folder"] = 0] = "Folder";
  71. CardStyle[CardStyle["Note"] = 1] = "Note";
  72. CardStyle[CardStyle["Image"] = 2] = "Image";
  73. })(CardStyle || (CardStyle = {}));
  74. var CardBlock = /** @class */ (function () {
  75. function CardBlock() {
  76. this.style = 'card';
  77. this.cards = [];
  78. this.col = -1;
  79. this.imagePrefix = '';
  80. }
  81. CardBlock.prototype.addCard = function (card) {
  82. this.cards.push(card);
  83. };
  84. CardBlock.prototype.clear = function () {
  85. this.cards = [];
  86. };
  87. CardBlock.prototype.getCardNum = function () {
  88. return this.cards.length;
  89. };
  90. CardBlock.prototype.getDocElement = function (app) {
  91. var cardDiv = document.createElement('div');
  92. if (this.style == 'strip') {
  93. cardDiv.addClass('strip-card-band');
  94. for (var i in this.cards) {
  95. var cardEl = this.cards[i].getBoxElement(app, this.imagePrefix);
  96. cardEl.addClass('strip-card-view');
  97. cardDiv.appendChild(cardEl);
  98. }
  99. }
  100. else { // default: this.style == 'card'
  101. cardDiv.addClass('cute-card-band');
  102. for (var i in this.cards) {
  103. var cardEl = this.cards[i].getBoxElement(app, this.imagePrefix);
  104. cardEl.addClass('cute-card-view');
  105. cardDiv.appendChild(cardEl);
  106. }
  107. if (this.col > 0) {
  108. cardDiv.setAttr('style', "grid-template-columns: repeat(" + this.col + ", 1fr);");
  109. }
  110. }
  111. return cardDiv;
  112. };
  113. CardBlock.prototype.getYamlCode = function () {
  114. var yamlStr = '';
  115. var nCard = this.getCardNum();
  116. if (nCard > 0) {
  117. yamlStr = '\n```ccard\nitems: [';
  118. for (var i in this.cards) {
  119. yamlStr += '\n {\n';
  120. yamlStr += this.cards[i].getYamlCode(' ');
  121. yamlStr += ' },';
  122. }
  123. // get rid of last period
  124. yamlStr = yamlStr.substring(0, yamlStr.length - 1);
  125. yamlStr += '\n]\n';
  126. if (this.col > 0) {
  127. yamlStr += "col: " + this.col + "\n";
  128. }
  129. yamlStr += '```\n';
  130. }
  131. return yamlStr;
  132. };
  133. CardBlock.prototype.fromYamlCards = function (yaml) {
  134. // parser options
  135. this.fromYamlOptions(yaml);
  136. // parser items
  137. if (yaml.items) {
  138. this.clear();
  139. var allItems = yaml.items;
  140. for (var i in allItems) {
  141. var cardInfo = allItems[i];
  142. if ('title' in cardInfo) {
  143. var cardItem = new CardItem(cardInfo['title'], CardStyle.Note);
  144. cardItem.fromDict(cardInfo);
  145. this.addCard(cardItem);
  146. }
  147. }
  148. }
  149. // return
  150. return (this.getCardNum() > 0);
  151. };
  152. CardBlock.prototype.fromYamlOptions = function (yaml) {
  153. if (yaml.style) {
  154. this.style = yaml.style;
  155. }
  156. if (yaml.col) {
  157. this.col = yaml.col;
  158. }
  159. if (yaml.imagePrefix) {
  160. this.imagePrefix = yaml.imagePrefix;
  161. }
  162. };
  163. return CardBlock;
  164. }());
  165. var CardItem = /** @class */ (function () {
  166. function CardItem(title, style) {
  167. this.title = title;
  168. this.abstract = "No abstract.";
  169. this.cardStyle = style;
  170. }
  171. CardItem.prototype.setHeadText = function (text) {
  172. this.headText = text;
  173. };
  174. CardItem.prototype.setHeadImage = function (linkUrl) {
  175. this.headImage = linkUrl;
  176. };
  177. CardItem.prototype.setTitle = function (title) {
  178. this.title = title;
  179. };
  180. CardItem.prototype.setTitleLink = function (linkUrl) {
  181. this.titleLink = linkUrl;
  182. };
  183. CardItem.prototype.setAbstract = function (abstract) {
  184. this.abstract = abstract;
  185. };
  186. CardItem.prototype.setFootnote = function (footnote) {
  187. this.footnote = footnote;
  188. };
  189. CardItem.prototype.fromDict = function (dict) {
  190. if ('head' in dict) {
  191. this.headText = dict['head'];
  192. if (this.headText == 'Folder') {
  193. this.cardStyle = CardStyle.Folder;
  194. }
  195. else if (this.headText == 'Note') {
  196. this.cardStyle = CardStyle.Note;
  197. }
  198. }
  199. if ('image' in dict)
  200. this.headImage = dict['image'];
  201. if ('link' in dict)
  202. this.titleLink = dict['link'];
  203. if ('brief' in dict)
  204. this.abstract = dict['brief'];
  205. if ('foot' in dict)
  206. this.footnote = dict['foot'];
  207. };
  208. CardItem.prototype.yamlEscapeQuotes = function (org) {
  209. return org.replace(/'/gi, "''");
  210. };
  211. CardItem.prototype.getYamlCode = function (prefix) {
  212. var yamlStr = '';
  213. yamlStr += prefix + "title: '" + this.yamlEscapeQuotes(this.title) + "'";
  214. if (this.titleLink)
  215. yamlStr += ",\n" + prefix + "link: '" + this.yamlEscapeQuotes(this.titleLink) + "'";
  216. if (this.abstract)
  217. yamlStr += ",\n" + prefix + "brief: '" + this.yamlEscapeQuotes(this.abstract) + "'";
  218. if (this.footnote)
  219. yamlStr += ",\n" + prefix + "foot: '" + this.yamlEscapeQuotes(this.footnote) + "'";
  220. if (this.headImage) {
  221. yamlStr += ",\n" + prefix + "image: '" + this.yamlEscapeQuotes(this.headImage) + "'";
  222. }
  223. else if (this.headText) {
  224. yamlStr += ",\n" + prefix + "head: '" + this.yamlEscapeQuotes(this.headText) + "'";
  225. }
  226. else {
  227. if (this.cardStyle == CardStyle.Folder) {
  228. yamlStr += ",\n" + prefix + "head: 'Folder'";
  229. }
  230. else if (this.cardStyle == CardStyle.Note) {
  231. yamlStr += ",\n" + prefix + "head: 'Note'";
  232. }
  233. else {
  234. yamlStr += ",\n" + prefix + "head: 'Card'";
  235. }
  236. }
  237. yamlStr += '\n';
  238. return yamlStr;
  239. };
  240. CardItem.prototype.getBoxElement = function (app, imagePrefix) {
  241. var cardEl = document.createElement('div');
  242. // Heading
  243. var headEl = cardEl.appendChild(document.createElement('div'));
  244. if (this.headImage) {
  245. this.cardStyle = CardStyle.Image;
  246. if (this.headImage.startsWith("#")) {
  247. // color
  248. headEl.addClass('thumb-color');
  249. headEl.setAttr('style', "background-color: " + this.headImage + ";");
  250. }
  251. else if (this.headImage.contains("://")) {
  252. // app local image
  253. headEl.addClass('thumb');
  254. headEl.setAttr('style', "background-image: url(" + this.headImage + ");");
  255. }
  256. else {
  257. // asset file name?
  258. var imageUrl = this.headImage;
  259. if (imagePrefix.length > 0) {
  260. // skip explicitly path
  261. var urlPathList = imageUrl.split('/').join(' ').trimStart();
  262. var fixPathList = imagePrefix.split('/').join(' ').trimStart();
  263. if (!urlPathList.startsWith(fixPathList)) {
  264. imageUrl = imagePrefix + this.headImage;
  265. }
  266. }
  267. if (!imageUrl.contains('://')) {
  268. imageUrl = app.vault.adapter.getResourcePath(imageUrl);
  269. }
  270. headEl.addClass('thumb');
  271. headEl.setAttr('style', "background-image: url(" + imageUrl + ");");
  272. }
  273. if (this.headText) {
  274. headEl.textContent = this.headText;
  275. }
  276. }
  277. else if (this.cardStyle == CardStyle.Folder) {
  278. headEl.addClasses(['thumb-color', 'thumb-color-folder']);
  279. headEl.textContent = 'Folder';
  280. }
  281. else if (this.cardStyle == CardStyle.Note) {
  282. headEl.addClasses(['thumb-color', 'thumb-color-note']);
  283. headEl.textContent = 'Note';
  284. }
  285. // article
  286. var articleEl = cardEl.appendChild(document.createElement('article'));
  287. // Title
  288. if (this.titleLink) {
  289. var titleEl = articleEl.appendChild(document.createElement('a'));
  290. if (this.titleLink.endsWith('.md')) {
  291. titleEl.addClass('internal-link');
  292. }
  293. titleEl.href = this.titleLink;
  294. var h1El = document.createElement('h1');
  295. h1El.textContent = this.title;
  296. titleEl.appendChild(h1El);
  297. }
  298. else {
  299. var titleEl = articleEl.appendChild(document.createElement('h1'));
  300. titleEl.textContent = this.title;
  301. }
  302. // abstract
  303. var briefEl = articleEl.appendChild(document.createElement('p'));
  304. briefEl.textContent = this.abstract;
  305. // footnote
  306. if (this.footnote) {
  307. var footEl = articleEl.appendChild(document.createElement('span'));
  308. footEl.textContent = this.footnote;
  309. }
  310. // close
  311. return cardEl;
  312. };
  313. return CardItem;
  314. }());
  315. // ------------------------------------------------------------
  316. // Folder Brief
  317. // ------------------------------------------------------------
  318. var FolderBrief = /** @class */ (function () {
  319. function FolderBrief(app) {
  320. this.app = app;
  321. this.folderPath = '';
  322. this.briefMax = 64;
  323. this.noteOnly = false;
  324. }
  325. // for cards type: folder_brief
  326. FolderBrief.prototype.yamlFolderBrief = function (yaml) {
  327. return __awaiter(this, void 0, void 0, function () {
  328. var folderPath, activeFile, notePath, folderExist, view, briefCards, cardsElem;
  329. return __generator(this, function (_a) {
  330. switch (_a.label) {
  331. case 0:
  332. folderPath = '';
  333. activeFile = this.app.workspace.getActiveFile();
  334. notePath = activeFile.path;
  335. if (!yaml.cards.folder) return [3 /*break*/, 2];
  336. folderPath = yaml.cards.folder;
  337. return [4 /*yield*/, this.app.vault.adapter.exists(folderPath)];
  338. case 1:
  339. folderExist = _a.sent();
  340. if (!folderExist)
  341. folderPath = '';
  342. return [3 /*break*/, 3];
  343. case 2:
  344. folderPath = activeFile.parent.path;
  345. _a.label = 3;
  346. case 3:
  347. if (!(folderPath.length > 0)) return [3 /*break*/, 5];
  348. view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
  349. if (!view) return [3 /*break*/, 5];
  350. return [4 /*yield*/, this.makeBriefCards(folderPath, notePath)];
  351. case 4:
  352. briefCards = _a.sent();
  353. cardsElem = briefCards.getDocElement(this.app);
  354. return [2 /*return*/, cardsElem];
  355. case 5: return [2 /*return*/, null];
  356. }
  357. });
  358. });
  359. };
  360. // generate folder overview
  361. FolderBrief.prototype.makeBriefCards = function (folderPath, activeNotePath) {
  362. return __awaiter(this, void 0, void 0, function () {
  363. var cardBlock, pathList, subFolderList, subFileList, i, subFolderPath, noteExists, folderCard, i, subFilePath, noteCard;
  364. return __generator(this, function (_a) {
  365. switch (_a.label) {
  366. case 0:
  367. cardBlock = new CardBlock();
  368. return [4 /*yield*/, this.app.vault.adapter.list(folderPath)];
  369. case 1:
  370. pathList = _a.sent();
  371. subFolderList = pathList.folders;
  372. subFileList = pathList.files;
  373. if (!!this.noteOnly) return [3 /*break*/, 6];
  374. i = 0;
  375. _a.label = 2;
  376. case 2:
  377. if (!(i < subFolderList.length)) return [3 /*break*/, 6];
  378. subFolderPath = subFolderList[i];
  379. return [4 /*yield*/, this.app.vault.adapter.exists(subFolderPath + '.md')];
  380. case 3:
  381. noteExists = _a.sent();
  382. if (!!noteExists) return [3 /*break*/, 5];
  383. return [4 /*yield*/, this.makeFolderCard(folderPath, subFolderPath)];
  384. case 4:
  385. folderCard = _a.sent();
  386. cardBlock.addCard(folderCard);
  387. _a.label = 5;
  388. case 5:
  389. i++;
  390. return [3 /*break*/, 2];
  391. case 6:
  392. i = 0;
  393. _a.label = 7;
  394. case 7:
  395. if (!(i < subFileList.length)) return [3 /*break*/, 10];
  396. subFilePath = subFileList[i];
  397. if (!subFilePath.endsWith('.md'))
  398. return [3 /*break*/, 9];
  399. if (subFilePath == activeNotePath)
  400. return [3 /*break*/, 9]; // omit self includeing
  401. return [4 /*yield*/, this.makeNoteCard(folderPath, subFilePath)];
  402. case 8:
  403. noteCard = _a.sent();
  404. cardBlock.addCard(noteCard);
  405. _a.label = 9;
  406. case 9:
  407. i++;
  408. return [3 /*break*/, 7];
  409. case 10:
  410. // return
  411. return [2 /*return*/, cardBlock];
  412. }
  413. });
  414. });
  415. };
  416. // make folder brief card
  417. FolderBrief.prototype.makeFolderCard = function (folderPath, subFolderPath) {
  418. return __awaiter(this, void 0, void 0, function () {
  419. var subFolderName, card, subPathList, folderBrief;
  420. return __generator(this, function (_a) {
  421. switch (_a.label) {
  422. case 0:
  423. subFolderName = subFolderPath.split('/').pop();
  424. card = new CardItem(subFolderName, CardStyle.Folder);
  425. return [4 /*yield*/, this.app.vault.adapter.list(subFolderPath)];
  426. case 1:
  427. subPathList = _a.sent();
  428. folderBrief = 'Contains ';
  429. folderBrief += subPathList.folders.length.toString() + ' folders, ';
  430. folderBrief += subPathList.files.length.toString() + ' notes.';
  431. card.setAbstract(folderBrief);
  432. // footnote, use date in the future
  433. card.setFootnote(subFolderPath.replace(folderPath + '/', ''));
  434. // return
  435. return [2 /*return*/, card];
  436. }
  437. });
  438. });
  439. };
  440. // make note brief card
  441. FolderBrief.prototype.makeNoteCard = function (folderPath, notePath) {
  442. return __awaiter(this, void 0, void 0, function () {
  443. var noteName, noteTitle, card, file, contentOrg, imageUrl, contentBrief, fileSt, date;
  444. return __generator(this, function (_a) {
  445. switch (_a.label) {
  446. case 0:
  447. noteName = notePath.split('/').pop();
  448. noteTitle = noteName.substring(0, noteName.length - 3);
  449. card = new CardItem(noteTitle, CardStyle.Note);
  450. card.setTitleLink(notePath);
  451. file = this.app.vault.getAbstractFileByPath(notePath);
  452. if (!(file && file instanceof obsidian.TFile)) return [3 /*break*/, 2];
  453. return [4 /*yield*/, this.app.vault.cachedRead(file)];
  454. case 1:
  455. contentOrg = _a.sent();
  456. imageUrl = this.getContentImage(contentOrg, folderPath);
  457. if (imageUrl.length > 0) {
  458. card.setHeadImage(imageUrl);
  459. }
  460. contentBrief = this.getContentBrief(contentOrg);
  461. if (contentBrief.length > 0) {
  462. if (contentBrief.length > this.briefMax) {
  463. contentBrief = contentBrief.substring(0, this.briefMax);
  464. contentBrief += '...';
  465. }
  466. card.setAbstract(contentBrief);
  467. }
  468. fileSt = file;
  469. if (fileSt.stat) {
  470. date = new Date(fileSt.stat.mtime);
  471. card.setFootnote(date.toLocaleString());
  472. }
  473. else {
  474. card.setFootnote(notePath.replace(folderPath + '/', ''));
  475. }
  476. _a.label = 2;
  477. case 2:
  478. // return
  479. return [2 /*return*/, card];
  480. }
  481. });
  482. });
  483. };
  484. FolderBrief.prototype.getContentImage = function (contentOrg, folderPath) {
  485. var imageUrl = '';
  486. // for patten: ![xxx.png]
  487. var regexImg = new RegExp('!\\[(.*?)\\]\\((.*?)\\)');
  488. var match = regexImg.exec(contentOrg);
  489. if (match != null) {
  490. imageUrl = match[2];
  491. }
  492. else {
  493. // for patten: ![[xxx.png]]
  494. var regexImg2 = new RegExp('!\\[\\[(.*?)\\]\\]');
  495. match = regexImg2.exec(contentOrg);
  496. if (match != null)
  497. imageUrl = match[1];
  498. }
  499. // add image url
  500. if (imageUrl.length > 0) {
  501. if (!imageUrl.startsWith('http')) {
  502. var headPath = folderPath;
  503. var relativePath = false;
  504. while (imageUrl.startsWith('../')) {
  505. imageUrl = imageUrl.substring(3);
  506. headPath = headPath.substring(0, headPath.lastIndexOf('/'));
  507. relativePath = true;
  508. }
  509. if (relativePath) {
  510. imageUrl = headPath + '/' + imageUrl;
  511. }
  512. imageUrl = imageUrl.replace(/\%20/g, ' ');
  513. // imageUrl = this.app.vault.adapter.getResourcePath(imageUrl);
  514. }
  515. }
  516. return imageUrl;
  517. };
  518. FolderBrief.prototype.getContentBrief = function (contentOrg) {
  519. // remove some special content
  520. var content = contentOrg.trim();
  521. // skip yaml head
  522. if (content.startsWith('---\r') || content.startsWith('---\n')) {
  523. var hPos2 = content.indexOf('---', 4);
  524. if (hPos2 >= 0 && (content[hPos2 - 1] == '\n' || (content[hPos2 - 1] == '\r'))) {
  525. content = content.substring(hPos2 + 4).trim();
  526. }
  527. }
  528. content = content
  529. // Remove YAML code
  530. // .replace(/^---[\r\n][^(---)]*[\r\n]---[\r\n]/g, '')
  531. // Remove HTML tags
  532. .replace(/<[^>]*>/g, '')
  533. // wiki style links
  534. .replace(/\!\[\[(.*?)\]\]/g, '')
  535. .replace(/\[\[(.*?)\]\]/g, '$1')
  536. // Remove images
  537. .replace(/\!\[(.*?)\][\[\(].*?[\]\)]/g, '')
  538. // Remove inline links
  539. .replace(/\[(.*?)\][\[\(].*?[\]\)]/g, '$1')
  540. // Remove emphasis (repeat the line to remove double emphasis)
  541. .replace(/([\*_]{1,3})(\S.*?\S{0,1})\1/g, '$2')
  542. // Remove blockquotes
  543. .replace(/\n(&gt;|\>)(.*)/g, '')
  544. // Remove code blocks
  545. .replace(/(```[^\s]*\n[\s\S]*?\n```)/g, '')
  546. // Remove inline code
  547. .replace(/`(.+?)`/g, '$1')
  548. .trim();
  549. // try to get the first paragraph
  550. var contentBrief = '';
  551. content = '\n' + content + '\n';
  552. var regexP1 = new RegExp('\n([^\n|^#|^>])([^\n]+)\n', 'g');
  553. var match = null;
  554. if ((match = regexP1.exec(content)) !== null) {
  555. contentBrief = match[1] + match[2];
  556. }
  557. // console.log('contentBrief', contentBrief);
  558. contentBrief = contentBrief.trim();
  559. // use section headings
  560. if (contentBrief.length == 0) {
  561. var regexHead = new RegExp('^#{1,6}(?!#)(.*)[\r\n]', 'mg');
  562. while ((match = regexHead.exec(content)) !== null) {
  563. contentBrief += match[1] + ', ';
  564. if (contentBrief.length > this.briefMax) {
  565. break;
  566. }
  567. }
  568. if (contentBrief.endsWith(', ')) {
  569. contentBrief = contentBrief.substring(0, contentBrief.length - 2);
  570. }
  571. }
  572. // return
  573. return contentBrief;
  574. };
  575. return FolderBrief;
  576. }());
  577. // ------------------------------------------------------------
  578. // Folder Note
  579. // ------------------------------------------------------------
  580. var NoteFileMethod;
  581. (function (NoteFileMethod) {
  582. NoteFileMethod[NoteFileMethod["Index"] = 0] = "Index";
  583. NoteFileMethod[NoteFileMethod["Inside"] = 1] = "Inside";
  584. NoteFileMethod[NoteFileMethod["Outside"] = 2] = "Outside";
  585. })(NoteFileMethod || (NoteFileMethod = {}));
  586. var FolderNote = /** @class */ (function () {
  587. function FolderNote(app, methodStr, indexBase) {
  588. this.app = app;
  589. this.setMethod(methodStr, indexBase);
  590. this.emptyPath();
  591. // for rename
  592. this.filesToRename = [];
  593. this.filesToRenameSet = false;
  594. }
  595. // set the method
  596. FolderNote.prototype.setMethod = function (methodStr, indexBase) {
  597. if (methodStr == 'index') {
  598. this.method = NoteFileMethod.Index;
  599. this.indexBase = indexBase;
  600. }
  601. else if (methodStr == 'inside') {
  602. this.method = NoteFileMethod.Inside;
  603. }
  604. else if (methodStr == 'outside') {
  605. this.method = NoteFileMethod.Outside;
  606. }
  607. };
  608. // clear
  609. FolderNote.prototype.emptyPath = function () {
  610. this.folderPath = '';
  611. this.notePath = '';
  612. this.noteBase = '';
  613. };
  614. // set by folder path
  615. FolderNote.prototype.setByFolderPath = function (path) {
  616. this.emptyPath();
  617. var folderPath = path.trim();
  618. if (folderPath.length == 0)
  619. return;
  620. // set
  621. this.folderPath = folderPath;
  622. var notePaths = this.getFolderNotePath(folderPath);
  623. this.notePath = notePaths[0];
  624. this.noteBase = notePaths[1];
  625. };
  626. // set by note, should ends with .md
  627. FolderNote.prototype.setByNotePath = function (path) {
  628. this.emptyPath();
  629. var notePath = path.trim();
  630. if (notePath.length == 0)
  631. return;
  632. if (!notePath.endsWith('.md'))
  633. return;
  634. // set
  635. this.notePath = notePath;
  636. this.noteBase = this.getFileBaseName(notePath);
  637. this.folderPath = this.getNoteFolderPath(notePath);
  638. };
  639. // set by folder element
  640. FolderNote.prototype.setByFolderElement = function (folderItemEl) {
  641. var folderPath = '';
  642. var folderName = '';
  643. var className = folderItemEl.className.toString();
  644. var folderElem = folderItemEl;
  645. if (className.contains('nav-folder-title-content')) {
  646. folderName = folderElem.getText();
  647. folderElem = folderItemEl.parentElement;
  648. folderPath = folderElem.attributes.getNamedItem('data-path').textContent;
  649. }
  650. else if (className.contains('nav-folder-title')) {
  651. folderPath = folderItemEl.attributes.getNamedItem('data-path').textContent;
  652. folderName = folderItemEl.lastElementChild.getText();
  653. }
  654. // fix the folder path
  655. if (folderPath.length > 0) {
  656. var slashLast = folderPath.lastIndexOf('/');
  657. var folderPathLast = folderPath.split('/').pop();
  658. if (folderPathLast != folderName) {
  659. folderPath = folderPath.substring(0, slashLast + 1) + folderName;
  660. }
  661. }
  662. // set to mine
  663. this.setByFolderPath(folderPath);
  664. // return the element in useage
  665. return folderElem;
  666. };
  667. // get file base name
  668. FolderNote.prototype.getFileBaseName = function (filePath) {
  669. var baseName = filePath.split('/').pop();
  670. var dotPos = baseName.lastIndexOf('.');
  671. if (dotPos > 0)
  672. baseName = baseName.substring(0, dotPos);
  673. return baseName;
  674. };
  675. // get folder note path by folder path
  676. FolderNote.prototype.getFolderNotePath = function (folderPath) {
  677. var notePath = '';
  678. var noteBaseName = this.indexBase;
  679. if (this.method == NoteFileMethod.Index) {
  680. notePath = folderPath + '/' + noteBaseName + '.md';
  681. }
  682. else {
  683. noteBaseName = folderPath.split('/').pop();
  684. if (this.method == NoteFileMethod.Inside) {
  685. notePath = folderPath + '/' + noteBaseName + '.md';
  686. }
  687. else if (this.method == NoteFileMethod.Outside) {
  688. notePath = folderPath + '.md';
  689. }
  690. }
  691. // console.log('notePath: ', notePath);
  692. return [notePath, noteBaseName];
  693. };
  694. // get note folder, make sure it is a note file
  695. FolderNote.prototype.getNoteFolderPath = function (notePath) {
  696. var folderPath = '';
  697. if (this.method == NoteFileMethod.Index) {
  698. folderPath = notePath.substring(0, notePath.lastIndexOf('/'));
  699. }
  700. else if (this.method == NoteFileMethod.Inside) {
  701. folderPath = notePath.substring(0, notePath.lastIndexOf('/'));
  702. }
  703. else if (this.method == NoteFileMethod.Outside) {
  704. folderPath = notePath.substring(0, notePath.length - 3);
  705. }
  706. return folderPath;
  707. };
  708. // check if it is folder note name
  709. FolderNote.prototype.isFolderNotePath = function (notePath) {
  710. return __awaiter(this, void 0, void 0, function () {
  711. var isFN, noteBaseName, folderPath;
  712. return __generator(this, function (_a) {
  713. switch (_a.label) {
  714. case 0:
  715. isFN = false;
  716. if (!notePath.endsWith('.md'))
  717. return [2 /*return*/, false];
  718. if (!(this.method == NoteFileMethod.Index)) return [3 /*break*/, 1];
  719. isFN = notePath.endsWith("/" + this.indexBase + ".md");
  720. return [3 /*break*/, 4];
  721. case 1:
  722. if (!(this.method == NoteFileMethod.Inside)) return [3 /*break*/, 2];
  723. noteBaseName = this.getFileBaseName(notePath);
  724. if (notePath.endsWith(noteBaseName + '/' + noteBaseName + '.md')) {
  725. isFN = true;
  726. }
  727. return [3 /*break*/, 4];
  728. case 2:
  729. if (!(this.method == NoteFileMethod.Outside)) return [3 /*break*/, 4];
  730. folderPath = notePath.substring(0, notePath.length - 3);
  731. return [4 /*yield*/, this.app.vault.adapter.exists(folderPath)];
  732. case 3:
  733. isFN = _a.sent();
  734. _a.label = 4;
  735. case 4: return [2 /*return*/, isFN];
  736. }
  737. });
  738. });
  739. };
  740. // check is folder note file?
  741. FolderNote.prototype.isFolderNote = function (notePath) {
  742. return __awaiter(this, void 0, void 0, function () {
  743. var isFN, noteBaseName, folderPath;
  744. return __generator(this, function (_a) {
  745. switch (_a.label) {
  746. case 0:
  747. isFN = false;
  748. if (!(this.method == NoteFileMethod.Index)) return [3 /*break*/, 1];
  749. isFN = notePath.endsWith("/" + this.indexBase + ".md");
  750. return [3 /*break*/, 4];
  751. case 1:
  752. if (!(this.method == NoteFileMethod.Inside)) return [3 /*break*/, 2];
  753. noteBaseName = this.getFileBaseName(notePath);
  754. isFN = notePath.endsWith(noteBaseName + "/" + noteBaseName + ".md");
  755. return [3 /*break*/, 4];
  756. case 2:
  757. if (!(this.method == NoteFileMethod.Outside)) return [3 /*break*/, 4];
  758. folderPath = notePath.substring(0, notePath.length - 3);
  759. return [4 /*yield*/, this.app.vault.adapter.exists(folderPath)];
  760. case 3:
  761. isFN = _a.sent();
  762. _a.label = 4;
  763. case 4: return [2 /*return*/, isFN];
  764. }
  765. });
  766. });
  767. };
  768. // open note file
  769. FolderNote.prototype.openFolderNote = function (folderElem, doCreate) {
  770. return __awaiter(this, void 0, void 0, function () {
  771. var folderNoteExists;
  772. return __generator(this, function (_a) {
  773. switch (_a.label) {
  774. case 0: return [4 /*yield*/, this.app.vault.adapter.exists(this.notePath)];
  775. case 1:
  776. folderNoteExists = _a.sent();
  777. if (!(!folderNoteExists && doCreate)) return [3 /*break*/, 3];
  778. return [4 /*yield*/, this.newFolderNote()];
  779. case 2:
  780. _a.sent();
  781. folderNoteExists = true;
  782. _a.label = 3;
  783. case 3:
  784. // open the note
  785. if (folderNoteExists) {
  786. this.hideFolderNote(folderElem);
  787. // show the note
  788. this.app.workspace.openLinkText(this.notePath, '', false, { active: true });
  789. }
  790. else if (folderElem.hasClass('has-folder-note')) {
  791. folderElem.removeClass('has-folder-note');
  792. }
  793. return [2 /*return*/];
  794. }
  795. });
  796. });
  797. };
  798. // create folder note
  799. FolderNote.prototype.newFolderNote = function () {
  800. return __awaiter(this, void 0, void 0, function () {
  801. var noteInitContent;
  802. return __generator(this, function (_a) {
  803. switch (_a.label) {
  804. case 0: return [4 /*yield*/, this.expandContent(this.initContent)];
  805. case 1:
  806. noteInitContent = _a.sent();
  807. return [4 /*yield*/, this.app.vault.adapter.write(this.notePath, noteInitContent)];
  808. case 2:
  809. _a.sent();
  810. return [2 /*return*/];
  811. }
  812. });
  813. });
  814. };
  815. // create folder by note
  816. FolderNote.prototype.newNoteFolder = function () {
  817. return __awaiter(this, void 0, void 0, function () {
  818. var folderExists, folderPath, folderExists, newNotePath;
  819. return __generator(this, function (_a) {
  820. switch (_a.label) {
  821. case 0:
  822. if (!(this.method == NoteFileMethod.Outside)) return [3 /*break*/, 4];
  823. return [4 /*yield*/, this.app.vault.adapter.exists(this.folderPath)];
  824. case 1:
  825. folderExists = _a.sent();
  826. if (!!folderExists) return [3 /*break*/, 3];
  827. return [4 /*yield*/, this.app.vault.adapter.mkdir(this.folderPath)];
  828. case 2:
  829. _a.sent();
  830. _a.label = 3;
  831. case 3: return [3 /*break*/, 8];
  832. case 4:
  833. if (!(this.method == NoteFileMethod.Inside)) return [3 /*break*/, 8];
  834. folderPath = this.notePath.substring(0, this.notePath.length - 3);
  835. return [4 /*yield*/, this.app.vault.adapter.exists(folderPath)];
  836. case 5:
  837. folderExists = _a.sent();
  838. if (!!folderExists) return [3 /*break*/, 8];
  839. return [4 /*yield*/, this.app.vault.adapter.mkdir(folderPath)];
  840. case 6:
  841. _a.sent();
  842. newNotePath = folderPath + '/' + this.noteBase + '.md';
  843. return [4 /*yield*/, this.app.vault.adapter.rename(this.notePath, newNotePath)];
  844. case 7:
  845. _a.sent();
  846. this.app.workspace.openLinkText(newNotePath, '', false, { active: true });
  847. _a.label = 8;
  848. case 8: return [2 /*return*/];
  849. }
  850. });
  851. });
  852. };
  853. // expand content template
  854. FolderNote.prototype.expandContent = function (template) {
  855. return __awaiter(this, void 0, void 0, function () {
  856. var folderName, content, folderBrief, briefCards, briefLiveCode;
  857. return __generator(this, function (_a) {
  858. switch (_a.label) {
  859. case 0:
  860. folderName = this.folderPath.split('/').pop();
  861. content = template
  862. .replace(/{{FOLDER_NAME}}/g, folderName)
  863. .replace(/{{FOLDER_PATH}}/g, this.folderPath);
  864. if (!content.contains('{{FOLDER_BRIEF}}')) return [3 /*break*/, 2];
  865. folderBrief = new FolderBrief(this.app);
  866. return [4 /*yield*/, folderBrief.makeBriefCards(this.folderPath, this.notePath)];
  867. case 1:
  868. briefCards = _a.sent();
  869. content = content.replace('{{FOLDER_BRIEF}}', briefCards.getYamlCode());
  870. _a.label = 2;
  871. case 2:
  872. // keyword: {{FOLDER_BRIEF_LIVE}}
  873. if (content.contains('{{FOLDER_BRIEF_LIVE}}')) {
  874. briefLiveCode = '\n```ccard\ntype: folder_brief_live\n```\n';
  875. content = content.replace('{{FOLDER_BRIEF_LIVE}}', briefLiveCode);
  876. }
  877. return [2 /*return*/, content];
  878. }
  879. });
  880. });
  881. };
  882. // hide folder note
  883. FolderNote.prototype.hideFolderNote = function (folderElem) {
  884. // modify the element
  885. var hideSetting = this.hideNoteFile;
  886. folderElem.addClass('has-folder-note');
  887. var parentElem = folderElem.parentElement;
  888. var fileSelector = ':scope > div.nav-folder-children > div.nav-file > div.nav-file-title';
  889. var isOutsideMethod = (this.method == NoteFileMethod.Outside);
  890. if (isOutsideMethod) {
  891. parentElem = parentElem.parentElement;
  892. fileSelector = ':scope > div.nav-file > div.nav-file-title';
  893. }
  894. var noteBase = this.noteBase;
  895. parentElem.querySelectorAll(fileSelector)
  896. .forEach(function (fileElem) {
  897. var fileNodeTitle = fileElem.firstElementChild.textContent;
  898. // console.log('fileNoteTitle: ', fileNodeTitle);
  899. if (hideSetting && (fileNodeTitle == noteBase)) {
  900. fileElem.addClass('is-folder-note');
  901. }
  902. else if (!isOutsideMethod) {
  903. fileElem.removeClass('is-folder-note');
  904. }
  905. // console.log('isOutsideMethod: ', isOutsideMethod);
  906. });
  907. };
  908. // get the file breif path
  909. FolderNote.prototype.getNoteFolderBriefPath = function (notePath) {
  910. return __awaiter(this, void 0, void 0, function () {
  911. var folderPath, isFN;
  912. return __generator(this, function (_a) {
  913. switch (_a.label) {
  914. case 0:
  915. folderPath = '';
  916. return [4 /*yield*/, this.isFolderNote(notePath)];
  917. case 1:
  918. isFN = _a.sent();
  919. if (isFN) {
  920. folderPath = this.getNoteFolderPath(notePath);
  921. }
  922. else {
  923. folderPath = notePath.substring(0, notePath.lastIndexOf('/'));
  924. }
  925. return [2 /*return*/, folderPath];
  926. }
  927. });
  928. });
  929. };
  930. // delete a folder
  931. FolderNote.prototype.deleteFolder = function (pathToDel) {
  932. return __awaiter(this, void 0, void 0, function () {
  933. var myNotePath, noteExists;
  934. return __generator(this, function (_a) {
  935. switch (_a.label) {
  936. case 0:
  937. if (!(this.method == NoteFileMethod.Outside && !pathToDel.endsWith('.md'))) return [3 /*break*/, 3];
  938. myNotePath = pathToDel + '.md';
  939. return [4 /*yield*/, this.app.vault.adapter.exists(myNotePath)];
  940. case 1:
  941. noteExists = _a.sent();
  942. if (!noteExists) return [3 /*break*/, 3];
  943. return [4 /*yield*/, this.app.vault.adapter.trashLocal(myNotePath)];
  944. case 2:
  945. _a.sent();
  946. _a.label = 3;
  947. case 3: return [2 /*return*/];
  948. }
  949. });
  950. });
  951. };
  952. // sync folder / note name
  953. FolderNote.prototype.syncName = function (newPath, oldPath) {
  954. return __awaiter(this, void 0, void 0, function () {
  955. return __generator(this, function (_a) {
  956. switch (_a.label) {
  957. case 0:
  958. if (!(this.method == NoteFileMethod.Outside)) return [3 /*break*/, 2];
  959. return [4 /*yield*/, this.syncNameOutside(newPath, oldPath)];
  960. case 1:
  961. _a.sent();
  962. return [3 /*break*/, 4];
  963. case 2:
  964. if (!(this.method == NoteFileMethod.Inside)) return [3 /*break*/, 4];
  965. return [4 /*yield*/, this.syncNameInside(newPath, oldPath)];
  966. case 3:
  967. _a.sent();
  968. _a.label = 4;
  969. case 4: return [2 /*return*/];
  970. }
  971. });
  972. });
  973. };
  974. // sync folder / note name for outside
  975. FolderNote.prototype.syncNameOutside = function (newPath, oldPath) {
  976. return __awaiter(this, void 0, void 0, function () {
  977. var noteExists, oldNotePaths, newNotePaths, isFN, oldFolderPath, newFolderPath;
  978. return __generator(this, function (_a) {
  979. switch (_a.label) {
  980. case 0:
  981. if (!!oldPath.endsWith('.md')) return [3 /*break*/, 4];
  982. return [4 /*yield*/, this.app.vault.adapter.exists(oldPath + '.md')];
  983. case 1:
  984. noteExists = _a.sent();
  985. if (!noteExists) return [3 /*break*/, 3];
  986. oldNotePaths = this.getFolderNotePath(oldPath);
  987. newNotePaths = this.getFolderNotePath(newPath.path);
  988. if (!(oldNotePaths[1] != newNotePaths[1])) return [3 /*break*/, 3];
  989. return [4 /*yield*/, this.app.vault.adapter.rename(oldNotePaths[0], newNotePaths[0])];
  990. case 2:
  991. _a.sent();
  992. _a.label = 3;
  993. case 3: return [3 /*break*/, 7];
  994. case 4: return [4 /*yield*/, this.isFolderNote(oldPath)];
  995. case 5:
  996. isFN = _a.sent();
  997. if (!isFN) return [3 /*break*/, 7];
  998. oldFolderPath = this.getNoteFolderPath(oldPath);
  999. newFolderPath = this.getNoteFolderPath(newPath.path);
  1000. return [4 /*yield*/, this.app.vault.adapter.rename(oldFolderPath, newFolderPath)];
  1001. case 6:
  1002. _a.sent();
  1003. _a.label = 7;
  1004. case 7: return [2 /*return*/];
  1005. }
  1006. });
  1007. });
  1008. };
  1009. // sync folder / note name for inside case
  1010. FolderNote.prototype.syncNameInside = function (newPath, oldPath) {
  1011. return __awaiter(this, void 0, void 0, function () {
  1012. var oldNotePaths, newNotePaths, oldNotePathNew, noteExists, isFN, oldFolderPath, noteDir, noteBase, newFolderPath;
  1013. var _this = this;
  1014. return __generator(this, function (_a) {
  1015. switch (_a.label) {
  1016. case 0:
  1017. if (!!oldPath.endsWith('.md')) return [3 /*break*/, 2];
  1018. oldNotePaths = this.getFolderNotePath(oldPath);
  1019. newNotePaths = this.getFolderNotePath(newPath.path);
  1020. oldNotePathNew = newPath.path + '/' + oldNotePaths[1] + '.md';
  1021. return [4 /*yield*/, this.app.vault.adapter.exists(oldNotePathNew)];
  1022. case 1:
  1023. noteExists = _a.sent();
  1024. if (noteExists) {
  1025. if (newNotePaths[0] != oldNotePathNew) {
  1026. // put it to rename
  1027. this.filesToRename.push(oldNotePathNew);
  1028. this.filesToRename.push(newNotePaths[0]);
  1029. }
  1030. }
  1031. return [3 /*break*/, 4];
  1032. case 2:
  1033. if (!(this.filesToRename.length == 0)) return [3 /*break*/, 4];
  1034. return [4 /*yield*/, this.isFolderNote(oldPath)];
  1035. case 3:
  1036. isFN = _a.sent();
  1037. if (isFN) {
  1038. oldFolderPath = this.getNoteFolderPath(oldPath);
  1039. noteDir = newPath.path;
  1040. noteDir = noteDir.substring(0, noteDir.lastIndexOf('/'));
  1041. noteDir = noteDir.substring(0, noteDir.lastIndexOf('/'));
  1042. noteBase = newPath.path.split('/').pop();
  1043. noteBase = noteBase.substring(0, noteBase.length - 3);
  1044. newFolderPath = '';
  1045. if (noteDir.length > 0) {
  1046. newFolderPath = noteDir + '/' + noteBase;
  1047. }
  1048. else {
  1049. newFolderPath = noteBase;
  1050. }
  1051. // put it to rename
  1052. if (oldFolderPath != newFolderPath) {
  1053. this.filesToRename.push(oldFolderPath);
  1054. this.filesToRename.push(newFolderPath);
  1055. }
  1056. }
  1057. _a.label = 4;
  1058. case 4:
  1059. // only do once a time
  1060. if (!this.filesToRenameSet && this.filesToRename.length > 0) {
  1061. this.filesToRenameSet = true;
  1062. setTimeout(function () {
  1063. // console.log('rename is running after 1 s.');
  1064. if (_this.filesToRename.length) {
  1065. var oldFolderPath = _this.filesToRename[0];
  1066. var newFolderPath = _this.filesToRename[1];
  1067. // console.log('Mod Old Path:', oldFolderPath);
  1068. // console.log('Mod New Path:', newFolderPath);
  1069. _this.app.vault.adapter.rename(oldFolderPath, newFolderPath);
  1070. _this.filesToRename = [];
  1071. _this.filesToRenameSet = false;
  1072. }
  1073. }, 1000);
  1074. }
  1075. return [2 /*return*/];
  1076. }
  1077. });
  1078. });
  1079. };
  1080. return FolderNote;
  1081. }());
  1082. function _typeof(obj) {
  1083. "@babel/helpers - typeof";
  1084. if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
  1085. _typeof = function (obj) {
  1086. return typeof obj;
  1087. };
  1088. } else {
  1089. _typeof = function (obj) {
  1090. return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  1091. };
  1092. }
  1093. return _typeof(obj);
  1094. }
  1095. function _classCallCheck(instance, Constructor) {
  1096. if (!(instance instanceof Constructor)) {
  1097. throw new TypeError("Cannot call a class as a function");
  1098. }
  1099. }
  1100. function _defineProperties(target, props) {
  1101. for (var i = 0; i < props.length; i++) {
  1102. var descriptor = props[i];
  1103. descriptor.enumerable = descriptor.enumerable || false;
  1104. descriptor.configurable = true;
  1105. if ("value" in descriptor) descriptor.writable = true;
  1106. Object.defineProperty(target, descriptor.key, descriptor);
  1107. }
  1108. }
  1109. function _createClass(Constructor, protoProps, staticProps) {
  1110. if (protoProps) _defineProperties(Constructor.prototype, protoProps);
  1111. if (staticProps) _defineProperties(Constructor, staticProps);
  1112. return Constructor;
  1113. }
  1114. function _defineProperty(obj, key, value) {
  1115. if (key in obj) {
  1116. Object.defineProperty(obj, key, {
  1117. value: value,
  1118. enumerable: true,
  1119. configurable: true,
  1120. writable: true
  1121. });
  1122. } else {
  1123. obj[key] = value;
  1124. }
  1125. return obj;
  1126. }
  1127. function _inherits(subClass, superClass) {
  1128. if (typeof superClass !== "function" && superClass !== null) {
  1129. throw new TypeError("Super expression must either be null or a function");
  1130. }
  1131. subClass.prototype = Object.create(superClass && superClass.prototype, {
  1132. constructor: {
  1133. value: subClass,
  1134. writable: true,
  1135. configurable: true
  1136. }
  1137. });
  1138. if (superClass) _setPrototypeOf(subClass, superClass);
  1139. }
  1140. function _getPrototypeOf(o) {
  1141. _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
  1142. return o.__proto__ || Object.getPrototypeOf(o);
  1143. };
  1144. return _getPrototypeOf(o);
  1145. }
  1146. function _setPrototypeOf(o, p) {
  1147. _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
  1148. o.__proto__ = p;
  1149. return o;
  1150. };
  1151. return _setPrototypeOf(o, p);
  1152. }
  1153. function _isNativeReflectConstruct() {
  1154. if (typeof Reflect === "undefined" || !Reflect.construct) return false;
  1155. if (Reflect.construct.sham) return false;
  1156. if (typeof Proxy === "function") return true;
  1157. try {
  1158. Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
  1159. return true;
  1160. } catch (e) {
  1161. return false;
  1162. }
  1163. }
  1164. function _construct(Parent, args, Class) {
  1165. if (_isNativeReflectConstruct()) {
  1166. _construct = Reflect.construct;
  1167. } else {
  1168. _construct = function _construct(Parent, args, Class) {
  1169. var a = [null];
  1170. a.push.apply(a, args);
  1171. var Constructor = Function.bind.apply(Parent, a);
  1172. var instance = new Constructor();
  1173. if (Class) _setPrototypeOf(instance, Class.prototype);
  1174. return instance;
  1175. };
  1176. }
  1177. return _construct.apply(null, arguments);
  1178. }
  1179. function _isNativeFunction(fn) {
  1180. return Function.toString.call(fn).indexOf("[native code]") !== -1;
  1181. }
  1182. function _wrapNativeSuper(Class) {
  1183. var _cache = typeof Map === "function" ? new Map() : undefined;
  1184. _wrapNativeSuper = function _wrapNativeSuper(Class) {
  1185. if (Class === null || !_isNativeFunction(Class)) return Class;
  1186. if (typeof Class !== "function") {
  1187. throw new TypeError("Super expression must either be null or a function");
  1188. }
  1189. if (typeof _cache !== "undefined") {
  1190. if (_cache.has(Class)) return _cache.get(Class);
  1191. _cache.set(Class, Wrapper);
  1192. }
  1193. function Wrapper() {
  1194. return _construct(Class, arguments, _getPrototypeOf(this).constructor);
  1195. }
  1196. Wrapper.prototype = Object.create(Class.prototype, {
  1197. constructor: {
  1198. value: Wrapper,
  1199. enumerable: false,
  1200. writable: true,
  1201. configurable: true
  1202. }
  1203. });
  1204. return _setPrototypeOf(Wrapper, Class);
  1205. };
  1206. return _wrapNativeSuper(Class);
  1207. }
  1208. function _assertThisInitialized(self) {
  1209. if (self === void 0) {
  1210. throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  1211. }
  1212. return self;
  1213. }
  1214. function _possibleConstructorReturn(self, call) {
  1215. if (call && (typeof call === "object" || typeof call === "function")) {
  1216. return call;
  1217. }
  1218. return _assertThisInitialized(self);
  1219. }
  1220. function _createSuper(Derived) {
  1221. var hasNativeReflectConstruct = _isNativeReflectConstruct();
  1222. return function () {
  1223. var Super = _getPrototypeOf(Derived),
  1224. result;
  1225. if (hasNativeReflectConstruct) {
  1226. var NewTarget = _getPrototypeOf(this).constructor;
  1227. result = Reflect.construct(Super, arguments, NewTarget);
  1228. } else {
  1229. result = Super.apply(this, arguments);
  1230. }
  1231. return _possibleConstructorReturn(this, result);
  1232. };
  1233. }
  1234. function _superPropBase(object, property) {
  1235. while (!Object.prototype.hasOwnProperty.call(object, property)) {
  1236. object = _getPrototypeOf(object);
  1237. if (object === null) break;
  1238. }
  1239. return object;
  1240. }
  1241. function _get(target, property, receiver) {
  1242. if (typeof Reflect !== "undefined" && Reflect.get) {
  1243. _get = Reflect.get;
  1244. } else {
  1245. _get = function _get(target, property, receiver) {
  1246. var base = _superPropBase(target, property);
  1247. if (!base) return;
  1248. var desc = Object.getOwnPropertyDescriptor(base, property);
  1249. if (desc.get) {
  1250. return desc.get.call(receiver);
  1251. }
  1252. return desc.value;
  1253. };
  1254. }
  1255. return _get(target, property, receiver || target);
  1256. }
  1257. function _slicedToArray(arr, i) {
  1258. return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
  1259. }
  1260. function _toArray(arr) {
  1261. return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();
  1262. }
  1263. function _arrayWithHoles(arr) {
  1264. if (Array.isArray(arr)) return arr;
  1265. }
  1266. function _iterableToArray(iter) {
  1267. if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
  1268. }
  1269. function _iterableToArrayLimit(arr, i) {
  1270. if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;
  1271. var _arr = [];
  1272. var _n = true;
  1273. var _d = false;
  1274. var _e = undefined;
  1275. try {
  1276. for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
  1277. _arr.push(_s.value);
  1278. if (i && _arr.length === i) break;
  1279. }
  1280. } catch (err) {
  1281. _d = true;
  1282. _e = err;
  1283. } finally {
  1284. try {
  1285. if (!_n && _i["return"] != null) _i["return"]();
  1286. } finally {
  1287. if (_d) throw _e;
  1288. }
  1289. }
  1290. return _arr;
  1291. }
  1292. function _unsupportedIterableToArray(o, minLen) {
  1293. if (!o) return;
  1294. if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  1295. var n = Object.prototype.toString.call(o).slice(8, -1);
  1296. if (n === "Object" && o.constructor) n = o.constructor.name;
  1297. if (n === "Map" || n === "Set") return Array.from(o);
  1298. if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
  1299. }
  1300. function _arrayLikeToArray(arr, len) {
  1301. if (len == null || len > arr.length) len = arr.length;
  1302. for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
  1303. return arr2;
  1304. }
  1305. function _nonIterableRest() {
  1306. throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  1307. }
  1308. function _createForOfIteratorHelper(o) {
  1309. if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
  1310. if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) {
  1311. var i = 0;
  1312. var F = function () {};
  1313. return {
  1314. s: F,
  1315. n: function () {
  1316. if (i >= o.length) return {
  1317. done: true
  1318. };
  1319. return {
  1320. done: false,
  1321. value: o[i++]
  1322. };
  1323. },
  1324. e: function (e) {
  1325. throw e;
  1326. },
  1327. f: F
  1328. };
  1329. }
  1330. throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  1331. }
  1332. var it,
  1333. normalCompletion = true,
  1334. didErr = false,
  1335. err;
  1336. return {
  1337. s: function () {
  1338. it = o[Symbol.iterator]();
  1339. },
  1340. n: function () {
  1341. var step = it.next();
  1342. normalCompletion = step.done;
  1343. return step;
  1344. },
  1345. e: function (e) {
  1346. didErr = true;
  1347. err = e;
  1348. },
  1349. f: function () {
  1350. try {
  1351. if (!normalCompletion && it.return != null) it.return();
  1352. } finally {
  1353. if (didErr) throw err;
  1354. }
  1355. }
  1356. };
  1357. }
  1358. var Char = {
  1359. ANCHOR: '&',
  1360. COMMENT: '#',
  1361. TAG: '!',
  1362. DIRECTIVES_END: '-',
  1363. DOCUMENT_END: '.'
  1364. };
  1365. var Type = {
  1366. ALIAS: 'ALIAS',
  1367. BLANK_LINE: 'BLANK_LINE',
  1368. BLOCK_FOLDED: 'BLOCK_FOLDED',
  1369. BLOCK_LITERAL: 'BLOCK_LITERAL',
  1370. COMMENT: 'COMMENT',
  1371. DIRECTIVE: 'DIRECTIVE',
  1372. DOCUMENT: 'DOCUMENT',
  1373. FLOW_MAP: 'FLOW_MAP',
  1374. FLOW_SEQ: 'FLOW_SEQ',
  1375. MAP: 'MAP',
  1376. MAP_KEY: 'MAP_KEY',
  1377. MAP_VALUE: 'MAP_VALUE',
  1378. PLAIN: 'PLAIN',
  1379. QUOTE_DOUBLE: 'QUOTE_DOUBLE',
  1380. QUOTE_SINGLE: 'QUOTE_SINGLE',
  1381. SEQ: 'SEQ',
  1382. SEQ_ITEM: 'SEQ_ITEM'
  1383. };
  1384. var defaultTagPrefix = 'tag:yaml.org,2002:';
  1385. var defaultTags = {
  1386. MAP: 'tag:yaml.org,2002:map',
  1387. SEQ: 'tag:yaml.org,2002:seq',
  1388. STR: 'tag:yaml.org,2002:str'
  1389. };
  1390. function findLineStarts(src) {
  1391. var ls = [0];
  1392. var offset = src.indexOf('\n');
  1393. while (offset !== -1) {
  1394. offset += 1;
  1395. ls.push(offset);
  1396. offset = src.indexOf('\n', offset);
  1397. }
  1398. return ls;
  1399. }
  1400. function getSrcInfo(cst) {
  1401. var lineStarts, src;
  1402. if (typeof cst === 'string') {
  1403. lineStarts = findLineStarts(cst);
  1404. src = cst;
  1405. } else {
  1406. if (Array.isArray(cst)) cst = cst[0];
  1407. if (cst && cst.context) {
  1408. if (!cst.lineStarts) cst.lineStarts = findLineStarts(cst.context.src);
  1409. lineStarts = cst.lineStarts;
  1410. src = cst.context.src;
  1411. }
  1412. }
  1413. return {
  1414. lineStarts: lineStarts,
  1415. src: src
  1416. };
  1417. }
  1418. /**
  1419. * @typedef {Object} LinePos - One-indexed position in the source
  1420. * @property {number} line
  1421. * @property {number} col
  1422. */
  1423. /**
  1424. * Determine the line/col position matching a character offset.
  1425. *
  1426. * Accepts a source string or a CST document as the second parameter. With
  1427. * the latter, starting indices for lines are cached in the document as
  1428. * `lineStarts: number[]`.
  1429. *
  1430. * Returns a one-indexed `{ line, col }` location if found, or
  1431. * `undefined` otherwise.
  1432. *
  1433. * @param {number} offset
  1434. * @param {string|Document|Document[]} cst
  1435. * @returns {?LinePos}
  1436. */
  1437. function getLinePos(offset, cst) {
  1438. if (typeof offset !== 'number' || offset < 0) return null;
  1439. var _getSrcInfo = getSrcInfo(cst),
  1440. lineStarts = _getSrcInfo.lineStarts,
  1441. src = _getSrcInfo.src;
  1442. if (!lineStarts || !src || offset > src.length) return null;
  1443. for (var i = 0; i < lineStarts.length; ++i) {
  1444. var start = lineStarts[i];
  1445. if (offset < start) {
  1446. return {
  1447. line: i,
  1448. col: offset - lineStarts[i - 1] + 1
  1449. };
  1450. }
  1451. if (offset === start) return {
  1452. line: i + 1,
  1453. col: 1
  1454. };
  1455. }
  1456. var line = lineStarts.length;
  1457. return {
  1458. line: line,
  1459. col: offset - lineStarts[line - 1] + 1
  1460. };
  1461. }
  1462. /**
  1463. * Get a specified line from the source.
  1464. *
  1465. * Accepts a source string or a CST document as the second parameter. With
  1466. * the latter, starting indices for lines are cached in the document as
  1467. * `lineStarts: number[]`.
  1468. *
  1469. * Returns the line as a string if found, or `null` otherwise.
  1470. *
  1471. * @param {number} line One-indexed line number
  1472. * @param {string|Document|Document[]} cst
  1473. * @returns {?string}
  1474. */
  1475. function getLine(line, cst) {
  1476. var _getSrcInfo2 = getSrcInfo(cst),
  1477. lineStarts = _getSrcInfo2.lineStarts,
  1478. src = _getSrcInfo2.src;
  1479. if (!lineStarts || !(line >= 1) || line > lineStarts.length) return null;
  1480. var start = lineStarts[line - 1];
  1481. var end = lineStarts[line]; // undefined for last line; that's ok for slice()
  1482. while (end && end > start && src[end - 1] === '\n') {
  1483. --end;
  1484. }
  1485. return src.slice(start, end);
  1486. }
  1487. /**
  1488. * Pretty-print the starting line from the source indicated by the range `pos`
  1489. *
  1490. * Trims output to `maxWidth` chars while keeping the starting column visible,
  1491. * using `…` at either end to indicate dropped characters.
  1492. *
  1493. * Returns a two-line string (or `null`) with `\n` as separator; the second line
  1494. * will hold appropriately indented `^` marks indicating the column range.
  1495. *
  1496. * @param {Object} pos
  1497. * @param {LinePos} pos.start
  1498. * @param {LinePos} [pos.end]
  1499. * @param {string|Document|Document[]*} cst
  1500. * @param {number} [maxWidth=80]
  1501. * @returns {?string}
  1502. */
  1503. function getPrettyContext(_ref, cst) {
  1504. var start = _ref.start,
  1505. end = _ref.end;
  1506. var maxWidth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 80;
  1507. var src = getLine(start.line, cst);
  1508. if (!src) return null;
  1509. var col = start.col;
  1510. if (src.length > maxWidth) {
  1511. if (col <= maxWidth - 10) {
  1512. src = src.substr(0, maxWidth - 1) + '…';
  1513. } else {
  1514. var halfWidth = Math.round(maxWidth / 2);
  1515. if (src.length > col + halfWidth) src = src.substr(0, col + halfWidth - 1) + '…';
  1516. col -= src.length - maxWidth;
  1517. src = '…' + src.substr(1 - maxWidth);
  1518. }
  1519. }
  1520. var errLen = 1;
  1521. var errEnd = '';
  1522. if (end) {
  1523. if (end.line === start.line && col + (end.col - start.col) <= maxWidth + 1) {
  1524. errLen = end.col - start.col;
  1525. } else {
  1526. errLen = Math.min(src.length + 1, maxWidth) - col;
  1527. errEnd = '…';
  1528. }
  1529. }
  1530. var offset = col > 1 ? ' '.repeat(col - 1) : '';
  1531. var err = '^'.repeat(errLen);
  1532. return "".concat(src, "\n").concat(offset).concat(err).concat(errEnd);
  1533. }
  1534. var Range = /*#__PURE__*/function () {
  1535. _createClass(Range, null, [{
  1536. key: "copy",
  1537. value: function copy(orig) {
  1538. return new Range(orig.start, orig.end);
  1539. }
  1540. }]);
  1541. function Range(start, end) {
  1542. _classCallCheck(this, Range);
  1543. this.start = start;
  1544. this.end = end || start;
  1545. }
  1546. _createClass(Range, [{
  1547. key: "isEmpty",
  1548. value: function isEmpty() {
  1549. return typeof this.start !== 'number' || !this.end || this.end <= this.start;
  1550. }
  1551. /**
  1552. * Set `origStart` and `origEnd` to point to the original source range for
  1553. * this node, which may differ due to dropped CR characters.
  1554. *
  1555. * @param {number[]} cr - Positions of dropped CR characters
  1556. * @param {number} offset - Starting index of `cr` from the last call
  1557. * @returns {number} - The next offset, matching the one found for `origStart`
  1558. */
  1559. }, {
  1560. key: "setOrigRange",
  1561. value: function setOrigRange(cr, offset) {
  1562. var start = this.start,
  1563. end = this.end;
  1564. if (cr.length === 0 || end <= cr[0]) {
  1565. this.origStart = start;
  1566. this.origEnd = end;
  1567. return offset;
  1568. }
  1569. var i = offset;
  1570. while (i < cr.length) {
  1571. if (cr[i] > start) break;else ++i;
  1572. }
  1573. this.origStart = start + i;
  1574. var nextOffset = i;
  1575. while (i < cr.length) {
  1576. // if end was at \n, it should now be at \r
  1577. if (cr[i] >= end) break;else ++i;
  1578. }
  1579. this.origEnd = end + i;
  1580. return nextOffset;
  1581. }
  1582. }]);
  1583. return Range;
  1584. }();
  1585. /** Root class of all nodes */
  1586. var Node = /*#__PURE__*/function () {
  1587. _createClass(Node, null, [{
  1588. key: "addStringTerminator",
  1589. value: function addStringTerminator(src, offset, str) {
  1590. if (str[str.length - 1] === '\n') return str;
  1591. var next = Node.endOfWhiteSpace(src, offset);
  1592. return next >= src.length || src[next] === '\n' ? str + '\n' : str;
  1593. } // ^(---|...)
  1594. }, {
  1595. key: "atDocumentBoundary",
  1596. value: function atDocumentBoundary(src, offset, sep) {
  1597. var ch0 = src[offset];
  1598. if (!ch0) return true;
  1599. var prev = src[offset - 1];
  1600. if (prev && prev !== '\n') return false;
  1601. if (sep) {
  1602. if (ch0 !== sep) return false;
  1603. } else {
  1604. if (ch0 !== Char.DIRECTIVES_END && ch0 !== Char.DOCUMENT_END) return false;
  1605. }
  1606. var ch1 = src[offset + 1];
  1607. var ch2 = src[offset + 2];
  1608. if (ch1 !== ch0 || ch2 !== ch0) return false;
  1609. var ch3 = src[offset + 3];
  1610. return !ch3 || ch3 === '\n' || ch3 === '\t' || ch3 === ' ';
  1611. }
  1612. }, {
  1613. key: "endOfIdentifier",
  1614. value: function endOfIdentifier(src, offset) {
  1615. var ch = src[offset];
  1616. var isVerbatim = ch === '<';
  1617. var notOk = isVerbatim ? ['\n', '\t', ' ', '>'] : ['\n', '\t', ' ', '[', ']', '{', '}', ','];
  1618. while (ch && notOk.indexOf(ch) === -1) {
  1619. ch = src[offset += 1];
  1620. }
  1621. if (isVerbatim && ch === '>') offset += 1;
  1622. return offset;
  1623. }
  1624. }, {
  1625. key: "endOfIndent",
  1626. value: function endOfIndent(src, offset) {
  1627. var ch = src[offset];
  1628. while (ch === ' ') {
  1629. ch = src[offset += 1];
  1630. }
  1631. return offset;
  1632. }
  1633. }, {
  1634. key: "endOfLine",
  1635. value: function endOfLine(src, offset) {
  1636. var ch = src[offset];
  1637. while (ch && ch !== '\n') {
  1638. ch = src[offset += 1];
  1639. }
  1640. return offset;
  1641. }
  1642. }, {
  1643. key: "endOfWhiteSpace",
  1644. value: function endOfWhiteSpace(src, offset) {
  1645. var ch = src[offset];
  1646. while (ch === '\t' || ch === ' ') {
  1647. ch = src[offset += 1];
  1648. }
  1649. return offset;
  1650. }
  1651. }, {
  1652. key: "startOfLine",
  1653. value: function startOfLine(src, offset) {
  1654. var ch = src[offset - 1];
  1655. if (ch === '\n') return offset;
  1656. while (ch && ch !== '\n') {
  1657. ch = src[offset -= 1];
  1658. }
  1659. return offset + 1;
  1660. }
  1661. /**
  1662. * End of indentation, or null if the line's indent level is not more
  1663. * than `indent`
  1664. *
  1665. * @param {string} src
  1666. * @param {number} indent
  1667. * @param {number} lineStart
  1668. * @returns {?number}
  1669. */
  1670. }, {
  1671. key: "endOfBlockIndent",
  1672. value: function endOfBlockIndent(src, indent, lineStart) {
  1673. var inEnd = Node.endOfIndent(src, lineStart);
  1674. if (inEnd > lineStart + indent) {
  1675. return inEnd;
  1676. } else {
  1677. var wsEnd = Node.endOfWhiteSpace(src, inEnd);
  1678. var ch = src[wsEnd];
  1679. if (!ch || ch === '\n') return wsEnd;
  1680. }
  1681. return null;
  1682. }
  1683. }, {
  1684. key: "atBlank",
  1685. value: function atBlank(src, offset, endAsBlank) {
  1686. var ch = src[offset];
  1687. return ch === '\n' || ch === '\t' || ch === ' ' || endAsBlank && !ch;
  1688. }
  1689. }, {
  1690. key: "nextNodeIsIndented",
  1691. value: function nextNodeIsIndented(ch, indentDiff, indicatorAsIndent) {
  1692. if (!ch || indentDiff < 0) return false;
  1693. if (indentDiff > 0) return true;
  1694. return indicatorAsIndent && ch === '-';
  1695. } // should be at line or string end, or at next non-whitespace char
  1696. }, {
  1697. key: "normalizeOffset",
  1698. value: function normalizeOffset(src, offset) {
  1699. var ch = src[offset];
  1700. return !ch ? offset : ch !== '\n' && src[offset - 1] === '\n' ? offset - 1 : Node.endOfWhiteSpace(src, offset);
  1701. } // fold single newline into space, multiple newlines to N - 1 newlines
  1702. // presumes src[offset] === '\n'
  1703. }, {
  1704. key: "foldNewline",
  1705. value: function foldNewline(src, offset, indent) {
  1706. var inCount = 0;
  1707. var error = false;
  1708. var fold = '';
  1709. var ch = src[offset + 1];
  1710. while (ch === ' ' || ch === '\t' || ch === '\n') {
  1711. switch (ch) {
  1712. case '\n':
  1713. inCount = 0;
  1714. offset += 1;
  1715. fold += '\n';
  1716. break;
  1717. case '\t':
  1718. if (inCount <= indent) error = true;
  1719. offset = Node.endOfWhiteSpace(src, offset + 2) - 1;
  1720. break;
  1721. case ' ':
  1722. inCount += 1;
  1723. offset += 1;
  1724. break;
  1725. }
  1726. ch = src[offset + 1];
  1727. }
  1728. if (!fold) fold = ' ';
  1729. if (ch && inCount <= indent) error = true;
  1730. return {
  1731. fold: fold,
  1732. offset: offset,
  1733. error: error
  1734. };
  1735. }
  1736. }]);
  1737. function Node(type, props, context) {
  1738. _classCallCheck(this, Node);
  1739. Object.defineProperty(this, 'context', {
  1740. value: context || null,
  1741. writable: true
  1742. });
  1743. this.error = null;
  1744. this.range = null;
  1745. this.valueRange = null;
  1746. this.props = props || [];
  1747. this.type = type;
  1748. this.value = null;
  1749. }
  1750. _createClass(Node, [{
  1751. key: "getPropValue",
  1752. value: function getPropValue(idx, key, skipKey) {
  1753. if (!this.context) return null;
  1754. var src = this.context.src;
  1755. var prop = this.props[idx];
  1756. return prop && src[prop.start] === key ? src.slice(prop.start + (skipKey ? 1 : 0), prop.end) : null;
  1757. }
  1758. }, {
  1759. key: "commentHasRequiredWhitespace",
  1760. value: function commentHasRequiredWhitespace(start) {
  1761. var src = this.context.src;
  1762. if (this.header && start === this.header.end) return false;
  1763. if (!this.valueRange) return false;
  1764. var end = this.valueRange.end;
  1765. return start !== end || Node.atBlank(src, end - 1);
  1766. }
  1767. }, {
  1768. key: "parseComment",
  1769. value: function parseComment(start) {
  1770. var src = this.context.src;
  1771. if (src[start] === Char.COMMENT) {
  1772. var end = Node.endOfLine(src, start + 1);
  1773. var commentRange = new Range(start, end);
  1774. this.props.push(commentRange);
  1775. return end;
  1776. }
  1777. return start;
  1778. }
  1779. /**
  1780. * Populates the `origStart` and `origEnd` values of all ranges for this
  1781. * node. Extended by child classes to handle descendant nodes.
  1782. *
  1783. * @param {number[]} cr - Positions of dropped CR characters
  1784. * @param {number} offset - Starting index of `cr` from the last call
  1785. * @returns {number} - The next offset, matching the one found for `origStart`
  1786. */
  1787. }, {
  1788. key: "setOrigRanges",
  1789. value: function setOrigRanges(cr, offset) {
  1790. if (this.range) offset = this.range.setOrigRange(cr, offset);
  1791. if (this.valueRange) this.valueRange.setOrigRange(cr, offset);
  1792. this.props.forEach(function (prop) {
  1793. return prop.setOrigRange(cr, offset);
  1794. });
  1795. return offset;
  1796. }
  1797. }, {
  1798. key: "toString",
  1799. value: function toString() {
  1800. var src = this.context.src,
  1801. range = this.range,
  1802. value = this.value;
  1803. if (value != null) return value;
  1804. var str = src.slice(range.start, range.end);
  1805. return Node.addStringTerminator(src, range.end, str);
  1806. }
  1807. }, {
  1808. key: "anchor",
  1809. get: function get() {
  1810. for (var i = 0; i < this.props.length; ++i) {
  1811. var anchor = this.getPropValue(i, Char.ANCHOR, true);
  1812. if (anchor != null) return anchor;
  1813. }
  1814. return null;
  1815. }
  1816. }, {
  1817. key: "comment",
  1818. get: function get() {
  1819. var comments = [];
  1820. for (var i = 0; i < this.props.length; ++i) {
  1821. var comment = this.getPropValue(i, Char.COMMENT, true);
  1822. if (comment != null) comments.push(comment);
  1823. }
  1824. return comments.length > 0 ? comments.join('\n') : null;
  1825. }
  1826. }, {
  1827. key: "hasComment",
  1828. get: function get() {
  1829. if (this.context) {
  1830. var src = this.context.src;
  1831. for (var i = 0; i < this.props.length; ++i) {
  1832. if (src[this.props[i].start] === Char.COMMENT) return true;
  1833. }
  1834. }
  1835. return false;
  1836. }
  1837. }, {
  1838. key: "hasProps",
  1839. get: function get() {
  1840. if (this.context) {
  1841. var src = this.context.src;
  1842. for (var i = 0; i < this.props.length; ++i) {
  1843. if (src[this.props[i].start] !== Char.COMMENT) return true;
  1844. }
  1845. }
  1846. return false;
  1847. }
  1848. }, {
  1849. key: "includesTrailingLines",
  1850. get: function get() {
  1851. return false;
  1852. }
  1853. }, {
  1854. key: "jsonLike",
  1855. get: function get() {
  1856. var jsonLikeTypes = [Type.FLOW_MAP, Type.FLOW_SEQ, Type.QUOTE_DOUBLE, Type.QUOTE_SINGLE];
  1857. return jsonLikeTypes.indexOf(this.type) !== -1;
  1858. }
  1859. }, {
  1860. key: "rangeAsLinePos",
  1861. get: function get() {
  1862. if (!this.range || !this.context) return undefined;
  1863. var start = getLinePos(this.range.start, this.context.root);
  1864. if (!start) return undefined;
  1865. var end = getLinePos(this.range.end, this.context.root);
  1866. return {
  1867. start: start,
  1868. end: end
  1869. };
  1870. }
  1871. }, {
  1872. key: "rawValue",
  1873. get: function get() {
  1874. if (!this.valueRange || !this.context) return null;
  1875. var _this$valueRange = this.valueRange,
  1876. start = _this$valueRange.start,
  1877. end = _this$valueRange.end;
  1878. return this.context.src.slice(start, end);
  1879. }
  1880. }, {
  1881. key: "tag",
  1882. get: function get() {
  1883. for (var i = 0; i < this.props.length; ++i) {
  1884. var tag = this.getPropValue(i, Char.TAG, false);
  1885. if (tag != null) {
  1886. if (tag[1] === '<') {
  1887. return {
  1888. verbatim: tag.slice(2, -1)
  1889. };
  1890. } else {
  1891. // eslint-disable-next-line no-unused-vars
  1892. var _tag$match = tag.match(/^(.*!)([^!]*)$/),
  1893. _tag$match2 = _slicedToArray(_tag$match, 3);
  1894. _tag$match2[0];
  1895. var handle = _tag$match2[1],
  1896. suffix = _tag$match2[2];
  1897. return {
  1898. handle: handle,
  1899. suffix: suffix
  1900. };
  1901. }
  1902. }
  1903. }
  1904. return null;
  1905. }
  1906. }, {
  1907. key: "valueRangeContainsNewline",
  1908. get: function get() {
  1909. if (!this.valueRange || !this.context) return false;
  1910. var _this$valueRange2 = this.valueRange,
  1911. start = _this$valueRange2.start,
  1912. end = _this$valueRange2.end;
  1913. var src = this.context.src;
  1914. for (var i = start; i < end; ++i) {
  1915. if (src[i] === '\n') return true;
  1916. }
  1917. return false;
  1918. }
  1919. }]);
  1920. return Node;
  1921. }();
  1922. var YAMLError = /*#__PURE__*/function (_Error) {
  1923. _inherits(YAMLError, _Error);
  1924. var _super = _createSuper(YAMLError);
  1925. function YAMLError(name, source, message) {
  1926. var _this;
  1927. _classCallCheck(this, YAMLError);
  1928. if (!message || !(source instanceof Node)) throw new Error("Invalid arguments for new ".concat(name));
  1929. _this = _super.call(this);
  1930. _this.name = name;
  1931. _this.message = message;
  1932. _this.source = source;
  1933. return _this;
  1934. }
  1935. _createClass(YAMLError, [{
  1936. key: "makePretty",
  1937. value: function makePretty() {
  1938. if (!this.source) return;
  1939. this.nodeType = this.source.type;
  1940. var cst = this.source.context && this.source.context.root;
  1941. if (typeof this.offset === 'number') {
  1942. this.range = new Range(this.offset, this.offset + 1);
  1943. var start = cst && getLinePos(this.offset, cst);
  1944. if (start) {
  1945. var end = {
  1946. line: start.line,
  1947. col: start.col + 1
  1948. };
  1949. this.linePos = {
  1950. start: start,
  1951. end: end
  1952. };
  1953. }
  1954. delete this.offset;
  1955. } else {
  1956. this.range = this.source.range;
  1957. this.linePos = this.source.rangeAsLinePos;
  1958. }
  1959. if (this.linePos) {
  1960. var _this$linePos$start = this.linePos.start,
  1961. line = _this$linePos$start.line,
  1962. col = _this$linePos$start.col;
  1963. this.message += " at line ".concat(line, ", column ").concat(col);
  1964. var ctx = cst && getPrettyContext(this.linePos, cst);
  1965. if (ctx) this.message += ":\n\n".concat(ctx, "\n");
  1966. }
  1967. delete this.source;
  1968. }
  1969. }]);
  1970. return YAMLError;
  1971. }( /*#__PURE__*/_wrapNativeSuper(Error));
  1972. var YAMLReferenceError = /*#__PURE__*/function (_YAMLError) {
  1973. _inherits(YAMLReferenceError, _YAMLError);
  1974. var _super2 = _createSuper(YAMLReferenceError);
  1975. function YAMLReferenceError(source, message) {
  1976. _classCallCheck(this, YAMLReferenceError);
  1977. return _super2.call(this, 'YAMLReferenceError', source, message);
  1978. }
  1979. return YAMLReferenceError;
  1980. }(YAMLError);
  1981. var YAMLSemanticError = /*#__PURE__*/function (_YAMLError2) {
  1982. _inherits(YAMLSemanticError, _YAMLError2);
  1983. var _super3 = _createSuper(YAMLSemanticError);
  1984. function YAMLSemanticError(source, message) {
  1985. _classCallCheck(this, YAMLSemanticError);
  1986. return _super3.call(this, 'YAMLSemanticError', source, message);
  1987. }
  1988. return YAMLSemanticError;
  1989. }(YAMLError);
  1990. var YAMLSyntaxError = /*#__PURE__*/function (_YAMLError3) {
  1991. _inherits(YAMLSyntaxError, _YAMLError3);
  1992. var _super4 = _createSuper(YAMLSyntaxError);
  1993. function YAMLSyntaxError(source, message) {
  1994. _classCallCheck(this, YAMLSyntaxError);
  1995. return _super4.call(this, 'YAMLSyntaxError', source, message);
  1996. }
  1997. return YAMLSyntaxError;
  1998. }(YAMLError);
  1999. var YAMLWarning = /*#__PURE__*/function (_YAMLError4) {
  2000. _inherits(YAMLWarning, _YAMLError4);
  2001. var _super5 = _createSuper(YAMLWarning);
  2002. function YAMLWarning(source, message) {
  2003. _classCallCheck(this, YAMLWarning);
  2004. return _super5.call(this, 'YAMLWarning', source, message);
  2005. }
  2006. return YAMLWarning;
  2007. }(YAMLError);
  2008. var PlainValue = /*#__PURE__*/function (_Node) {
  2009. _inherits(PlainValue, _Node);
  2010. var _super = _createSuper(PlainValue);
  2011. function PlainValue() {
  2012. _classCallCheck(this, PlainValue);
  2013. return _super.apply(this, arguments);
  2014. }
  2015. _createClass(PlainValue, [{
  2016. key: "parseBlockValue",
  2017. value: function parseBlockValue(start) {
  2018. var _this$context = this.context,
  2019. indent = _this$context.indent,
  2020. inFlow = _this$context.inFlow,
  2021. src = _this$context.src;
  2022. var offset = start;
  2023. var valueEnd = start;
  2024. for (var ch = src[offset]; ch === '\n'; ch = src[offset]) {
  2025. if (Node.atDocumentBoundary(src, offset + 1)) break;
  2026. var end = Node.endOfBlockIndent(src, indent, offset + 1);
  2027. if (end === null || src[end] === '#') break;
  2028. if (src[end] === '\n') {
  2029. offset = end;
  2030. } else {
  2031. valueEnd = PlainValue.endOfLine(src, end, inFlow);
  2032. offset = valueEnd;
  2033. }
  2034. }
  2035. if (this.valueRange.isEmpty()) this.valueRange.start = start;
  2036. this.valueRange.end = valueEnd;
  2037. return valueEnd;
  2038. }
  2039. /**
  2040. * Parses a plain value from the source
  2041. *
  2042. * Accepted forms are:
  2043. * ```
  2044. * #comment
  2045. *
  2046. * first line
  2047. *
  2048. * first line #comment
  2049. *
  2050. * first line
  2051. * block
  2052. * lines
  2053. *
  2054. * #comment
  2055. * block
  2056. * lines
  2057. * ```
  2058. * where block lines are empty or have an indent level greater than `indent`.
  2059. *
  2060. * @param {ParseContext} context
  2061. * @param {number} start - Index of first character
  2062. * @returns {number} - Index of the character after this scalar, may be `\n`
  2063. */
  2064. }, {
  2065. key: "parse",
  2066. value: function parse(context, start) {
  2067. this.context = context;
  2068. var inFlow = context.inFlow,
  2069. src = context.src;
  2070. var offset = start;
  2071. var ch = src[offset];
  2072. if (ch && ch !== '#' && ch !== '\n') {
  2073. offset = PlainValue.endOfLine(src, start, inFlow);
  2074. }
  2075. this.valueRange = new Range(start, offset);
  2076. offset = Node.endOfWhiteSpace(src, offset);
  2077. offset = this.parseComment(offset);
  2078. if (!this.hasComment || this.valueRange.isEmpty()) {
  2079. offset = this.parseBlockValue(offset);
  2080. }
  2081. return offset;
  2082. }
  2083. }, {
  2084. key: "strValue",
  2085. get: function get() {
  2086. if (!this.valueRange || !this.context) return null;
  2087. var _this$valueRange = this.valueRange,
  2088. start = _this$valueRange.start,
  2089. end = _this$valueRange.end;
  2090. var src = this.context.src;
  2091. var ch = src[end - 1];
  2092. while (start < end && (ch === '\n' || ch === '\t' || ch === ' ')) {
  2093. ch = src[--end - 1];
  2094. }
  2095. var str = '';
  2096. for (var i = start; i < end; ++i) {
  2097. var _ch = src[i];
  2098. if (_ch === '\n') {
  2099. var _Node$foldNewline = Node.foldNewline(src, i, -1),
  2100. fold = _Node$foldNewline.fold,
  2101. offset = _Node$foldNewline.offset;
  2102. str += fold;
  2103. i = offset;
  2104. } else if (_ch === ' ' || _ch === '\t') {
  2105. // trim trailing whitespace
  2106. var wsStart = i;
  2107. var next = src[i + 1];
  2108. while (i < end && (next === ' ' || next === '\t')) {
  2109. i += 1;
  2110. next = src[i + 1];
  2111. }
  2112. if (next !== '\n') str += i > wsStart ? src.slice(wsStart, i + 1) : _ch;
  2113. } else {
  2114. str += _ch;
  2115. }
  2116. }
  2117. var ch0 = src[start];
  2118. switch (ch0) {
  2119. case '\t':
  2120. {
  2121. var msg = 'Plain value cannot start with a tab character';
  2122. var errors = [new YAMLSemanticError(this, msg)];
  2123. return {
  2124. errors: errors,
  2125. str: str
  2126. };
  2127. }
  2128. case '@':
  2129. case '`':
  2130. {
  2131. var _msg = "Plain value cannot start with reserved character ".concat(ch0);
  2132. var _errors = [new YAMLSemanticError(this, _msg)];
  2133. return {
  2134. errors: _errors,
  2135. str: str
  2136. };
  2137. }
  2138. default:
  2139. return str;
  2140. }
  2141. }
  2142. }], [{
  2143. key: "endOfLine",
  2144. value: function endOfLine(src, start, inFlow) {
  2145. var ch = src[start];
  2146. var offset = start;
  2147. while (ch && ch !== '\n') {
  2148. if (inFlow && (ch === '[' || ch === ']' || ch === '{' || ch === '}' || ch === ',')) break;
  2149. var next = src[offset + 1];
  2150. if (ch === ':' && (!next || next === '\n' || next === '\t' || next === ' ' || inFlow && next === ',')) break;
  2151. if ((ch === ' ' || ch === '\t') && next === '#') break;
  2152. offset += 1;
  2153. ch = next;
  2154. }
  2155. return offset;
  2156. }
  2157. }]);
  2158. return PlainValue;
  2159. }(Node);
  2160. var BlankLine = /*#__PURE__*/function (_Node) {
  2161. _inherits(BlankLine, _Node);
  2162. var _super = _createSuper(BlankLine);
  2163. function BlankLine() {
  2164. _classCallCheck(this, BlankLine);
  2165. return _super.call(this, Type.BLANK_LINE);
  2166. }
  2167. /* istanbul ignore next */
  2168. _createClass(BlankLine, [{
  2169. key: "parse",
  2170. /**
  2171. * Parses a blank line from the source
  2172. *
  2173. * @param {ParseContext} context
  2174. * @param {number} start - Index of first \n character
  2175. * @returns {number} - Index of the character after this
  2176. */
  2177. value: function parse(context, start) {
  2178. this.context = context;
  2179. this.range = new Range(start, start + 1);
  2180. return start + 1;
  2181. }
  2182. }, {
  2183. key: "includesTrailingLines",
  2184. get: function get() {
  2185. // This is never called from anywhere, but if it were,
  2186. // this is the value it should return.
  2187. return true;
  2188. }
  2189. }]);
  2190. return BlankLine;
  2191. }(Node);
  2192. var CollectionItem = /*#__PURE__*/function (_Node) {
  2193. _inherits(CollectionItem, _Node);
  2194. var _super = _createSuper(CollectionItem);
  2195. function CollectionItem(type, props) {
  2196. var _this;
  2197. _classCallCheck(this, CollectionItem);
  2198. _this = _super.call(this, type, props);
  2199. _this.node = null;
  2200. return _this;
  2201. }
  2202. _createClass(CollectionItem, [{
  2203. key: "parse",
  2204. /**
  2205. * @param {ParseContext} context
  2206. * @param {number} start - Index of first character
  2207. * @returns {number} - Index of the character after this
  2208. */
  2209. value: function parse(context, start) {
  2210. this.context = context;
  2211. var parseNode = context.parseNode,
  2212. src = context.src;
  2213. var atLineStart = context.atLineStart,
  2214. lineStart = context.lineStart;
  2215. if (!atLineStart && this.type === Type.SEQ_ITEM) this.error = new YAMLSemanticError(this, 'Sequence items must not have preceding content on the same line');
  2216. var indent = atLineStart ? start - lineStart : context.indent;
  2217. var offset = Node.endOfWhiteSpace(src, start + 1);
  2218. var ch = src[offset];
  2219. var inlineComment = ch === '#';
  2220. var comments = [];
  2221. var blankLine = null;
  2222. while (ch === '\n' || ch === '#') {
  2223. if (ch === '#') {
  2224. var _end = Node.endOfLine(src, offset + 1);
  2225. comments.push(new Range(offset, _end));
  2226. offset = _end;
  2227. } else {
  2228. atLineStart = true;
  2229. lineStart = offset + 1;
  2230. var wsEnd = Node.endOfWhiteSpace(src, lineStart);
  2231. if (src[wsEnd] === '\n' && comments.length === 0) {
  2232. blankLine = new BlankLine();
  2233. lineStart = blankLine.parse({
  2234. src: src
  2235. }, lineStart);
  2236. }
  2237. offset = Node.endOfIndent(src, lineStart);
  2238. }
  2239. ch = src[offset];
  2240. }
  2241. if (Node.nextNodeIsIndented(ch, offset - (lineStart + indent), this.type !== Type.SEQ_ITEM)) {
  2242. this.node = parseNode({
  2243. atLineStart: atLineStart,
  2244. inCollection: false,
  2245. indent: indent,
  2246. lineStart: lineStart,
  2247. parent: this
  2248. }, offset);
  2249. } else if (ch && lineStart > start + 1) {
  2250. offset = lineStart - 1;
  2251. }
  2252. if (this.node) {
  2253. if (blankLine) {
  2254. // Only blank lines preceding non-empty nodes are captured. Note that
  2255. // this means that collection item range start indices do not always
  2256. // increase monotonically. -- eemeli/yaml#126
  2257. var items = context.parent.items || context.parent.contents;
  2258. if (items) items.push(blankLine);
  2259. }
  2260. if (comments.length) Array.prototype.push.apply(this.props, comments);
  2261. offset = this.node.range.end;
  2262. } else {
  2263. if (inlineComment) {
  2264. var c = comments[0];
  2265. this.props.push(c);
  2266. offset = c.end;
  2267. } else {
  2268. offset = Node.endOfLine(src, start + 1);
  2269. }
  2270. }
  2271. var end = this.node ? this.node.valueRange.end : offset;
  2272. this.valueRange = new Range(start, end);
  2273. return offset;
  2274. }
  2275. }, {
  2276. key: "setOrigRanges",
  2277. value: function setOrigRanges(cr, offset) {
  2278. offset = _get(_getPrototypeOf(CollectionItem.prototype), "setOrigRanges", this).call(this, cr, offset);
  2279. return this.node ? this.node.setOrigRanges(cr, offset) : offset;
  2280. }
  2281. }, {
  2282. key: "toString",
  2283. value: function toString() {
  2284. var src = this.context.src,
  2285. node = this.node,
  2286. range = this.range,
  2287. value = this.value;
  2288. if (value != null) return value;
  2289. var str = node ? src.slice(range.start, node.range.start) + String(node) : src.slice(range.start, range.end);
  2290. return Node.addStringTerminator(src, range.end, str);
  2291. }
  2292. }, {
  2293. key: "includesTrailingLines",
  2294. get: function get() {
  2295. return !!this.node && this.node.includesTrailingLines;
  2296. }
  2297. }]);
  2298. return CollectionItem;
  2299. }(Node);
  2300. var Comment = /*#__PURE__*/function (_Node) {
  2301. _inherits(Comment, _Node);
  2302. var _super = _createSuper(Comment);
  2303. function Comment() {
  2304. _classCallCheck(this, Comment);
  2305. return _super.call(this, Type.COMMENT);
  2306. }
  2307. /**
  2308. * Parses a comment line from the source
  2309. *
  2310. * @param {ParseContext} context
  2311. * @param {number} start - Index of first character
  2312. * @returns {number} - Index of the character after this scalar
  2313. */
  2314. _createClass(Comment, [{
  2315. key: "parse",
  2316. value: function parse(context, start) {
  2317. this.context = context;
  2318. var offset = this.parseComment(start);
  2319. this.range = new Range(start, offset);
  2320. return offset;
  2321. }
  2322. }]);
  2323. return Comment;
  2324. }(Node);
  2325. function grabCollectionEndComments(node) {
  2326. var cnode = node;
  2327. while (cnode instanceof CollectionItem) {
  2328. cnode = cnode.node;
  2329. }
  2330. if (!(cnode instanceof Collection)) return null;
  2331. var len = cnode.items.length;
  2332. var ci = -1;
  2333. for (var i = len - 1; i >= 0; --i) {
  2334. var n = cnode.items[i];
  2335. if (n.type === Type.COMMENT) {
  2336. // Keep sufficiently indented comments with preceding node
  2337. var _n$context = n.context,
  2338. indent = _n$context.indent,
  2339. lineStart = _n$context.lineStart;
  2340. if (indent > 0 && n.range.start >= lineStart + indent) break;
  2341. ci = i;
  2342. } else if (n.type === Type.BLANK_LINE) ci = i;else break;
  2343. }
  2344. if (ci === -1) return null;
  2345. var ca = cnode.items.splice(ci, len - ci);
  2346. var prevEnd = ca[0].range.start;
  2347. while (true) {
  2348. cnode.range.end = prevEnd;
  2349. if (cnode.valueRange && cnode.valueRange.end > prevEnd) cnode.valueRange.end = prevEnd;
  2350. if (cnode === node) break;
  2351. cnode = cnode.context.parent;
  2352. }
  2353. return ca;
  2354. }
  2355. var Collection = /*#__PURE__*/function (_Node) {
  2356. _inherits(Collection, _Node);
  2357. var _super = _createSuper(Collection);
  2358. _createClass(Collection, null, [{
  2359. key: "nextContentHasIndent",
  2360. value: function nextContentHasIndent(src, offset, indent) {
  2361. var lineStart = Node.endOfLine(src, offset) + 1;
  2362. offset = Node.endOfWhiteSpace(src, lineStart);
  2363. var ch = src[offset];
  2364. if (!ch) return false;
  2365. if (offset >= lineStart + indent) return true;
  2366. if (ch !== '#' && ch !== '\n') return false;
  2367. return Collection.nextContentHasIndent(src, offset, indent);
  2368. }
  2369. }]);
  2370. function Collection(firstItem) {
  2371. var _this;
  2372. _classCallCheck(this, Collection);
  2373. _this = _super.call(this, firstItem.type === Type.SEQ_ITEM ? Type.SEQ : Type.MAP);
  2374. for (var i = firstItem.props.length - 1; i >= 0; --i) {
  2375. if (firstItem.props[i].start < firstItem.context.lineStart) {
  2376. // props on previous line are assumed by the collection
  2377. _this.props = firstItem.props.slice(0, i + 1);
  2378. firstItem.props = firstItem.props.slice(i + 1);
  2379. var itemRange = firstItem.props[0] || firstItem.valueRange;
  2380. firstItem.range.start = itemRange.start;
  2381. break;
  2382. }
  2383. }
  2384. _this.items = [firstItem];
  2385. var ec = grabCollectionEndComments(firstItem);
  2386. if (ec) Array.prototype.push.apply(_this.items, ec);
  2387. return _this;
  2388. }
  2389. _createClass(Collection, [{
  2390. key: "parse",
  2391. /**
  2392. * @param {ParseContext} context
  2393. * @param {number} start - Index of first character
  2394. * @returns {number} - Index of the character after this
  2395. */
  2396. value: function parse(context, start) {
  2397. this.context = context;
  2398. var parseNode = context.parseNode,
  2399. src = context.src; // It's easier to recalculate lineStart here rather than tracking down the
  2400. // last context from which to read it -- eemeli/yaml#2
  2401. var lineStart = Node.startOfLine(src, start);
  2402. var firstItem = this.items[0]; // First-item context needs to be correct for later comment handling
  2403. // -- eemeli/yaml#17
  2404. firstItem.context.parent = this;
  2405. this.valueRange = Range.copy(firstItem.valueRange);
  2406. var indent = firstItem.range.start - firstItem.context.lineStart;
  2407. var offset = start;
  2408. offset = Node.normalizeOffset(src, offset);
  2409. var ch = src[offset];
  2410. var atLineStart = Node.endOfWhiteSpace(src, lineStart) === offset;
  2411. var prevIncludesTrailingLines = false;
  2412. while (ch) {
  2413. while (ch === '\n' || ch === '#') {
  2414. if (atLineStart && ch === '\n' && !prevIncludesTrailingLines) {
  2415. var blankLine = new BlankLine();
  2416. offset = blankLine.parse({
  2417. src: src
  2418. }, offset);
  2419. this.valueRange.end = offset;
  2420. if (offset >= src.length) {
  2421. ch = null;
  2422. break;
  2423. }
  2424. this.items.push(blankLine);
  2425. offset -= 1; // blankLine.parse() consumes terminal newline
  2426. } else if (ch === '#') {
  2427. if (offset < lineStart + indent && !Collection.nextContentHasIndent(src, offset, indent)) {
  2428. return offset;
  2429. }
  2430. var comment = new Comment();
  2431. offset = comment.parse({
  2432. indent: indent,
  2433. lineStart: lineStart,
  2434. src: src
  2435. }, offset);
  2436. this.items.push(comment);
  2437. this.valueRange.end = offset;
  2438. if (offset >= src.length) {
  2439. ch = null;
  2440. break;
  2441. }
  2442. }
  2443. lineStart = offset + 1;
  2444. offset = Node.endOfIndent(src, lineStart);
  2445. if (Node.atBlank(src, offset)) {
  2446. var wsEnd = Node.endOfWhiteSpace(src, offset);
  2447. var next = src[wsEnd];
  2448. if (!next || next === '\n' || next === '#') {
  2449. offset = wsEnd;
  2450. }
  2451. }
  2452. ch = src[offset];
  2453. atLineStart = true;
  2454. }
  2455. if (!ch) {
  2456. break;
  2457. }
  2458. if (offset !== lineStart + indent && (atLineStart || ch !== ':')) {
  2459. if (offset < lineStart + indent) {
  2460. if (lineStart > start) offset = lineStart;
  2461. break;
  2462. } else if (!this.error) {
  2463. var msg = 'All collection items must start at the same column';
  2464. this.error = new YAMLSyntaxError(this, msg);
  2465. }
  2466. }
  2467. if (firstItem.type === Type.SEQ_ITEM) {
  2468. if (ch !== '-') {
  2469. if (lineStart > start) offset = lineStart;
  2470. break;
  2471. }
  2472. } else if (ch === '-' && !this.error) {
  2473. // map key may start with -, as long as it's followed by a non-whitespace char
  2474. var _next = src[offset + 1];
  2475. if (!_next || _next === '\n' || _next === '\t' || _next === ' ') {
  2476. var _msg = 'A collection cannot be both a mapping and a sequence';
  2477. this.error = new YAMLSyntaxError(this, _msg);
  2478. }
  2479. }
  2480. var node = parseNode({
  2481. atLineStart: atLineStart,
  2482. inCollection: true,
  2483. indent: indent,
  2484. lineStart: lineStart,
  2485. parent: this
  2486. }, offset);
  2487. if (!node) return offset; // at next document start
  2488. this.items.push(node);
  2489. this.valueRange.end = node.valueRange.end;
  2490. offset = Node.normalizeOffset(src, node.range.end);
  2491. ch = src[offset];
  2492. atLineStart = false;
  2493. prevIncludesTrailingLines = node.includesTrailingLines; // Need to reset lineStart and atLineStart here if preceding node's range
  2494. // has advanced to check the current line's indentation level
  2495. // -- eemeli/yaml#10 & eemeli/yaml#38
  2496. if (ch) {
  2497. var ls = offset - 1;
  2498. var prev = src[ls];
  2499. while (prev === ' ' || prev === '\t') {
  2500. prev = src[--ls];
  2501. }
  2502. if (prev === '\n') {
  2503. lineStart = ls + 1;
  2504. atLineStart = true;
  2505. }
  2506. }
  2507. var ec = grabCollectionEndComments(node);
  2508. if (ec) Array.prototype.push.apply(this.items, ec);
  2509. }
  2510. return offset;
  2511. }
  2512. }, {
  2513. key: "setOrigRanges",
  2514. value: function setOrigRanges(cr, offset) {
  2515. offset = _get(_getPrototypeOf(Collection.prototype), "setOrigRanges", this).call(this, cr, offset);
  2516. this.items.forEach(function (node) {
  2517. offset = node.setOrigRanges(cr, offset);
  2518. });
  2519. return offset;
  2520. }
  2521. }, {
  2522. key: "toString",
  2523. value: function toString() {
  2524. var src = this.context.src,
  2525. items = this.items,
  2526. range = this.range,
  2527. value = this.value;
  2528. if (value != null) return value;
  2529. var str = src.slice(range.start, items[0].range.start) + String(items[0]);
  2530. for (var i = 1; i < items.length; ++i) {
  2531. var item = items[i];
  2532. var _item$context = item.context,
  2533. atLineStart = _item$context.atLineStart,
  2534. indent = _item$context.indent;
  2535. if (atLineStart) for (var _i = 0; _i < indent; ++_i) {
  2536. str += ' ';
  2537. }
  2538. str += String(item);
  2539. }
  2540. return Node.addStringTerminator(src, range.end, str);
  2541. }
  2542. }, {
  2543. key: "includesTrailingLines",
  2544. get: function get() {
  2545. return this.items.length > 0;
  2546. }
  2547. }]);
  2548. return Collection;
  2549. }(Node);
  2550. var Directive = /*#__PURE__*/function (_Node) {
  2551. _inherits(Directive, _Node);
  2552. var _super = _createSuper(Directive);
  2553. function Directive() {
  2554. var _this;
  2555. _classCallCheck(this, Directive);
  2556. _this = _super.call(this, Type.DIRECTIVE);
  2557. _this.name = null;
  2558. return _this;
  2559. }
  2560. _createClass(Directive, [{
  2561. key: "parseName",
  2562. value: function parseName(start) {
  2563. var src = this.context.src;
  2564. var offset = start;
  2565. var ch = src[offset];
  2566. while (ch && ch !== '\n' && ch !== '\t' && ch !== ' ') {
  2567. ch = src[offset += 1];
  2568. }
  2569. this.name = src.slice(start, offset);
  2570. return offset;
  2571. }
  2572. }, {
  2573. key: "parseParameters",
  2574. value: function parseParameters(start) {
  2575. var src = this.context.src;
  2576. var offset = start;
  2577. var ch = src[offset];
  2578. while (ch && ch !== '\n' && ch !== '#') {
  2579. ch = src[offset += 1];
  2580. }
  2581. this.valueRange = new Range(start, offset);
  2582. return offset;
  2583. }
  2584. }, {
  2585. key: "parse",
  2586. value: function parse(context, start) {
  2587. this.context = context;
  2588. var offset = this.parseName(start + 1);
  2589. offset = this.parseParameters(offset);
  2590. offset = this.parseComment(offset);
  2591. this.range = new Range(start, offset);
  2592. return offset;
  2593. }
  2594. }, {
  2595. key: "parameters",
  2596. get: function get() {
  2597. var raw = this.rawValue;
  2598. return raw ? raw.trim().split(/[ \t]+/) : [];
  2599. }
  2600. }]);
  2601. return Directive;
  2602. }(Node);
  2603. var Document = /*#__PURE__*/function (_Node) {
  2604. _inherits(Document, _Node);
  2605. var _super = _createSuper(Document);
  2606. _createClass(Document, null, [{
  2607. key: "startCommentOrEndBlankLine",
  2608. value: function startCommentOrEndBlankLine(src, start) {
  2609. var offset = Node.endOfWhiteSpace(src, start);
  2610. var ch = src[offset];
  2611. return ch === '#' || ch === '\n' ? offset : start;
  2612. }
  2613. }]);
  2614. function Document() {
  2615. var _this;
  2616. _classCallCheck(this, Document);
  2617. _this = _super.call(this, Type.DOCUMENT);
  2618. _this.directives = null;
  2619. _this.contents = null;
  2620. _this.directivesEndMarker = null;
  2621. _this.documentEndMarker = null;
  2622. return _this;
  2623. }
  2624. _createClass(Document, [{
  2625. key: "parseDirectives",
  2626. value: function parseDirectives(start) {
  2627. var src = this.context.src;
  2628. this.directives = [];
  2629. var atLineStart = true;
  2630. var hasDirectives = false;
  2631. var offset = start;
  2632. while (!Node.atDocumentBoundary(src, offset, Char.DIRECTIVES_END)) {
  2633. offset = Document.startCommentOrEndBlankLine(src, offset);
  2634. switch (src[offset]) {
  2635. case '\n':
  2636. if (atLineStart) {
  2637. var blankLine = new BlankLine();
  2638. offset = blankLine.parse({
  2639. src: src
  2640. }, offset);
  2641. if (offset < src.length) {
  2642. this.directives.push(blankLine);
  2643. }
  2644. } else {
  2645. offset += 1;
  2646. atLineStart = true;
  2647. }
  2648. break;
  2649. case '#':
  2650. {
  2651. var comment = new Comment();
  2652. offset = comment.parse({
  2653. src: src
  2654. }, offset);
  2655. this.directives.push(comment);
  2656. atLineStart = false;
  2657. }
  2658. break;
  2659. case '%':
  2660. {
  2661. var directive = new Directive();
  2662. offset = directive.parse({
  2663. parent: this,
  2664. src: src
  2665. }, offset);
  2666. this.directives.push(directive);
  2667. hasDirectives = true;
  2668. atLineStart = false;
  2669. }
  2670. break;
  2671. default:
  2672. if (hasDirectives) {
  2673. this.error = new YAMLSemanticError(this, 'Missing directives-end indicator line');
  2674. } else if (this.directives.length > 0) {
  2675. this.contents = this.directives;
  2676. this.directives = [];
  2677. }
  2678. return offset;
  2679. }
  2680. }
  2681. if (src[offset]) {
  2682. this.directivesEndMarker = new Range(offset, offset + 3);
  2683. return offset + 3;
  2684. }
  2685. if (hasDirectives) {
  2686. this.error = new YAMLSemanticError(this, 'Missing directives-end indicator line');
  2687. } else if (this.directives.length > 0) {
  2688. this.contents = this.directives;
  2689. this.directives = [];
  2690. }
  2691. return offset;
  2692. }
  2693. }, {
  2694. key: "parseContents",
  2695. value: function parseContents(start) {
  2696. var _this$context = this.context,
  2697. parseNode = _this$context.parseNode,
  2698. src = _this$context.src;
  2699. if (!this.contents) this.contents = [];
  2700. var lineStart = start;
  2701. while (src[lineStart - 1] === '-') {
  2702. lineStart -= 1;
  2703. }
  2704. var offset = Node.endOfWhiteSpace(src, start);
  2705. var atLineStart = lineStart === start;
  2706. this.valueRange = new Range(offset);
  2707. while (!Node.atDocumentBoundary(src, offset, Char.DOCUMENT_END)) {
  2708. switch (src[offset]) {
  2709. case '\n':
  2710. if (atLineStart) {
  2711. var blankLine = new BlankLine();
  2712. offset = blankLine.parse({
  2713. src: src
  2714. }, offset);
  2715. if (offset < src.length) {
  2716. this.contents.push(blankLine);
  2717. }
  2718. } else {
  2719. offset += 1;
  2720. atLineStart = true;
  2721. }
  2722. lineStart = offset;
  2723. break;
  2724. case '#':
  2725. {
  2726. var comment = new Comment();
  2727. offset = comment.parse({
  2728. src: src
  2729. }, offset);
  2730. this.contents.push(comment);
  2731. atLineStart = false;
  2732. }
  2733. break;
  2734. default:
  2735. {
  2736. var iEnd = Node.endOfIndent(src, offset);
  2737. var context = {
  2738. atLineStart: atLineStart,
  2739. indent: -1,
  2740. inFlow: false,
  2741. inCollection: false,
  2742. lineStart: lineStart,
  2743. parent: this
  2744. };
  2745. var node = parseNode(context, iEnd);
  2746. if (!node) return this.valueRange.end = iEnd; // at next document start
  2747. this.contents.push(node);
  2748. offset = node.range.end;
  2749. atLineStart = false;
  2750. var ec = grabCollectionEndComments(node);
  2751. if (ec) Array.prototype.push.apply(this.contents, ec);
  2752. }
  2753. }
  2754. offset = Document.startCommentOrEndBlankLine(src, offset);
  2755. }
  2756. this.valueRange.end = offset;
  2757. if (src[offset]) {
  2758. this.documentEndMarker = new Range(offset, offset + 3);
  2759. offset += 3;
  2760. if (src[offset]) {
  2761. offset = Node.endOfWhiteSpace(src, offset);
  2762. if (src[offset] === '#') {
  2763. var _comment = new Comment();
  2764. offset = _comment.parse({
  2765. src: src
  2766. }, offset);
  2767. this.contents.push(_comment);
  2768. }
  2769. switch (src[offset]) {
  2770. case '\n':
  2771. offset += 1;
  2772. break;
  2773. case undefined:
  2774. break;
  2775. default:
  2776. this.error = new YAMLSyntaxError(this, 'Document end marker line cannot have a non-comment suffix');
  2777. }
  2778. }
  2779. }
  2780. return offset;
  2781. }
  2782. /**
  2783. * @param {ParseContext} context
  2784. * @param {number} start - Index of first character
  2785. * @returns {number} - Index of the character after this
  2786. */
  2787. }, {
  2788. key: "parse",
  2789. value: function parse(context, start) {
  2790. context.root = this;
  2791. this.context = context;
  2792. var src = context.src;
  2793. var offset = src.charCodeAt(start) === 0xfeff ? start + 1 : start; // skip BOM
  2794. offset = this.parseDirectives(offset);
  2795. offset = this.parseContents(offset);
  2796. return offset;
  2797. }
  2798. }, {
  2799. key: "setOrigRanges",
  2800. value: function setOrigRanges(cr, offset) {
  2801. offset = _get(_getPrototypeOf(Document.prototype), "setOrigRanges", this).call(this, cr, offset);
  2802. this.directives.forEach(function (node) {
  2803. offset = node.setOrigRanges(cr, offset);
  2804. });
  2805. if (this.directivesEndMarker) offset = this.directivesEndMarker.setOrigRange(cr, offset);
  2806. this.contents.forEach(function (node) {
  2807. offset = node.setOrigRanges(cr, offset);
  2808. });
  2809. if (this.documentEndMarker) offset = this.documentEndMarker.setOrigRange(cr, offset);
  2810. return offset;
  2811. }
  2812. }, {
  2813. key: "toString",
  2814. value: function toString() {
  2815. var contents = this.contents,
  2816. directives = this.directives,
  2817. value = this.value;
  2818. if (value != null) return value;
  2819. var str = directives.join('');
  2820. if (contents.length > 0) {
  2821. if (directives.length > 0 || contents[0].type === Type.COMMENT) str += '---\n';
  2822. str += contents.join('');
  2823. }
  2824. if (str[str.length - 1] !== '\n') str += '\n';
  2825. return str;
  2826. }
  2827. }]);
  2828. return Document;
  2829. }(Node);
  2830. var Alias = /*#__PURE__*/function (_Node) {
  2831. _inherits(Alias, _Node);
  2832. var _super = _createSuper(Alias);
  2833. function Alias() {
  2834. _classCallCheck(this, Alias);
  2835. return _super.apply(this, arguments);
  2836. }
  2837. _createClass(Alias, [{
  2838. key: "parse",
  2839. /**
  2840. * Parses an *alias from the source
  2841. *
  2842. * @param {ParseContext} context
  2843. * @param {number} start - Index of first character
  2844. * @returns {number} - Index of the character after this scalar
  2845. */
  2846. value: function parse(context, start) {
  2847. this.context = context;
  2848. var src = context.src;
  2849. var offset = Node.endOfIdentifier(src, start + 1);
  2850. this.valueRange = new Range(start + 1, offset);
  2851. offset = Node.endOfWhiteSpace(src, offset);
  2852. offset = this.parseComment(offset);
  2853. return offset;
  2854. }
  2855. }]);
  2856. return Alias;
  2857. }(Node);
  2858. var Chomp = {
  2859. CLIP: 'CLIP',
  2860. KEEP: 'KEEP',
  2861. STRIP: 'STRIP'
  2862. };
  2863. var BlockValue = /*#__PURE__*/function (_Node) {
  2864. _inherits(BlockValue, _Node);
  2865. var _super = _createSuper(BlockValue);
  2866. function BlockValue(type, props) {
  2867. var _this;
  2868. _classCallCheck(this, BlockValue);
  2869. _this = _super.call(this, type, props);
  2870. _this.blockIndent = null;
  2871. _this.chomping = Chomp.CLIP;
  2872. _this.header = null;
  2873. return _this;
  2874. }
  2875. _createClass(BlockValue, [{
  2876. key: "parseBlockHeader",
  2877. value: function parseBlockHeader(start) {
  2878. var src = this.context.src;
  2879. var offset = start + 1;
  2880. var bi = '';
  2881. while (true) {
  2882. var ch = src[offset];
  2883. switch (ch) {
  2884. case '-':
  2885. this.chomping = Chomp.STRIP;
  2886. break;
  2887. case '+':
  2888. this.chomping = Chomp.KEEP;
  2889. break;
  2890. case '0':
  2891. case '1':
  2892. case '2':
  2893. case '3':
  2894. case '4':
  2895. case '5':
  2896. case '6':
  2897. case '7':
  2898. case '8':
  2899. case '9':
  2900. bi += ch;
  2901. break;
  2902. default:
  2903. this.blockIndent = Number(bi) || null;
  2904. this.header = new Range(start, offset);
  2905. return offset;
  2906. }
  2907. offset += 1;
  2908. }
  2909. }
  2910. }, {
  2911. key: "parseBlockValue",
  2912. value: function parseBlockValue(start) {
  2913. var _this$context = this.context,
  2914. indent = _this$context.indent,
  2915. src = _this$context.src;
  2916. var explicit = !!this.blockIndent;
  2917. var offset = start;
  2918. var valueEnd = start;
  2919. var minBlockIndent = 1;
  2920. for (var ch = src[offset]; ch === '\n'; ch = src[offset]) {
  2921. offset += 1;
  2922. if (Node.atDocumentBoundary(src, offset)) break;
  2923. var end = Node.endOfBlockIndent(src, indent, offset); // should not include tab?
  2924. if (end === null) break;
  2925. var _ch = src[end];
  2926. var lineIndent = end - (offset + indent);
  2927. if (!this.blockIndent) {
  2928. // no explicit block indent, none yet detected
  2929. if (src[end] !== '\n') {
  2930. // first line with non-whitespace content
  2931. if (lineIndent < minBlockIndent) {
  2932. var msg = 'Block scalars with more-indented leading empty lines must use an explicit indentation indicator';
  2933. this.error = new YAMLSemanticError(this, msg);
  2934. }
  2935. this.blockIndent = lineIndent;
  2936. } else if (lineIndent > minBlockIndent) {
  2937. // empty line with more whitespace
  2938. minBlockIndent = lineIndent;
  2939. }
  2940. } else if (_ch && _ch !== '\n' && lineIndent < this.blockIndent) {
  2941. if (src[end] === '#') break;
  2942. if (!this.error) {
  2943. var _src = explicit ? 'explicit indentation indicator' : 'first line';
  2944. var _msg = "Block scalars must not be less indented than their ".concat(_src);
  2945. this.error = new YAMLSemanticError(this, _msg);
  2946. }
  2947. }
  2948. if (src[end] === '\n') {
  2949. offset = end;
  2950. } else {
  2951. offset = valueEnd = Node.endOfLine(src, end);
  2952. }
  2953. }
  2954. if (this.chomping !== Chomp.KEEP) {
  2955. offset = src[valueEnd] ? valueEnd + 1 : valueEnd;
  2956. }
  2957. this.valueRange = new Range(start + 1, offset);
  2958. return offset;
  2959. }
  2960. /**
  2961. * Parses a block value from the source
  2962. *
  2963. * Accepted forms are:
  2964. * ```
  2965. * BS
  2966. * block
  2967. * lines
  2968. *
  2969. * BS #comment
  2970. * block
  2971. * lines
  2972. * ```
  2973. * where the block style BS matches the regexp `[|>][-+1-9]*` and block lines
  2974. * are empty or have an indent level greater than `indent`.
  2975. *
  2976. * @param {ParseContext} context
  2977. * @param {number} start - Index of first character
  2978. * @returns {number} - Index of the character after this block
  2979. */
  2980. }, {
  2981. key: "parse",
  2982. value: function parse(context, start) {
  2983. this.context = context;
  2984. var src = context.src;
  2985. var offset = this.parseBlockHeader(start);
  2986. offset = Node.endOfWhiteSpace(src, offset);
  2987. offset = this.parseComment(offset);
  2988. offset = this.parseBlockValue(offset);
  2989. return offset;
  2990. }
  2991. }, {
  2992. key: "setOrigRanges",
  2993. value: function setOrigRanges(cr, offset) {
  2994. offset = _get(_getPrototypeOf(BlockValue.prototype), "setOrigRanges", this).call(this, cr, offset);
  2995. return this.header ? this.header.setOrigRange(cr, offset) : offset;
  2996. }
  2997. }, {
  2998. key: "includesTrailingLines",
  2999. get: function get() {
  3000. return this.chomping === Chomp.KEEP;
  3001. }
  3002. }, {
  3003. key: "strValue",
  3004. get: function get() {
  3005. if (!this.valueRange || !this.context) return null;
  3006. var _this$valueRange = this.valueRange,
  3007. start = _this$valueRange.start,
  3008. end = _this$valueRange.end;
  3009. var _this$context2 = this.context,
  3010. indent = _this$context2.indent,
  3011. src = _this$context2.src;
  3012. if (this.valueRange.isEmpty()) return '';
  3013. var lastNewLine = null;
  3014. var ch = src[end - 1];
  3015. while (ch === '\n' || ch === '\t' || ch === ' ') {
  3016. end -= 1;
  3017. if (end <= start) {
  3018. if (this.chomping === Chomp.KEEP) break;else return ''; // probably never happens
  3019. }
  3020. if (ch === '\n') lastNewLine = end;
  3021. ch = src[end - 1];
  3022. }
  3023. var keepStart = end + 1;
  3024. if (lastNewLine) {
  3025. if (this.chomping === Chomp.KEEP) {
  3026. keepStart = lastNewLine;
  3027. end = this.valueRange.end;
  3028. } else {
  3029. end = lastNewLine;
  3030. }
  3031. }
  3032. var bi = indent + this.blockIndent;
  3033. var folded = this.type === Type.BLOCK_FOLDED;
  3034. var atStart = true;
  3035. var str = '';
  3036. var sep = '';
  3037. var prevMoreIndented = false;
  3038. for (var i = start; i < end; ++i) {
  3039. for (var j = 0; j < bi; ++j) {
  3040. if (src[i] !== ' ') break;
  3041. i += 1;
  3042. }
  3043. var _ch2 = src[i];
  3044. if (_ch2 === '\n') {
  3045. if (sep === '\n') str += '\n';else sep = '\n';
  3046. } else {
  3047. var lineEnd = Node.endOfLine(src, i);
  3048. var line = src.slice(i, lineEnd);
  3049. i = lineEnd;
  3050. if (folded && (_ch2 === ' ' || _ch2 === '\t') && i < keepStart) {
  3051. if (sep === ' ') sep = '\n';else if (!prevMoreIndented && !atStart && sep === '\n') sep = '\n\n';
  3052. str += sep + line; //+ ((lineEnd < end && src[lineEnd]) || '')
  3053. sep = lineEnd < end && src[lineEnd] || '';
  3054. prevMoreIndented = true;
  3055. } else {
  3056. str += sep + line;
  3057. sep = folded && i < keepStart ? ' ' : '\n';
  3058. prevMoreIndented = false;
  3059. }
  3060. if (atStart && line !== '') atStart = false;
  3061. }
  3062. }
  3063. return this.chomping === Chomp.STRIP ? str : str + '\n';
  3064. }
  3065. }]);
  3066. return BlockValue;
  3067. }(Node);
  3068. var FlowCollection = /*#__PURE__*/function (_Node) {
  3069. _inherits(FlowCollection, _Node);
  3070. var _super = _createSuper(FlowCollection);
  3071. function FlowCollection(type, props) {
  3072. var _this;
  3073. _classCallCheck(this, FlowCollection);
  3074. _this = _super.call(this, type, props);
  3075. _this.items = null;
  3076. return _this;
  3077. }
  3078. _createClass(FlowCollection, [{
  3079. key: "prevNodeIsJsonLike",
  3080. value: function prevNodeIsJsonLike() {
  3081. var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.items.length;
  3082. var node = this.items[idx - 1];
  3083. return !!node && (node.jsonLike || node.type === Type.COMMENT && this.prevNodeIsJsonLike(idx - 1));
  3084. }
  3085. /**
  3086. * @param {ParseContext} context
  3087. * @param {number} start - Index of first character
  3088. * @returns {number} - Index of the character after this
  3089. */
  3090. }, {
  3091. key: "parse",
  3092. value: function parse(context, start) {
  3093. this.context = context;
  3094. var parseNode = context.parseNode,
  3095. src = context.src;
  3096. var indent = context.indent,
  3097. lineStart = context.lineStart;
  3098. var char = src[start]; // { or [
  3099. this.items = [{
  3100. char: char,
  3101. offset: start
  3102. }];
  3103. var offset = Node.endOfWhiteSpace(src, start + 1);
  3104. char = src[offset];
  3105. while (char && char !== ']' && char !== '}') {
  3106. switch (char) {
  3107. case '\n':
  3108. {
  3109. lineStart = offset + 1;
  3110. var wsEnd = Node.endOfWhiteSpace(src, lineStart);
  3111. if (src[wsEnd] === '\n') {
  3112. var blankLine = new BlankLine();
  3113. lineStart = blankLine.parse({
  3114. src: src
  3115. }, lineStart);
  3116. this.items.push(blankLine);
  3117. }
  3118. offset = Node.endOfIndent(src, lineStart);
  3119. if (offset <= lineStart + indent) {
  3120. char = src[offset];
  3121. if (offset < lineStart + indent || char !== ']' && char !== '}') {
  3122. var msg = 'Insufficient indentation in flow collection';
  3123. this.error = new YAMLSemanticError(this, msg);
  3124. }
  3125. }
  3126. }
  3127. break;
  3128. case ',':
  3129. {
  3130. this.items.push({
  3131. char: char,
  3132. offset: offset
  3133. });
  3134. offset += 1;
  3135. }
  3136. break;
  3137. case '#':
  3138. {
  3139. var comment = new Comment();
  3140. offset = comment.parse({
  3141. src: src
  3142. }, offset);
  3143. this.items.push(comment);
  3144. }
  3145. break;
  3146. case '?':
  3147. case ':':
  3148. {
  3149. var next = src[offset + 1];
  3150. if (next === '\n' || next === '\t' || next === ' ' || next === ',' || // in-flow : after JSON-like key does not need to be followed by whitespace
  3151. char === ':' && this.prevNodeIsJsonLike()) {
  3152. this.items.push({
  3153. char: char,
  3154. offset: offset
  3155. });
  3156. offset += 1;
  3157. break;
  3158. }
  3159. }
  3160. // fallthrough
  3161. default:
  3162. {
  3163. var node = parseNode({
  3164. atLineStart: false,
  3165. inCollection: false,
  3166. inFlow: true,
  3167. indent: -1,
  3168. lineStart: lineStart,
  3169. parent: this
  3170. }, offset);
  3171. if (!node) {
  3172. // at next document start
  3173. this.valueRange = new Range(start, offset);
  3174. return offset;
  3175. }
  3176. this.items.push(node);
  3177. offset = Node.normalizeOffset(src, node.range.end);
  3178. }
  3179. }
  3180. offset = Node.endOfWhiteSpace(src, offset);
  3181. char = src[offset];
  3182. }
  3183. this.valueRange = new Range(start, offset + 1);
  3184. if (char) {
  3185. this.items.push({
  3186. char: char,
  3187. offset: offset
  3188. });
  3189. offset = Node.endOfWhiteSpace(src, offset + 1);
  3190. offset = this.parseComment(offset);
  3191. }
  3192. return offset;
  3193. }
  3194. }, {
  3195. key: "setOrigRanges",
  3196. value: function setOrigRanges(cr, offset) {
  3197. offset = _get(_getPrototypeOf(FlowCollection.prototype), "setOrigRanges", this).call(this, cr, offset);
  3198. this.items.forEach(function (node) {
  3199. if (node instanceof Node) {
  3200. offset = node.setOrigRanges(cr, offset);
  3201. } else if (cr.length === 0) {
  3202. node.origOffset = node.offset;
  3203. } else {
  3204. var i = offset;
  3205. while (i < cr.length) {
  3206. if (cr[i] > node.offset) break;else ++i;
  3207. }
  3208. node.origOffset = node.offset + i;
  3209. offset = i;
  3210. }
  3211. });
  3212. return offset;
  3213. }
  3214. }, {
  3215. key: "toString",
  3216. value: function toString() {
  3217. var src = this.context.src,
  3218. items = this.items,
  3219. range = this.range,
  3220. value = this.value;
  3221. if (value != null) return value;
  3222. var nodes = items.filter(function (item) {
  3223. return item instanceof Node;
  3224. });
  3225. var str = '';
  3226. var prevEnd = range.start;
  3227. nodes.forEach(function (node) {
  3228. var prefix = src.slice(prevEnd, node.range.start);
  3229. prevEnd = node.range.end;
  3230. str += prefix + String(node);
  3231. if (str[str.length - 1] === '\n' && src[prevEnd - 1] !== '\n' && src[prevEnd] === '\n') {
  3232. // Comment range does not include the terminal newline, but its
  3233. // stringified value does. Without this fix, newlines at comment ends
  3234. // get duplicated.
  3235. prevEnd += 1;
  3236. }
  3237. });
  3238. str += src.slice(prevEnd, range.end);
  3239. return Node.addStringTerminator(src, range.end, str);
  3240. }
  3241. }]);
  3242. return FlowCollection;
  3243. }(Node);
  3244. var QuoteDouble = /*#__PURE__*/function (_Node) {
  3245. _inherits(QuoteDouble, _Node);
  3246. var _super = _createSuper(QuoteDouble);
  3247. function QuoteDouble() {
  3248. _classCallCheck(this, QuoteDouble);
  3249. return _super.apply(this, arguments);
  3250. }
  3251. _createClass(QuoteDouble, [{
  3252. key: "parseCharCode",
  3253. value: function parseCharCode(offset, length, errors) {
  3254. var src = this.context.src;
  3255. var cc = src.substr(offset, length);
  3256. var ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);
  3257. var code = ok ? parseInt(cc, 16) : NaN;
  3258. if (isNaN(code)) {
  3259. errors.push(new YAMLSyntaxError(this, "Invalid escape sequence ".concat(src.substr(offset - 2, length + 2))));
  3260. return src.substr(offset - 2, length + 2);
  3261. }
  3262. return String.fromCodePoint(code);
  3263. }
  3264. /**
  3265. * Parses a "double quoted" value from the source
  3266. *
  3267. * @param {ParseContext} context
  3268. * @param {number} start - Index of first character
  3269. * @returns {number} - Index of the character after this scalar
  3270. */
  3271. }, {
  3272. key: "parse",
  3273. value: function parse(context, start) {
  3274. this.context = context;
  3275. var src = context.src;
  3276. var offset = QuoteDouble.endOfQuote(src, start + 1);
  3277. this.valueRange = new Range(start, offset);
  3278. offset = Node.endOfWhiteSpace(src, offset);
  3279. offset = this.parseComment(offset);
  3280. return offset;
  3281. }
  3282. }, {
  3283. key: "strValue",
  3284. /**
  3285. * @returns {string | { str: string, errors: YAMLSyntaxError[] }}
  3286. */
  3287. get: function get() {
  3288. if (!this.valueRange || !this.context) return null;
  3289. var errors = [];
  3290. var _this$valueRange = this.valueRange,
  3291. start = _this$valueRange.start,
  3292. end = _this$valueRange.end;
  3293. var _this$context = this.context,
  3294. indent = _this$context.indent,
  3295. src = _this$context.src;
  3296. if (src[end - 1] !== '"') errors.push(new YAMLSyntaxError(this, 'Missing closing "quote')); // Using String#replace is too painful with escaped newlines preceded by
  3297. // escaped backslashes; also, this should be faster.
  3298. var str = '';
  3299. for (var i = start + 1; i < end - 1; ++i) {
  3300. var ch = src[i];
  3301. if (ch === '\n') {
  3302. if (Node.atDocumentBoundary(src, i + 1)) errors.push(new YAMLSemanticError(this, 'Document boundary indicators are not allowed within string values'));
  3303. var _Node$foldNewline = Node.foldNewline(src, i, indent),
  3304. fold = _Node$foldNewline.fold,
  3305. offset = _Node$foldNewline.offset,
  3306. error = _Node$foldNewline.error;
  3307. str += fold;
  3308. i = offset;
  3309. if (error) errors.push(new YAMLSemanticError(this, 'Multi-line double-quoted string needs to be sufficiently indented'));
  3310. } else if (ch === '\\') {
  3311. i += 1;
  3312. switch (src[i]) {
  3313. case '0':
  3314. str += '\0';
  3315. break;
  3316. // null character
  3317. case 'a':
  3318. str += '\x07';
  3319. break;
  3320. // bell character
  3321. case 'b':
  3322. str += '\b';
  3323. break;
  3324. // backspace
  3325. case 'e':
  3326. str += '\x1b';
  3327. break;
  3328. // escape character
  3329. case 'f':
  3330. str += '\f';
  3331. break;
  3332. // form feed
  3333. case 'n':
  3334. str += '\n';
  3335. break;
  3336. // line feed
  3337. case 'r':
  3338. str += '\r';
  3339. break;
  3340. // carriage return
  3341. case 't':
  3342. str += '\t';
  3343. break;
  3344. // horizontal tab
  3345. case 'v':
  3346. str += '\v';
  3347. break;
  3348. // vertical tab
  3349. case 'N':
  3350. str += "\x85";
  3351. break;
  3352. // Unicode next line
  3353. case '_':
  3354. str += "\xA0";
  3355. break;
  3356. // Unicode non-breaking space
  3357. case 'L':
  3358. str += "\u2028";
  3359. break;
  3360. // Unicode line separator
  3361. case 'P':
  3362. str += "\u2029";
  3363. break;
  3364. // Unicode paragraph separator
  3365. case ' ':
  3366. str += ' ';
  3367. break;
  3368. case '"':
  3369. str += '"';
  3370. break;
  3371. case '/':
  3372. str += '/';
  3373. break;
  3374. case '\\':
  3375. str += '\\';
  3376. break;
  3377. case '\t':
  3378. str += '\t';
  3379. break;
  3380. case 'x':
  3381. str += this.parseCharCode(i + 1, 2, errors);
  3382. i += 2;
  3383. break;
  3384. case 'u':
  3385. str += this.parseCharCode(i + 1, 4, errors);
  3386. i += 4;
  3387. break;
  3388. case 'U':
  3389. str += this.parseCharCode(i + 1, 8, errors);
  3390. i += 8;
  3391. break;
  3392. case '\n':
  3393. // skip escaped newlines, but still trim the following line
  3394. while (src[i + 1] === ' ' || src[i + 1] === '\t') {
  3395. i += 1;
  3396. }
  3397. break;
  3398. default:
  3399. errors.push(new YAMLSyntaxError(this, "Invalid escape sequence ".concat(src.substr(i - 1, 2))));
  3400. str += '\\' + src[i];
  3401. }
  3402. } else if (ch === ' ' || ch === '\t') {
  3403. // trim trailing whitespace
  3404. var wsStart = i;
  3405. var next = src[i + 1];
  3406. while (next === ' ' || next === '\t') {
  3407. i += 1;
  3408. next = src[i + 1];
  3409. }
  3410. if (next !== '\n') str += i > wsStart ? src.slice(wsStart, i + 1) : ch;
  3411. } else {
  3412. str += ch;
  3413. }
  3414. }
  3415. return errors.length > 0 ? {
  3416. errors: errors,
  3417. str: str
  3418. } : str;
  3419. }
  3420. }], [{
  3421. key: "endOfQuote",
  3422. value: function endOfQuote(src, offset) {
  3423. var ch = src[offset];
  3424. while (ch && ch !== '"') {
  3425. offset += ch === '\\' ? 2 : 1;
  3426. ch = src[offset];
  3427. }
  3428. return offset + 1;
  3429. }
  3430. }]);
  3431. return QuoteDouble;
  3432. }(Node);
  3433. var QuoteSingle = /*#__PURE__*/function (_Node) {
  3434. _inherits(QuoteSingle, _Node);
  3435. var _super = _createSuper(QuoteSingle);
  3436. function QuoteSingle() {
  3437. _classCallCheck(this, QuoteSingle);
  3438. return _super.apply(this, arguments);
  3439. }
  3440. _createClass(QuoteSingle, [{
  3441. key: "parse",
  3442. /**
  3443. * Parses a 'single quoted' value from the source
  3444. *
  3445. * @param {ParseContext} context
  3446. * @param {number} start - Index of first character
  3447. * @returns {number} - Index of the character after this scalar
  3448. */
  3449. value: function parse(context, start) {
  3450. this.context = context;
  3451. var src = context.src;
  3452. var offset = QuoteSingle.endOfQuote(src, start + 1);
  3453. this.valueRange = new Range(start, offset);
  3454. offset = Node.endOfWhiteSpace(src, offset);
  3455. offset = this.parseComment(offset);
  3456. return offset;
  3457. }
  3458. }, {
  3459. key: "strValue",
  3460. /**
  3461. * @returns {string | { str: string, errors: YAMLSyntaxError[] }}
  3462. */
  3463. get: function get() {
  3464. if (!this.valueRange || !this.context) return null;
  3465. var errors = [];
  3466. var _this$valueRange = this.valueRange,
  3467. start = _this$valueRange.start,
  3468. end = _this$valueRange.end;
  3469. var _this$context = this.context,
  3470. indent = _this$context.indent,
  3471. src = _this$context.src;
  3472. if (src[end - 1] !== "'") errors.push(new YAMLSyntaxError(this, "Missing closing 'quote"));
  3473. var str = '';
  3474. for (var i = start + 1; i < end - 1; ++i) {
  3475. var ch = src[i];
  3476. if (ch === '\n') {
  3477. if (Node.atDocumentBoundary(src, i + 1)) errors.push(new YAMLSemanticError(this, 'Document boundary indicators are not allowed within string values'));
  3478. var _Node$foldNewline = Node.foldNewline(src, i, indent),
  3479. fold = _Node$foldNewline.fold,
  3480. offset = _Node$foldNewline.offset,
  3481. error = _Node$foldNewline.error;
  3482. str += fold;
  3483. i = offset;
  3484. if (error) errors.push(new YAMLSemanticError(this, 'Multi-line single-quoted string needs to be sufficiently indented'));
  3485. } else if (ch === "'") {
  3486. str += ch;
  3487. i += 1;
  3488. if (src[i] !== "'") errors.push(new YAMLSyntaxError(this, 'Unescaped single quote? This should not happen.'));
  3489. } else if (ch === ' ' || ch === '\t') {
  3490. // trim trailing whitespace
  3491. var wsStart = i;
  3492. var next = src[i + 1];
  3493. while (next === ' ' || next === '\t') {
  3494. i += 1;
  3495. next = src[i + 1];
  3496. }
  3497. if (next !== '\n') str += i > wsStart ? src.slice(wsStart, i + 1) : ch;
  3498. } else {
  3499. str += ch;
  3500. }
  3501. }
  3502. return errors.length > 0 ? {
  3503. errors: errors,
  3504. str: str
  3505. } : str;
  3506. }
  3507. }], [{
  3508. key: "endOfQuote",
  3509. value: function endOfQuote(src, offset) {
  3510. var ch = src[offset];
  3511. while (ch) {
  3512. if (ch === "'") {
  3513. if (src[offset + 1] !== "'") break;
  3514. ch = src[offset += 2];
  3515. } else {
  3516. ch = src[offset += 1];
  3517. }
  3518. }
  3519. return offset + 1;
  3520. }
  3521. }]);
  3522. return QuoteSingle;
  3523. }(Node);
  3524. function createNewNode(type, props) {
  3525. switch (type) {
  3526. case Type.ALIAS:
  3527. return new Alias(type, props);
  3528. case Type.BLOCK_FOLDED:
  3529. case Type.BLOCK_LITERAL:
  3530. return new BlockValue(type, props);
  3531. case Type.FLOW_MAP:
  3532. case Type.FLOW_SEQ:
  3533. return new FlowCollection(type, props);
  3534. case Type.MAP_KEY:
  3535. case Type.MAP_VALUE:
  3536. case Type.SEQ_ITEM:
  3537. return new CollectionItem(type, props);
  3538. case Type.COMMENT:
  3539. case Type.PLAIN:
  3540. return new PlainValue(type, props);
  3541. case Type.QUOTE_DOUBLE:
  3542. return new QuoteDouble(type, props);
  3543. case Type.QUOTE_SINGLE:
  3544. return new QuoteSingle(type, props);
  3545. /* istanbul ignore next */
  3546. default:
  3547. return null;
  3548. // should never happen
  3549. }
  3550. }
  3551. /**
  3552. * @param {boolean} atLineStart - Node starts at beginning of line
  3553. * @param {boolean} inFlow - true if currently in a flow context
  3554. * @param {boolean} inCollection - true if currently in a collection context
  3555. * @param {number} indent - Current level of indentation
  3556. * @param {number} lineStart - Start of the current line
  3557. * @param {Node} parent - The parent of the node
  3558. * @param {string} src - Source of the YAML document
  3559. */
  3560. var ParseContext = /*#__PURE__*/function () {
  3561. _createClass(ParseContext, null, [{
  3562. key: "parseType",
  3563. value: function parseType(src, offset, inFlow) {
  3564. switch (src[offset]) {
  3565. case '*':
  3566. return Type.ALIAS;
  3567. case '>':
  3568. return Type.BLOCK_FOLDED;
  3569. case '|':
  3570. return Type.BLOCK_LITERAL;
  3571. case '{':
  3572. return Type.FLOW_MAP;
  3573. case '[':
  3574. return Type.FLOW_SEQ;
  3575. case '?':
  3576. return !inFlow && Node.atBlank(src, offset + 1, true) ? Type.MAP_KEY : Type.PLAIN;
  3577. case ':':
  3578. return !inFlow && Node.atBlank(src, offset + 1, true) ? Type.MAP_VALUE : Type.PLAIN;
  3579. case '-':
  3580. return !inFlow && Node.atBlank(src, offset + 1, true) ? Type.SEQ_ITEM : Type.PLAIN;
  3581. case '"':
  3582. return Type.QUOTE_DOUBLE;
  3583. case "'":
  3584. return Type.QUOTE_SINGLE;
  3585. default:
  3586. return Type.PLAIN;
  3587. }
  3588. }
  3589. }]);
  3590. function ParseContext() {
  3591. var _this = this;
  3592. var orig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  3593. var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  3594. atLineStart = _ref.atLineStart,
  3595. inCollection = _ref.inCollection,
  3596. inFlow = _ref.inFlow,
  3597. indent = _ref.indent,
  3598. lineStart = _ref.lineStart,
  3599. parent = _ref.parent;
  3600. _classCallCheck(this, ParseContext);
  3601. _defineProperty(this, "parseNode", function (overlay, start) {
  3602. if (Node.atDocumentBoundary(_this.src, start)) return null;
  3603. var context = new ParseContext(_this, overlay);
  3604. var _context$parseProps = context.parseProps(start),
  3605. props = _context$parseProps.props,
  3606. type = _context$parseProps.type,
  3607. valueStart = _context$parseProps.valueStart;
  3608. var node = createNewNode(type, props);
  3609. var offset = node.parse(context, valueStart);
  3610. node.range = new Range(start, offset);
  3611. /* istanbul ignore if */
  3612. if (offset <= start) {
  3613. // This should never happen, but if it does, let's make sure to at least
  3614. // step one character forward to avoid a busy loop.
  3615. node.error = new Error("Node#parse consumed no characters");
  3616. node.error.parseEnd = offset;
  3617. node.error.source = node;
  3618. node.range.end = start + 1;
  3619. }
  3620. if (context.nodeStartsCollection(node)) {
  3621. if (!node.error && !context.atLineStart && context.parent.type === Type.DOCUMENT) {
  3622. node.error = new YAMLSyntaxError(node, 'Block collection must not have preceding content here (e.g. directives-end indicator)');
  3623. }
  3624. var collection = new Collection(node);
  3625. offset = collection.parse(new ParseContext(context), offset);
  3626. collection.range = new Range(start, offset);
  3627. return collection;
  3628. }
  3629. return node;
  3630. });
  3631. this.atLineStart = atLineStart != null ? atLineStart : orig.atLineStart || false;
  3632. this.inCollection = inCollection != null ? inCollection : orig.inCollection || false;
  3633. this.inFlow = inFlow != null ? inFlow : orig.inFlow || false;
  3634. this.indent = indent != null ? indent : orig.indent;
  3635. this.lineStart = lineStart != null ? lineStart : orig.lineStart;
  3636. this.parent = parent != null ? parent : orig.parent || {};
  3637. this.root = orig.root;
  3638. this.src = orig.src;
  3639. }
  3640. _createClass(ParseContext, [{
  3641. key: "nodeStartsCollection",
  3642. value: function nodeStartsCollection(node) {
  3643. var inCollection = this.inCollection,
  3644. inFlow = this.inFlow,
  3645. src = this.src;
  3646. if (inCollection || inFlow) return false;
  3647. if (node instanceof CollectionItem) return true; // check for implicit key
  3648. var offset = node.range.end;
  3649. if (src[offset] === '\n' || src[offset - 1] === '\n') return false;
  3650. offset = Node.endOfWhiteSpace(src, offset);
  3651. return src[offset] === ':';
  3652. } // Anchor and tag are before type, which determines the node implementation
  3653. // class; hence this intermediate step.
  3654. }, {
  3655. key: "parseProps",
  3656. value: function parseProps(offset) {
  3657. var inFlow = this.inFlow,
  3658. parent = this.parent,
  3659. src = this.src;
  3660. var props = [];
  3661. var lineHasProps = false;
  3662. offset = this.atLineStart ? Node.endOfIndent(src, offset) : Node.endOfWhiteSpace(src, offset);
  3663. var ch = src[offset];
  3664. while (ch === Char.ANCHOR || ch === Char.COMMENT || ch === Char.TAG || ch === '\n') {
  3665. if (ch === '\n') {
  3666. var lineStart = offset + 1;
  3667. var inEnd = Node.endOfIndent(src, lineStart);
  3668. var indentDiff = inEnd - (lineStart + this.indent);
  3669. var noIndicatorAsIndent = parent.type === Type.SEQ_ITEM && parent.context.atLineStart;
  3670. if (!Node.nextNodeIsIndented(src[inEnd], indentDiff, !noIndicatorAsIndent)) break;
  3671. this.atLineStart = true;
  3672. this.lineStart = lineStart;
  3673. lineHasProps = false;
  3674. offset = inEnd;
  3675. } else if (ch === Char.COMMENT) {
  3676. var end = Node.endOfLine(src, offset + 1);
  3677. props.push(new Range(offset, end));
  3678. offset = end;
  3679. } else {
  3680. var _end = Node.endOfIdentifier(src, offset + 1);
  3681. if (ch === Char.TAG && src[_end] === ',' && /^[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+,\d\d\d\d(-\d\d){0,2}\/\S/.test(src.slice(offset + 1, _end + 13))) {
  3682. // Let's presume we're dealing with a YAML 1.0 domain tag here, rather
  3683. // than an empty but 'foo.bar' private-tagged node in a flow collection
  3684. // followed without whitespace by a plain string starting with a year
  3685. // or date divided by something.
  3686. _end = Node.endOfIdentifier(src, _end + 5);
  3687. }
  3688. props.push(new Range(offset, _end));
  3689. lineHasProps = true;
  3690. offset = Node.endOfWhiteSpace(src, _end);
  3691. }
  3692. ch = src[offset];
  3693. } // '- &a : b' has an anchor on an empty node
  3694. if (lineHasProps && ch === ':' && Node.atBlank(src, offset + 1, true)) offset -= 1;
  3695. var type = ParseContext.parseType(src, offset, inFlow);
  3696. return {
  3697. props: props,
  3698. type: type,
  3699. valueStart: offset
  3700. };
  3701. }
  3702. /**
  3703. * Parses a node from the source
  3704. * @param {ParseContext} overlay
  3705. * @param {number} start - Index of first non-whitespace character for the node
  3706. * @returns {?Node} - null if at a document boundary
  3707. */
  3708. }]);
  3709. return ParseContext;
  3710. }();
  3711. // Published as 'yaml/parse-cst'
  3712. function parse(src) {
  3713. var cr = [];
  3714. if (src.indexOf('\r') !== -1) {
  3715. src = src.replace(/\r\n?/g, function (match, offset) {
  3716. if (match.length > 1) cr.push(offset);
  3717. return '\n';
  3718. });
  3719. }
  3720. var documents = [];
  3721. var offset = 0;
  3722. do {
  3723. var doc = new Document();
  3724. var context = new ParseContext({
  3725. src: src
  3726. });
  3727. offset = doc.parse(context, offset);
  3728. documents.push(doc);
  3729. } while (offset < src.length);
  3730. documents.setOrigRanges = function () {
  3731. if (cr.length === 0) return false;
  3732. for (var i = 1; i < cr.length; ++i) {
  3733. cr[i] -= i;
  3734. }
  3735. var crOffset = 0;
  3736. for (var _i = 0; _i < documents.length; ++_i) {
  3737. crOffset = documents[_i].setOrigRanges(cr, crOffset);
  3738. }
  3739. cr.splice(0, cr.length);
  3740. return true;
  3741. };
  3742. documents.toString = function () {
  3743. return documents.join('...\n');
  3744. };
  3745. return documents;
  3746. }
  3747. function addCommentBefore(str, indent, comment) {
  3748. if (!comment) return str;
  3749. var cc = comment.replace(/[\s\S]^/gm, "$&".concat(indent, "#"));
  3750. return "#".concat(cc, "\n").concat(indent).concat(str);
  3751. }
  3752. function addComment(str, indent, comment) {
  3753. return !comment ? str : comment.indexOf('\n') === -1 ? "".concat(str, " #").concat(comment) : "".concat(str, "\n") + comment.replace(/^/gm, "".concat(indent || '', "#"));
  3754. }
  3755. var Node$1 = function Node() {
  3756. _classCallCheck(this, Node);
  3757. };
  3758. function toJSON(value, arg, ctx) {
  3759. if (Array.isArray(value)) return value.map(function (v, i) {
  3760. return toJSON(v, String(i), ctx);
  3761. });
  3762. if (value && typeof value.toJSON === 'function') {
  3763. var anchor = ctx && ctx.anchors && ctx.anchors.get(value);
  3764. if (anchor) ctx.onCreate = function (res) {
  3765. anchor.res = res;
  3766. delete ctx.onCreate;
  3767. };
  3768. var res = value.toJSON(arg, ctx);
  3769. if (anchor && ctx.onCreate) ctx.onCreate(res);
  3770. return res;
  3771. }
  3772. if ((!ctx || !ctx.keep) && typeof value === 'bigint') return Number(value);
  3773. return value;
  3774. }
  3775. var Scalar = /*#__PURE__*/function (_Node) {
  3776. _inherits(Scalar, _Node);
  3777. var _super = _createSuper(Scalar);
  3778. function Scalar(value) {
  3779. var _this;
  3780. _classCallCheck(this, Scalar);
  3781. _this = _super.call(this);
  3782. _this.value = value;
  3783. return _this;
  3784. }
  3785. _createClass(Scalar, [{
  3786. key: "toJSON",
  3787. value: function toJSON$1(arg, ctx) {
  3788. return ctx && ctx.keep ? this.value : toJSON(this.value, arg, ctx);
  3789. }
  3790. }, {
  3791. key: "toString",
  3792. value: function toString() {
  3793. return String(this.value);
  3794. }
  3795. }]);
  3796. return Scalar;
  3797. }(Node$1);
  3798. function collectionFromPath(schema, path, value) {
  3799. var v = value;
  3800. for (var i = path.length - 1; i >= 0; --i) {
  3801. var k = path[i];
  3802. var o = Number.isInteger(k) && k >= 0 ? [] : {};
  3803. o[k] = v;
  3804. v = o;
  3805. }
  3806. return schema.createNode(v, false);
  3807. } // null, undefined, or an empty non-string iterable (e.g. [])
  3808. var isEmptyPath = function isEmptyPath(path) {
  3809. return path == null || _typeof(path) === 'object' && path[Symbol.iterator]().next().done;
  3810. };
  3811. var Collection$1 = /*#__PURE__*/function (_Node) {
  3812. _inherits(Collection, _Node);
  3813. var _super = _createSuper(Collection);
  3814. function Collection(schema) {
  3815. var _this;
  3816. _classCallCheck(this, Collection);
  3817. _this = _super.call(this);
  3818. _defineProperty(_assertThisInitialized(_this), "items", []);
  3819. _this.schema = schema;
  3820. return _this;
  3821. }
  3822. _createClass(Collection, [{
  3823. key: "addIn",
  3824. value: function addIn(path, value) {
  3825. if (isEmptyPath(path)) this.add(value);else {
  3826. var _path = _toArray(path),
  3827. key = _path[0],
  3828. rest = _path.slice(1);
  3829. var node = this.get(key, true);
  3830. if (node instanceof Collection) node.addIn(rest, value);else if (node === undefined && this.schema) this.set(key, collectionFromPath(this.schema, rest, value));else throw new Error("Expected YAML collection at ".concat(key, ". Remaining path: ").concat(rest));
  3831. }
  3832. }
  3833. }, {
  3834. key: "deleteIn",
  3835. value: function deleteIn(_ref) {
  3836. var _ref2 = _toArray(_ref),
  3837. key = _ref2[0],
  3838. rest = _ref2.slice(1);
  3839. if (rest.length === 0) return this.delete(key);
  3840. var node = this.get(key, true);
  3841. if (node instanceof Collection) return node.deleteIn(rest);else throw new Error("Expected YAML collection at ".concat(key, ". Remaining path: ").concat(rest));
  3842. }
  3843. }, {
  3844. key: "getIn",
  3845. value: function getIn(_ref3, keepScalar) {
  3846. var _ref4 = _toArray(_ref3),
  3847. key = _ref4[0],
  3848. rest = _ref4.slice(1);
  3849. var node = this.get(key, true);
  3850. if (rest.length === 0) return !keepScalar && node instanceof Scalar ? node.value : node;else return node instanceof Collection ? node.getIn(rest, keepScalar) : undefined;
  3851. }
  3852. }, {
  3853. key: "hasAllNullValues",
  3854. value: function hasAllNullValues() {
  3855. return this.items.every(function (node) {
  3856. if (!node || node.type !== 'PAIR') return false;
  3857. var n = node.value;
  3858. return n == null || n instanceof Scalar && n.value == null && !n.commentBefore && !n.comment && !n.tag;
  3859. });
  3860. }
  3861. }, {
  3862. key: "hasIn",
  3863. value: function hasIn(_ref5) {
  3864. var _ref6 = _toArray(_ref5),
  3865. key = _ref6[0],
  3866. rest = _ref6.slice(1);
  3867. if (rest.length === 0) return this.has(key);
  3868. var node = this.get(key, true);
  3869. return node instanceof Collection ? node.hasIn(rest) : false;
  3870. }
  3871. }, {
  3872. key: "setIn",
  3873. value: function setIn(_ref7, value) {
  3874. var _ref8 = _toArray(_ref7),
  3875. key = _ref8[0],
  3876. rest = _ref8.slice(1);
  3877. if (rest.length === 0) {
  3878. this.set(key, value);
  3879. } else {
  3880. var node = this.get(key, true);
  3881. if (node instanceof Collection) node.setIn(rest, value);else if (node === undefined && this.schema) this.set(key, collectionFromPath(this.schema, rest, value));else throw new Error("Expected YAML collection at ".concat(key, ". Remaining path: ").concat(rest));
  3882. }
  3883. } // overridden in implementations
  3884. /* istanbul ignore next */
  3885. }, {
  3886. key: "toJSON",
  3887. value: function toJSON() {
  3888. return null;
  3889. }
  3890. }, {
  3891. key: "toString",
  3892. value: function toString(ctx, _ref9, onComment, onChompKeep) {
  3893. var _this2 = this;
  3894. var blockItem = _ref9.blockItem,
  3895. flowChars = _ref9.flowChars,
  3896. isMap = _ref9.isMap,
  3897. itemIndent = _ref9.itemIndent;
  3898. var _ctx = ctx,
  3899. indent = _ctx.indent,
  3900. indentStep = _ctx.indentStep,
  3901. stringify = _ctx.stringify;
  3902. var inFlow = this.type === Type.FLOW_MAP || this.type === Type.FLOW_SEQ || ctx.inFlow;
  3903. if (inFlow) itemIndent += indentStep;
  3904. var allNullValues = isMap && this.hasAllNullValues();
  3905. ctx = Object.assign({}, ctx, {
  3906. allNullValues: allNullValues,
  3907. indent: itemIndent,
  3908. inFlow: inFlow,
  3909. type: null
  3910. });
  3911. var chompKeep = false;
  3912. var hasItemWithNewLine = false;
  3913. var nodes = this.items.reduce(function (nodes, item, i) {
  3914. var comment;
  3915. if (item) {
  3916. if (!chompKeep && item.spaceBefore) nodes.push({
  3917. type: 'comment',
  3918. str: ''
  3919. });
  3920. if (item.commentBefore) item.commentBefore.match(/^.*$/gm).forEach(function (line) {
  3921. nodes.push({
  3922. type: 'comment',
  3923. str: "#".concat(line)
  3924. });
  3925. });
  3926. if (item.comment) comment = item.comment;
  3927. if (inFlow && (!chompKeep && item.spaceBefore || item.commentBefore || item.comment || item.key && (item.key.commentBefore || item.key.comment) || item.value && (item.value.commentBefore || item.value.comment))) hasItemWithNewLine = true;
  3928. }
  3929. chompKeep = false;
  3930. var str = stringify(item, ctx, function () {
  3931. return comment = null;
  3932. }, function () {
  3933. return chompKeep = true;
  3934. });
  3935. if (inFlow && !hasItemWithNewLine && str.includes('\n')) hasItemWithNewLine = true;
  3936. if (inFlow && i < _this2.items.length - 1) str += ',';
  3937. str = addComment(str, itemIndent, comment);
  3938. if (chompKeep && (comment || inFlow)) chompKeep = false;
  3939. nodes.push({
  3940. type: 'item',
  3941. str: str
  3942. });
  3943. return nodes;
  3944. }, []);
  3945. var str;
  3946. if (nodes.length === 0) {
  3947. str = flowChars.start + flowChars.end;
  3948. } else if (inFlow) {
  3949. var start = flowChars.start,
  3950. end = flowChars.end;
  3951. var strings = nodes.map(function (n) {
  3952. return n.str;
  3953. });
  3954. if (hasItemWithNewLine || strings.reduce(function (sum, str) {
  3955. return sum + str.length + 2;
  3956. }, 2) > Collection.maxFlowStringSingleLineLength) {
  3957. str = start;
  3958. var _iterator = _createForOfIteratorHelper(strings),
  3959. _step;
  3960. try {
  3961. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  3962. var s = _step.value;
  3963. str += s ? "\n".concat(indentStep).concat(indent).concat(s) : '\n';
  3964. }
  3965. } catch (err) {
  3966. _iterator.e(err);
  3967. } finally {
  3968. _iterator.f();
  3969. }
  3970. str += "\n".concat(indent).concat(end);
  3971. } else {
  3972. str = "".concat(start, " ").concat(strings.join(' '), " ").concat(end);
  3973. }
  3974. } else {
  3975. var _strings = nodes.map(blockItem);
  3976. str = _strings.shift();
  3977. var _iterator2 = _createForOfIteratorHelper(_strings),
  3978. _step2;
  3979. try {
  3980. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  3981. var _s = _step2.value;
  3982. str += _s ? "\n".concat(indent).concat(_s) : '\n';
  3983. }
  3984. } catch (err) {
  3985. _iterator2.e(err);
  3986. } finally {
  3987. _iterator2.f();
  3988. }
  3989. }
  3990. if (this.comment) {
  3991. str += '\n' + this.comment.replace(/^/gm, "".concat(indent, "#"));
  3992. if (onComment) onComment();
  3993. } else if (chompKeep && onChompKeep) onChompKeep();
  3994. return str;
  3995. }
  3996. }]);
  3997. return Collection;
  3998. }(Node$1);
  3999. _defineProperty(Collection$1, "maxFlowStringSingleLineLength", 60);
  4000. function asItemIndex(key) {
  4001. var idx = key instanceof Scalar ? key.value : key;
  4002. if (idx && typeof idx === 'string') idx = Number(idx);
  4003. return Number.isInteger(idx) && idx >= 0 ? idx : null;
  4004. }
  4005. var YAMLSeq = /*#__PURE__*/function (_Collection) {
  4006. _inherits(YAMLSeq, _Collection);
  4007. var _super = _createSuper(YAMLSeq);
  4008. function YAMLSeq() {
  4009. _classCallCheck(this, YAMLSeq);
  4010. return _super.apply(this, arguments);
  4011. }
  4012. _createClass(YAMLSeq, [{
  4013. key: "add",
  4014. value: function add(value) {
  4015. this.items.push(value);
  4016. }
  4017. }, {
  4018. key: "delete",
  4019. value: function _delete(key) {
  4020. var idx = asItemIndex(key);
  4021. if (typeof idx !== 'number') return false;
  4022. var del = this.items.splice(idx, 1);
  4023. return del.length > 0;
  4024. }
  4025. }, {
  4026. key: "get",
  4027. value: function get(key, keepScalar) {
  4028. var idx = asItemIndex(key);
  4029. if (typeof idx !== 'number') return undefined;
  4030. var it = this.items[idx];
  4031. return !keepScalar && it instanceof Scalar ? it.value : it;
  4032. }
  4033. }, {
  4034. key: "has",
  4035. value: function has(key) {
  4036. var idx = asItemIndex(key);
  4037. return typeof idx === 'number' && idx < this.items.length;
  4038. }
  4039. }, {
  4040. key: "set",
  4041. value: function set(key, value) {
  4042. var idx = asItemIndex(key);
  4043. if (typeof idx !== 'number') throw new Error("Expected a valid index, not ".concat(key, "."));
  4044. this.items[idx] = value;
  4045. }
  4046. }, {
  4047. key: "toJSON",
  4048. value: function toJSON$1(_, ctx) {
  4049. var seq = [];
  4050. if (ctx && ctx.onCreate) ctx.onCreate(seq);
  4051. var i = 0;
  4052. var _iterator = _createForOfIteratorHelper(this.items),
  4053. _step;
  4054. try {
  4055. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  4056. var item = _step.value;
  4057. seq.push(toJSON(item, String(i++), ctx));
  4058. }
  4059. } catch (err) {
  4060. _iterator.e(err);
  4061. } finally {
  4062. _iterator.f();
  4063. }
  4064. return seq;
  4065. }
  4066. }, {
  4067. key: "toString",
  4068. value: function toString(ctx, onComment, onChompKeep) {
  4069. if (!ctx) return JSON.stringify(this);
  4070. return _get(_getPrototypeOf(YAMLSeq.prototype), "toString", this).call(this, ctx, {
  4071. blockItem: function blockItem(n) {
  4072. return n.type === 'comment' ? n.str : "- ".concat(n.str);
  4073. },
  4074. flowChars: {
  4075. start: '[',
  4076. end: ']'
  4077. },
  4078. isMap: false,
  4079. itemIndent: (ctx.indent || '') + ' '
  4080. }, onComment, onChompKeep);
  4081. }
  4082. }]);
  4083. return YAMLSeq;
  4084. }(Collection$1);
  4085. var stringifyKey = function stringifyKey(key, jsKey, ctx) {
  4086. if (jsKey === null) return '';
  4087. if (_typeof(jsKey) !== 'object') return String(jsKey);
  4088. if (key instanceof Node$1 && ctx && ctx.doc) return key.toString({
  4089. anchors: {},
  4090. doc: ctx.doc,
  4091. indent: '',
  4092. indentStep: ctx.indentStep,
  4093. inFlow: true,
  4094. inStringifyKey: true,
  4095. stringify: ctx.stringify
  4096. });
  4097. return JSON.stringify(jsKey);
  4098. };
  4099. var Pair = /*#__PURE__*/function (_Node) {
  4100. _inherits(Pair, _Node);
  4101. var _super = _createSuper(Pair);
  4102. function Pair(key) {
  4103. var _this;
  4104. var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
  4105. _classCallCheck(this, Pair);
  4106. _this = _super.call(this);
  4107. _this.key = key;
  4108. _this.value = value;
  4109. _this.type = Pair.Type.PAIR;
  4110. return _this;
  4111. }
  4112. _createClass(Pair, [{
  4113. key: "addToJSMap",
  4114. value: function addToJSMap(ctx, map) {
  4115. var key = toJSON(this.key, '', ctx);
  4116. if (map instanceof Map) {
  4117. var value = toJSON(this.value, key, ctx);
  4118. map.set(key, value);
  4119. } else if (map instanceof Set) {
  4120. map.add(key);
  4121. } else {
  4122. var stringKey = stringifyKey(this.key, key, ctx);
  4123. map[stringKey] = toJSON(this.value, stringKey, ctx);
  4124. }
  4125. return map;
  4126. }
  4127. }, {
  4128. key: "toJSON",
  4129. value: function toJSON(_, ctx) {
  4130. var pair = ctx && ctx.mapAsMap ? new Map() : {};
  4131. return this.addToJSMap(ctx, pair);
  4132. }
  4133. }, {
  4134. key: "toString",
  4135. value: function toString(ctx, onComment, onChompKeep) {
  4136. if (!ctx || !ctx.doc) return JSON.stringify(this);
  4137. var _ctx$doc$options = ctx.doc.options,
  4138. indentSize = _ctx$doc$options.indent,
  4139. indentSeq = _ctx$doc$options.indentSeq,
  4140. simpleKeys = _ctx$doc$options.simpleKeys;
  4141. var key = this.key,
  4142. value = this.value;
  4143. var keyComment = key instanceof Node$1 && key.comment;
  4144. if (simpleKeys) {
  4145. if (keyComment) {
  4146. throw new Error('With simple keys, key nodes cannot have comments');
  4147. }
  4148. if (key instanceof Collection$1) {
  4149. var msg = 'With simple keys, collection cannot be used as a key value';
  4150. throw new Error(msg);
  4151. }
  4152. }
  4153. var explicitKey = !simpleKeys && (!key || keyComment || key instanceof Collection$1 || key.type === Type.BLOCK_FOLDED || key.type === Type.BLOCK_LITERAL);
  4154. var _ctx = ctx,
  4155. doc = _ctx.doc,
  4156. indent = _ctx.indent,
  4157. indentStep = _ctx.indentStep,
  4158. stringify = _ctx.stringify;
  4159. ctx = Object.assign({}, ctx, {
  4160. implicitKey: !explicitKey,
  4161. indent: indent + indentStep
  4162. });
  4163. var chompKeep = false;
  4164. var str = stringify(key, ctx, function () {
  4165. return keyComment = null;
  4166. }, function () {
  4167. return chompKeep = true;
  4168. });
  4169. str = addComment(str, ctx.indent, keyComment);
  4170. if (ctx.allNullValues && !simpleKeys) {
  4171. if (this.comment) {
  4172. str = addComment(str, ctx.indent, this.comment);
  4173. if (onComment) onComment();
  4174. } else if (chompKeep && !keyComment && onChompKeep) onChompKeep();
  4175. return ctx.inFlow ? str : "? ".concat(str);
  4176. }
  4177. str = explicitKey ? "? ".concat(str, "\n").concat(indent, ":") : "".concat(str, ":");
  4178. if (this.comment) {
  4179. // expected (but not strictly required) to be a single-line comment
  4180. str = addComment(str, ctx.indent, this.comment);
  4181. if (onComment) onComment();
  4182. }
  4183. var vcb = '';
  4184. var valueComment = null;
  4185. if (value instanceof Node$1) {
  4186. if (value.spaceBefore) vcb = '\n';
  4187. if (value.commentBefore) {
  4188. var cs = value.commentBefore.replace(/^/gm, "".concat(ctx.indent, "#"));
  4189. vcb += "\n".concat(cs);
  4190. }
  4191. valueComment = value.comment;
  4192. } else if (value && _typeof(value) === 'object') {
  4193. value = doc.schema.createNode(value, true);
  4194. }
  4195. ctx.implicitKey = false;
  4196. if (!explicitKey && !this.comment && value instanceof Scalar) ctx.indentAtStart = str.length + 1;
  4197. chompKeep = false;
  4198. if (!indentSeq && indentSize >= 2 && !ctx.inFlow && !explicitKey && value instanceof YAMLSeq && value.type !== Type.FLOW_SEQ && !value.tag && !doc.anchors.getName(value)) {
  4199. // If indentSeq === false, consider '- ' as part of indentation where possible
  4200. ctx.indent = ctx.indent.substr(2);
  4201. }
  4202. var valueStr = stringify(value, ctx, function () {
  4203. return valueComment = null;
  4204. }, function () {
  4205. return chompKeep = true;
  4206. });
  4207. var ws = ' ';
  4208. if (vcb || this.comment) {
  4209. ws = "".concat(vcb, "\n").concat(ctx.indent);
  4210. } else if (!explicitKey && value instanceof Collection$1) {
  4211. var flow = valueStr[0] === '[' || valueStr[0] === '{';
  4212. if (!flow || valueStr.includes('\n')) ws = "\n".concat(ctx.indent);
  4213. }
  4214. if (chompKeep && !valueComment && onChompKeep) onChompKeep();
  4215. return addComment(str + ws + valueStr, ctx.indent, valueComment);
  4216. }
  4217. }, {
  4218. key: "commentBefore",
  4219. get: function get() {
  4220. return this.key instanceof Node$1 ? this.key.commentBefore : undefined;
  4221. },
  4222. set: function set(cb) {
  4223. if (this.key == null) this.key = new Scalar(null);
  4224. if (this.key instanceof Node$1) this.key.commentBefore = cb;else {
  4225. var msg = 'Pair.commentBefore is an alias for Pair.key.commentBefore. To set it, the key must be a Node.';
  4226. throw new Error(msg);
  4227. }
  4228. }
  4229. }]);
  4230. return Pair;
  4231. }(Node$1);
  4232. _defineProperty(Pair, "Type", {
  4233. PAIR: 'PAIR',
  4234. MERGE_PAIR: 'MERGE_PAIR'
  4235. });
  4236. var getAliasCount = function getAliasCount(node, anchors) {
  4237. if (node instanceof Alias$1) {
  4238. var anchor = anchors.get(node.source);
  4239. return anchor.count * anchor.aliasCount;
  4240. } else if (node instanceof Collection$1) {
  4241. var count = 0;
  4242. var _iterator = _createForOfIteratorHelper(node.items),
  4243. _step;
  4244. try {
  4245. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  4246. var item = _step.value;
  4247. var c = getAliasCount(item, anchors);
  4248. if (c > count) count = c;
  4249. }
  4250. } catch (err) {
  4251. _iterator.e(err);
  4252. } finally {
  4253. _iterator.f();
  4254. }
  4255. return count;
  4256. } else if (node instanceof Pair) {
  4257. var kc = getAliasCount(node.key, anchors);
  4258. var vc = getAliasCount(node.value, anchors);
  4259. return Math.max(kc, vc);
  4260. }
  4261. return 1;
  4262. };
  4263. var Alias$1 = /*#__PURE__*/function (_Node) {
  4264. _inherits(Alias, _Node);
  4265. var _super = _createSuper(Alias);
  4266. _createClass(Alias, null, [{
  4267. key: "stringify",
  4268. value: function stringify(_ref, _ref2) {
  4269. var range = _ref.range,
  4270. source = _ref.source;
  4271. var anchors = _ref2.anchors,
  4272. doc = _ref2.doc,
  4273. implicitKey = _ref2.implicitKey,
  4274. inStringifyKey = _ref2.inStringifyKey;
  4275. var anchor = Object.keys(anchors).find(function (a) {
  4276. return anchors[a] === source;
  4277. });
  4278. if (!anchor && inStringifyKey) anchor = doc.anchors.getName(source) || doc.anchors.newName();
  4279. if (anchor) return "*".concat(anchor).concat(implicitKey ? ' ' : '');
  4280. var msg = doc.anchors.getName(source) ? 'Alias node must be after source node' : 'Source node not found for alias node';
  4281. throw new Error("".concat(msg, " [").concat(range, "]"));
  4282. }
  4283. }]);
  4284. function Alias(source) {
  4285. var _this;
  4286. _classCallCheck(this, Alias);
  4287. _this = _super.call(this);
  4288. _this.source = source;
  4289. _this.type = Type.ALIAS;
  4290. return _this;
  4291. }
  4292. _createClass(Alias, [{
  4293. key: "toJSON",
  4294. value: function toJSON$1(arg, ctx) {
  4295. if (!ctx) return toJSON(this.source, arg, ctx);
  4296. var anchors = ctx.anchors,
  4297. maxAliasCount = ctx.maxAliasCount;
  4298. var anchor = anchors.get(this.source);
  4299. /* istanbul ignore if */
  4300. if (!anchor || anchor.res === undefined) {
  4301. var msg = 'This should not happen: Alias anchor was not resolved?';
  4302. if (this.cstNode) throw new YAMLReferenceError(this.cstNode, msg);else throw new ReferenceError(msg);
  4303. }
  4304. if (maxAliasCount >= 0) {
  4305. anchor.count += 1;
  4306. if (anchor.aliasCount === 0) anchor.aliasCount = getAliasCount(this.source, anchors);
  4307. if (anchor.count * anchor.aliasCount > maxAliasCount) {
  4308. var _msg = 'Excessive alias count indicates a resource exhaustion attack';
  4309. if (this.cstNode) throw new YAMLReferenceError(this.cstNode, _msg);else throw new ReferenceError(_msg);
  4310. }
  4311. }
  4312. return anchor.res;
  4313. } // Only called when stringifying an alias mapping key while constructing
  4314. // Object output.
  4315. }, {
  4316. key: "toString",
  4317. value: function toString(ctx) {
  4318. return Alias.stringify(this, ctx);
  4319. }
  4320. }, {
  4321. key: "tag",
  4322. set: function set(t) {
  4323. throw new Error('Alias nodes cannot have tags');
  4324. }
  4325. }]);
  4326. return Alias;
  4327. }(Node$1);
  4328. _defineProperty(Alias$1, "default", true);
  4329. function findPair(items, key) {
  4330. var k = key instanceof Scalar ? key.value : key;
  4331. var _iterator = _createForOfIteratorHelper(items),
  4332. _step;
  4333. try {
  4334. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  4335. var it = _step.value;
  4336. if (it instanceof Pair) {
  4337. if (it.key === key || it.key === k) return it;
  4338. if (it.key && it.key.value === k) return it;
  4339. }
  4340. }
  4341. } catch (err) {
  4342. _iterator.e(err);
  4343. } finally {
  4344. _iterator.f();
  4345. }
  4346. return undefined;
  4347. }
  4348. var YAMLMap = /*#__PURE__*/function (_Collection) {
  4349. _inherits(YAMLMap, _Collection);
  4350. var _super = _createSuper(YAMLMap);
  4351. function YAMLMap() {
  4352. _classCallCheck(this, YAMLMap);
  4353. return _super.apply(this, arguments);
  4354. }
  4355. _createClass(YAMLMap, [{
  4356. key: "add",
  4357. value: function add(pair, overwrite) {
  4358. if (!pair) pair = new Pair(pair);else if (!(pair instanceof Pair)) pair = new Pair(pair.key || pair, pair.value);
  4359. var prev = findPair(this.items, pair.key);
  4360. var sortEntries = this.schema && this.schema.sortMapEntries;
  4361. if (prev) {
  4362. if (overwrite) prev.value = pair.value;else throw new Error("Key ".concat(pair.key, " already set"));
  4363. } else if (sortEntries) {
  4364. var i = this.items.findIndex(function (item) {
  4365. return sortEntries(pair, item) < 0;
  4366. });
  4367. if (i === -1) this.items.push(pair);else this.items.splice(i, 0, pair);
  4368. } else {
  4369. this.items.push(pair);
  4370. }
  4371. }
  4372. }, {
  4373. key: "delete",
  4374. value: function _delete(key) {
  4375. var it = findPair(this.items, key);
  4376. if (!it) return false;
  4377. var del = this.items.splice(this.items.indexOf(it), 1);
  4378. return del.length > 0;
  4379. }
  4380. }, {
  4381. key: "get",
  4382. value: function get(key, keepScalar) {
  4383. var it = findPair(this.items, key);
  4384. var node = it && it.value;
  4385. return !keepScalar && node instanceof Scalar ? node.value : node;
  4386. }
  4387. }, {
  4388. key: "has",
  4389. value: function has(key) {
  4390. return !!findPair(this.items, key);
  4391. }
  4392. }, {
  4393. key: "set",
  4394. value: function set(key, value) {
  4395. this.add(new Pair(key, value), true);
  4396. }
  4397. /**
  4398. * @param {*} arg ignored
  4399. * @param {*} ctx Conversion context, originally set in Document#toJSON()
  4400. * @param {Class} Type If set, forces the returned collection type
  4401. * @returns {*} Instance of Type, Map, or Object
  4402. */
  4403. }, {
  4404. key: "toJSON",
  4405. value: function toJSON(_, ctx, Type) {
  4406. var map = Type ? new Type() : ctx && ctx.mapAsMap ? new Map() : {};
  4407. if (ctx && ctx.onCreate) ctx.onCreate(map);
  4408. var _iterator2 = _createForOfIteratorHelper(this.items),
  4409. _step2;
  4410. try {
  4411. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  4412. var item = _step2.value;
  4413. item.addToJSMap(ctx, map);
  4414. }
  4415. } catch (err) {
  4416. _iterator2.e(err);
  4417. } finally {
  4418. _iterator2.f();
  4419. }
  4420. return map;
  4421. }
  4422. }, {
  4423. key: "toString",
  4424. value: function toString(ctx, onComment, onChompKeep) {
  4425. if (!ctx) return JSON.stringify(this);
  4426. var _iterator3 = _createForOfIteratorHelper(this.items),
  4427. _step3;
  4428. try {
  4429. for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
  4430. var item = _step3.value;
  4431. if (!(item instanceof Pair)) throw new Error("Map items must all be pairs; found ".concat(JSON.stringify(item), " instead"));
  4432. }
  4433. } catch (err) {
  4434. _iterator3.e(err);
  4435. } finally {
  4436. _iterator3.f();
  4437. }
  4438. return _get(_getPrototypeOf(YAMLMap.prototype), "toString", this).call(this, ctx, {
  4439. blockItem: function blockItem(n) {
  4440. return n.str;
  4441. },
  4442. flowChars: {
  4443. start: '{',
  4444. end: '}'
  4445. },
  4446. isMap: true,
  4447. itemIndent: ctx.indent || ''
  4448. }, onComment, onChompKeep);
  4449. }
  4450. }]);
  4451. return YAMLMap;
  4452. }(Collection$1);
  4453. var MERGE_KEY = '<<';
  4454. var Merge = /*#__PURE__*/function (_Pair) {
  4455. _inherits(Merge, _Pair);
  4456. var _super = _createSuper(Merge);
  4457. function Merge(pair) {
  4458. var _this;
  4459. _classCallCheck(this, Merge);
  4460. if (pair instanceof Pair) {
  4461. var seq = pair.value;
  4462. if (!(seq instanceof YAMLSeq)) {
  4463. seq = new YAMLSeq();
  4464. seq.items.push(pair.value);
  4465. seq.range = pair.value.range;
  4466. }
  4467. _this = _super.call(this, pair.key, seq);
  4468. _this.range = pair.range;
  4469. } else {
  4470. _this = _super.call(this, new Scalar(MERGE_KEY), new YAMLSeq());
  4471. }
  4472. _this.type = Pair.Type.MERGE_PAIR;
  4473. return _possibleConstructorReturn(_this);
  4474. } // If the value associated with a merge key is a single mapping node, each of
  4475. // its key/value pairs is inserted into the current mapping, unless the key
  4476. // already exists in it. If the value associated with the merge key is a
  4477. // sequence, then this sequence is expected to contain mapping nodes and each
  4478. // of these nodes is merged in turn according to its order in the sequence.
  4479. // Keys in mapping nodes earlier in the sequence override keys specified in
  4480. // later mapping nodes. -- http://yaml.org/type/merge.html
  4481. _createClass(Merge, [{
  4482. key: "addToJSMap",
  4483. value: function addToJSMap(ctx, map) {
  4484. var _iterator = _createForOfIteratorHelper(this.value.items),
  4485. _step;
  4486. try {
  4487. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  4488. var source = _step.value.source;
  4489. if (!(source instanceof YAMLMap)) throw new Error('Merge sources must be maps');
  4490. var srcMap = source.toJSON(null, ctx, Map);
  4491. var _iterator2 = _createForOfIteratorHelper(srcMap),
  4492. _step2;
  4493. try {
  4494. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  4495. var _step2$value = _slicedToArray(_step2.value, 2),
  4496. key = _step2$value[0],
  4497. value = _step2$value[1];
  4498. if (map instanceof Map) {
  4499. if (!map.has(key)) map.set(key, value);
  4500. } else if (map instanceof Set) {
  4501. map.add(key);
  4502. } else {
  4503. if (!Object.prototype.hasOwnProperty.call(map, key)) map[key] = value;
  4504. }
  4505. }
  4506. } catch (err) {
  4507. _iterator2.e(err);
  4508. } finally {
  4509. _iterator2.f();
  4510. }
  4511. }
  4512. } catch (err) {
  4513. _iterator.e(err);
  4514. } finally {
  4515. _iterator.f();
  4516. }
  4517. return map;
  4518. }
  4519. }, {
  4520. key: "toString",
  4521. value: function toString(ctx, onComment) {
  4522. var seq = this.value;
  4523. if (seq.items.length > 1) return _get(_getPrototypeOf(Merge.prototype), "toString", this).call(this, ctx, onComment);
  4524. this.value = seq.items[0];
  4525. var str = _get(_getPrototypeOf(Merge.prototype), "toString", this).call(this, ctx, onComment);
  4526. this.value = seq;
  4527. return str;
  4528. }
  4529. }]);
  4530. return Merge;
  4531. }(Pair);
  4532. var binaryOptions = {
  4533. defaultType: Type.BLOCK_LITERAL,
  4534. lineWidth: 76
  4535. };
  4536. var boolOptions = {
  4537. trueStr: 'true',
  4538. falseStr: 'false'
  4539. };
  4540. var intOptions = {
  4541. asBigInt: false
  4542. };
  4543. var nullOptions = {
  4544. nullStr: 'null'
  4545. };
  4546. var strOptions = {
  4547. defaultType: Type.PLAIN,
  4548. doubleQuoted: {
  4549. jsonEncoding: false,
  4550. minMultiLineLength: 40
  4551. },
  4552. fold: {
  4553. lineWidth: 80,
  4554. minContentWidth: 20
  4555. }
  4556. };
  4557. function resolveScalar(str, tags, scalarFallback) {
  4558. var _iterator = _createForOfIteratorHelper(tags),
  4559. _step;
  4560. try {
  4561. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  4562. var _step$value = _step.value,
  4563. format = _step$value.format,
  4564. test = _step$value.test,
  4565. resolve = _step$value.resolve;
  4566. if (test) {
  4567. var match = str.match(test);
  4568. if (match) {
  4569. var res = resolve.apply(null, match);
  4570. if (!(res instanceof Scalar)) res = new Scalar(res);
  4571. if (format) res.format = format;
  4572. return res;
  4573. }
  4574. }
  4575. }
  4576. } catch (err) {
  4577. _iterator.e(err);
  4578. } finally {
  4579. _iterator.f();
  4580. }
  4581. if (scalarFallback) str = scalarFallback(str);
  4582. return new Scalar(str);
  4583. }
  4584. var FOLD_FLOW = 'flow';
  4585. var FOLD_BLOCK = 'block';
  4586. var FOLD_QUOTED = 'quoted'; // presumes i+1 is at the start of a line
  4587. // returns index of last newline in more-indented block
  4588. var consumeMoreIndentedLines = function consumeMoreIndentedLines(text, i) {
  4589. var ch = text[i + 1];
  4590. while (ch === ' ' || ch === '\t') {
  4591. do {
  4592. ch = text[i += 1];
  4593. } while (ch && ch !== '\n');
  4594. ch = text[i + 1];
  4595. }
  4596. return i;
  4597. };
  4598. /**
  4599. * Tries to keep input at up to `lineWidth` characters, splitting only on spaces
  4600. * not followed by newlines or spaces unless `mode` is `'quoted'`. Lines are
  4601. * terminated with `\n` and started with `indent`.
  4602. *
  4603. * @param {string} text
  4604. * @param {string} indent
  4605. * @param {string} [mode='flow'] `'block'` prevents more-indented lines
  4606. * from being folded; `'quoted'` allows for `\` escapes, including escaped
  4607. * newlines
  4608. * @param {Object} options
  4609. * @param {number} [options.indentAtStart] Accounts for leading contents on
  4610. * the first line, defaulting to `indent.length`
  4611. * @param {number} [options.lineWidth=80]
  4612. * @param {number} [options.minContentWidth=20] Allow highly indented lines to
  4613. * stretch the line width
  4614. * @param {function} options.onFold Called once if the text is folded
  4615. * @param {function} options.onFold Called once if any line of text exceeds
  4616. * lineWidth characters
  4617. */
  4618. function foldFlowLines(text, indent, mode, _ref) {
  4619. var indentAtStart = _ref.indentAtStart,
  4620. _ref$lineWidth = _ref.lineWidth,
  4621. lineWidth = _ref$lineWidth === void 0 ? 80 : _ref$lineWidth,
  4622. _ref$minContentWidth = _ref.minContentWidth,
  4623. minContentWidth = _ref$minContentWidth === void 0 ? 20 : _ref$minContentWidth,
  4624. onFold = _ref.onFold,
  4625. onOverflow = _ref.onOverflow;
  4626. if (!lineWidth || lineWidth < 0) return text;
  4627. var endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length);
  4628. if (text.length <= endStep) return text;
  4629. var folds = [];
  4630. var escapedFolds = {};
  4631. var end = lineWidth - (typeof indentAtStart === 'number' ? indentAtStart : indent.length);
  4632. var split = undefined;
  4633. var prev = undefined;
  4634. var overflow = false;
  4635. var i = -1;
  4636. if (mode === FOLD_BLOCK) {
  4637. i = consumeMoreIndentedLines(text, i);
  4638. if (i !== -1) end = i + endStep;
  4639. }
  4640. for (var ch; ch = text[i += 1];) {
  4641. if (mode === FOLD_QUOTED && ch === '\\') {
  4642. switch (text[i + 1]) {
  4643. case 'x':
  4644. i += 3;
  4645. break;
  4646. case 'u':
  4647. i += 5;
  4648. break;
  4649. case 'U':
  4650. i += 9;
  4651. break;
  4652. default:
  4653. i += 1;
  4654. }
  4655. }
  4656. if (ch === '\n') {
  4657. if (mode === FOLD_BLOCK) i = consumeMoreIndentedLines(text, i);
  4658. end = i + endStep;
  4659. split = undefined;
  4660. } else {
  4661. if (ch === ' ' && prev && prev !== ' ' && prev !== '\n' && prev !== '\t') {
  4662. // space surrounded by non-space can be replaced with newline + indent
  4663. var next = text[i + 1];
  4664. if (next && next !== ' ' && next !== '\n' && next !== '\t') split = i;
  4665. }
  4666. if (i >= end) {
  4667. if (split) {
  4668. folds.push(split);
  4669. end = split + endStep;
  4670. split = undefined;
  4671. } else if (mode === FOLD_QUOTED) {
  4672. // white-space collected at end may stretch past lineWidth
  4673. while (prev === ' ' || prev === '\t') {
  4674. prev = ch;
  4675. ch = text[i += 1];
  4676. overflow = true;
  4677. } // i - 2 accounts for not-dropped last char + newline-escaping \
  4678. folds.push(i - 2);
  4679. escapedFolds[i - 2] = true;
  4680. end = i - 2 + endStep;
  4681. split = undefined;
  4682. } else {
  4683. overflow = true;
  4684. }
  4685. }
  4686. }
  4687. prev = ch;
  4688. }
  4689. if (overflow && onOverflow) onOverflow();
  4690. if (folds.length === 0) return text;
  4691. if (onFold) onFold();
  4692. var res = text.slice(0, folds[0]);
  4693. for (var _i = 0; _i < folds.length; ++_i) {
  4694. var fold = folds[_i];
  4695. var _end = folds[_i + 1] || text.length;
  4696. if (mode === FOLD_QUOTED && escapedFolds[fold]) res += "".concat(text[fold], "\\");
  4697. res += "\n".concat(indent).concat(text.slice(fold + 1, _end));
  4698. }
  4699. return res;
  4700. }
  4701. var getFoldOptions = function getFoldOptions(_ref) {
  4702. var indentAtStart = _ref.indentAtStart;
  4703. return indentAtStart ? Object.assign({
  4704. indentAtStart: indentAtStart
  4705. }, strOptions.fold) : strOptions.fold;
  4706. }; // Also checks for lines starting with %, as parsing the output as YAML 1.1 will
  4707. // presume that's starting a new document.
  4708. var containsDocumentMarker = function containsDocumentMarker(str) {
  4709. return /^(%|---|\.\.\.)/m.test(str);
  4710. };
  4711. function lineLengthOverLimit(str, limit) {
  4712. var strLen = str.length;
  4713. if (strLen <= limit) return false;
  4714. for (var i = 0, start = 0; i < strLen; ++i) {
  4715. if (str[i] === '\n') {
  4716. if (i - start > limit) return true;
  4717. start = i + 1;
  4718. if (strLen - start <= limit) return false;
  4719. }
  4720. }
  4721. return true;
  4722. }
  4723. function doubleQuotedString(value, ctx) {
  4724. var implicitKey = ctx.implicitKey;
  4725. var _strOptions$doubleQuo = strOptions.doubleQuoted,
  4726. jsonEncoding = _strOptions$doubleQuo.jsonEncoding,
  4727. minMultiLineLength = _strOptions$doubleQuo.minMultiLineLength;
  4728. var json = JSON.stringify(value);
  4729. if (jsonEncoding) return json;
  4730. var indent = ctx.indent || (containsDocumentMarker(value) ? ' ' : '');
  4731. var str = '';
  4732. var start = 0;
  4733. for (var i = 0, ch = json[i]; ch; ch = json[++i]) {
  4734. if (ch === ' ' && json[i + 1] === '\\' && json[i + 2] === 'n') {
  4735. // space before newline needs to be escaped to not be folded
  4736. str += json.slice(start, i) + '\\ ';
  4737. i += 1;
  4738. start = i;
  4739. ch = '\\';
  4740. }
  4741. if (ch === '\\') switch (json[i + 1]) {
  4742. case 'u':
  4743. {
  4744. str += json.slice(start, i);
  4745. var code = json.substr(i + 2, 4);
  4746. switch (code) {
  4747. case '0000':
  4748. str += '\\0';
  4749. break;
  4750. case '0007':
  4751. str += '\\a';
  4752. break;
  4753. case '000b':
  4754. str += '\\v';
  4755. break;
  4756. case '001b':
  4757. str += '\\e';
  4758. break;
  4759. case '0085':
  4760. str += '\\N';
  4761. break;
  4762. case '00a0':
  4763. str += '\\_';
  4764. break;
  4765. case '2028':
  4766. str += '\\L';
  4767. break;
  4768. case '2029':
  4769. str += '\\P';
  4770. break;
  4771. default:
  4772. if (code.substr(0, 2) === '00') str += '\\x' + code.substr(2);else str += json.substr(i, 6);
  4773. }
  4774. i += 5;
  4775. start = i + 1;
  4776. }
  4777. break;
  4778. case 'n':
  4779. if (implicitKey || json[i + 2] === '"' || json.length < minMultiLineLength) {
  4780. i += 1;
  4781. } else {
  4782. // folding will eat first newline
  4783. str += json.slice(start, i) + '\n\n';
  4784. while (json[i + 2] === '\\' && json[i + 3] === 'n' && json[i + 4] !== '"') {
  4785. str += '\n';
  4786. i += 2;
  4787. }
  4788. str += indent; // space after newline needs to be escaped to not be folded
  4789. if (json[i + 2] === ' ') str += '\\';
  4790. i += 1;
  4791. start = i + 1;
  4792. }
  4793. break;
  4794. default:
  4795. i += 1;
  4796. }
  4797. }
  4798. str = start ? str + json.slice(start) : json;
  4799. return implicitKey ? str : foldFlowLines(str, indent, FOLD_QUOTED, getFoldOptions(ctx));
  4800. }
  4801. function singleQuotedString(value, ctx) {
  4802. if (ctx.implicitKey) {
  4803. if (/\n/.test(value)) return doubleQuotedString(value, ctx);
  4804. } else {
  4805. // single quoted string can't have leading or trailing whitespace around newline
  4806. if (/[ \t]\n|\n[ \t]/.test(value)) return doubleQuotedString(value, ctx);
  4807. }
  4808. var indent = ctx.indent || (containsDocumentMarker(value) ? ' ' : '');
  4809. var res = "'" + value.replace(/'/g, "''").replace(/\n+/g, "$&\n".concat(indent)) + "'";
  4810. return ctx.implicitKey ? res : foldFlowLines(res, indent, FOLD_FLOW, getFoldOptions(ctx));
  4811. }
  4812. function blockString(_ref2, ctx, onComment, onChompKeep) {
  4813. var comment = _ref2.comment,
  4814. type = _ref2.type,
  4815. value = _ref2.value;
  4816. // 1. Block can't end in whitespace unless the last line is non-empty.
  4817. // 2. Strings consisting of only whitespace are best rendered explicitly.
  4818. if (/\n[\t ]+$/.test(value) || /^\s*$/.test(value)) {
  4819. return doubleQuotedString(value, ctx);
  4820. }
  4821. var indent = ctx.indent || (ctx.forceBlockIndent || containsDocumentMarker(value) ? ' ' : '');
  4822. var indentSize = indent ? '2' : '1'; // root is at -1
  4823. var literal = type === Type.BLOCK_FOLDED ? false : type === Type.BLOCK_LITERAL ? true : !lineLengthOverLimit(value, strOptions.fold.lineWidth - indent.length);
  4824. var header = literal ? '|' : '>';
  4825. if (!value) return header + '\n';
  4826. var wsStart = '';
  4827. var wsEnd = '';
  4828. value = value.replace(/[\n\t ]*$/, function (ws) {
  4829. var n = ws.indexOf('\n');
  4830. if (n === -1) {
  4831. header += '-'; // strip
  4832. } else if (value === ws || n !== ws.length - 1) {
  4833. header += '+'; // keep
  4834. if (onChompKeep) onChompKeep();
  4835. }
  4836. wsEnd = ws.replace(/\n$/, '');
  4837. return '';
  4838. }).replace(/^[\n ]*/, function (ws) {
  4839. if (ws.indexOf(' ') !== -1) header += indentSize;
  4840. var m = ws.match(/ +$/);
  4841. if (m) {
  4842. wsStart = ws.slice(0, -m[0].length);
  4843. return m[0];
  4844. } else {
  4845. wsStart = ws;
  4846. return '';
  4847. }
  4848. });
  4849. if (wsEnd) wsEnd = wsEnd.replace(/\n+(?!\n|$)/g, "$&".concat(indent));
  4850. if (wsStart) wsStart = wsStart.replace(/\n+/g, "$&".concat(indent));
  4851. if (comment) {
  4852. header += ' #' + comment.replace(/ ?[\r\n]+/g, ' ');
  4853. if (onComment) onComment();
  4854. }
  4855. if (!value) return "".concat(header).concat(indentSize, "\n").concat(indent).concat(wsEnd);
  4856. if (literal) {
  4857. value = value.replace(/\n+/g, "$&".concat(indent));
  4858. return "".concat(header, "\n").concat(indent).concat(wsStart).concat(value).concat(wsEnd);
  4859. }
  4860. value = value.replace(/\n+/g, '\n$&').replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g, '$1$2') // more-indented lines aren't folded
  4861. // ^ ind.line ^ empty ^ capture next empty lines only at end of indent
  4862. .replace(/\n+/g, "$&".concat(indent));
  4863. var body = foldFlowLines("".concat(wsStart).concat(value).concat(wsEnd), indent, FOLD_BLOCK, strOptions.fold);
  4864. return "".concat(header, "\n").concat(indent).concat(body);
  4865. }
  4866. function plainString(item, ctx, onComment, onChompKeep) {
  4867. var comment = item.comment,
  4868. type = item.type,
  4869. value = item.value;
  4870. var actualString = ctx.actualString,
  4871. implicitKey = ctx.implicitKey,
  4872. indent = ctx.indent,
  4873. inFlow = ctx.inFlow;
  4874. if (implicitKey && /[\n[\]{},]/.test(value) || inFlow && /[[\]{},]/.test(value)) {
  4875. return doubleQuotedString(value, ctx);
  4876. }
  4877. if (!value || /^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(value)) {
  4878. // not allowed:
  4879. // - empty string, '-' or '?'
  4880. // - start with an indicator character (except [?:-]) or /[?-] /
  4881. // - '\n ', ': ' or ' \n' anywhere
  4882. // - '#' not preceded by a non-space char
  4883. // - end with ' ' or ':'
  4884. return implicitKey || inFlow || value.indexOf('\n') === -1 ? value.indexOf('"') !== -1 && value.indexOf("'") === -1 ? singleQuotedString(value, ctx) : doubleQuotedString(value, ctx) : blockString(item, ctx, onComment, onChompKeep);
  4885. }
  4886. if (!implicitKey && !inFlow && type !== Type.PLAIN && value.indexOf('\n') !== -1) {
  4887. // Where allowed & type not set explicitly, prefer block style for multiline strings
  4888. return blockString(item, ctx, onComment, onChompKeep);
  4889. }
  4890. if (indent === '' && containsDocumentMarker(value)) {
  4891. ctx.forceBlockIndent = true;
  4892. return blockString(item, ctx, onComment, onChompKeep);
  4893. }
  4894. var str = value.replace(/\n+/g, "$&\n".concat(indent)); // Verify that output will be parsed as a string, as e.g. plain numbers and
  4895. // booleans get parsed with those types in v1.2 (e.g. '42', 'true' & '0.9e-3'),
  4896. // and others in v1.1.
  4897. if (actualString) {
  4898. var tags = ctx.doc.schema.tags;
  4899. var resolved = resolveScalar(str, tags, tags.scalarFallback).value;
  4900. if (typeof resolved !== 'string') return doubleQuotedString(value, ctx);
  4901. }
  4902. var body = implicitKey ? str : foldFlowLines(str, indent, FOLD_FLOW, getFoldOptions(ctx));
  4903. if (comment && !inFlow && (body.indexOf('\n') !== -1 || comment.indexOf('\n') !== -1)) {
  4904. if (onComment) onComment();
  4905. return addCommentBefore(body, indent, comment);
  4906. }
  4907. return body;
  4908. }
  4909. function stringifyString(item, ctx, onComment, onChompKeep) {
  4910. var defaultType = strOptions.defaultType;
  4911. var implicitKey = ctx.implicitKey,
  4912. inFlow = ctx.inFlow;
  4913. var _item = item,
  4914. type = _item.type,
  4915. value = _item.value;
  4916. if (typeof value !== 'string') {
  4917. value = String(value);
  4918. item = Object.assign({}, item, {
  4919. value: value
  4920. });
  4921. }
  4922. var _stringify = function _stringify(_type) {
  4923. switch (_type) {
  4924. case Type.BLOCK_FOLDED:
  4925. case Type.BLOCK_LITERAL:
  4926. return blockString(item, ctx, onComment, onChompKeep);
  4927. case Type.QUOTE_DOUBLE:
  4928. return doubleQuotedString(value, ctx);
  4929. case Type.QUOTE_SINGLE:
  4930. return singleQuotedString(value, ctx);
  4931. case Type.PLAIN:
  4932. return plainString(item, ctx, onComment, onChompKeep);
  4933. default:
  4934. return null;
  4935. }
  4936. };
  4937. if (type !== Type.QUOTE_DOUBLE && /[\x00-\x08\x0b-\x1f\x7f-\x9f]/.test(value)) {
  4938. // force double quotes on control characters
  4939. type = Type.QUOTE_DOUBLE;
  4940. } else if ((implicitKey || inFlow) && (type === Type.BLOCK_FOLDED || type === Type.BLOCK_LITERAL)) {
  4941. // should not happen; blocks are not valid inside flow containers
  4942. type = Type.QUOTE_DOUBLE;
  4943. }
  4944. var res = _stringify(type);
  4945. if (res === null) {
  4946. res = _stringify(defaultType);
  4947. if (res === null) throw new Error("Unsupported default string type ".concat(defaultType));
  4948. }
  4949. return res;
  4950. }
  4951. function stringifyNumber(_ref) {
  4952. var format = _ref.format,
  4953. minFractionDigits = _ref.minFractionDigits,
  4954. tag = _ref.tag,
  4955. value = _ref.value;
  4956. if (typeof value === 'bigint') return String(value);
  4957. if (!isFinite(value)) return isNaN(value) ? '.nan' : value < 0 ? '-.inf' : '.inf';
  4958. var n = JSON.stringify(value);
  4959. if (!format && minFractionDigits && (!tag || tag === 'tag:yaml.org,2002:float') && /^\d/.test(n)) {
  4960. var i = n.indexOf('.');
  4961. if (i < 0) {
  4962. i = n.length;
  4963. n += '.';
  4964. }
  4965. var d = minFractionDigits - (n.length - i - 1);
  4966. while (d-- > 0) {
  4967. n += '0';
  4968. }
  4969. }
  4970. return n;
  4971. }
  4972. function checkFlowCollectionEnd(errors, cst) {
  4973. var char, name;
  4974. switch (cst.type) {
  4975. case Type.FLOW_MAP:
  4976. char = '}';
  4977. name = 'flow map';
  4978. break;
  4979. case Type.FLOW_SEQ:
  4980. char = ']';
  4981. name = 'flow sequence';
  4982. break;
  4983. default:
  4984. errors.push(new YAMLSemanticError(cst, 'Not a flow collection!?'));
  4985. return;
  4986. }
  4987. var lastItem;
  4988. for (var i = cst.items.length - 1; i >= 0; --i) {
  4989. var item = cst.items[i];
  4990. if (!item || item.type !== Type.COMMENT) {
  4991. lastItem = item;
  4992. break;
  4993. }
  4994. }
  4995. if (lastItem && lastItem.char !== char) {
  4996. var msg = "Expected ".concat(name, " to end with ").concat(char);
  4997. var err;
  4998. if (typeof lastItem.offset === 'number') {
  4999. err = new YAMLSemanticError(cst, msg);
  5000. err.offset = lastItem.offset + 1;
  5001. } else {
  5002. err = new YAMLSemanticError(lastItem, msg);
  5003. if (lastItem.range && lastItem.range.end) err.offset = lastItem.range.end - lastItem.range.start;
  5004. }
  5005. errors.push(err);
  5006. }
  5007. }
  5008. function checkFlowCommentSpace(errors, comment) {
  5009. var prev = comment.context.src[comment.range.start - 1];
  5010. if (prev !== '\n' && prev !== '\t' && prev !== ' ') {
  5011. var msg = 'Comments must be separated from other tokens by white space characters';
  5012. errors.push(new YAMLSemanticError(comment, msg));
  5013. }
  5014. }
  5015. function getLongKeyError(source, key) {
  5016. var sk = String(key);
  5017. var k = sk.substr(0, 8) + '...' + sk.substr(-8);
  5018. return new YAMLSemanticError(source, "The \"".concat(k, "\" key is too long"));
  5019. }
  5020. function resolveComments(collection, comments) {
  5021. var _iterator = _createForOfIteratorHelper(comments),
  5022. _step;
  5023. try {
  5024. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  5025. var _step$value = _step.value,
  5026. afterKey = _step$value.afterKey,
  5027. before = _step$value.before,
  5028. comment = _step$value.comment;
  5029. var item = collection.items[before];
  5030. if (!item) {
  5031. if (comment !== undefined) {
  5032. if (collection.comment) collection.comment += '\n' + comment;else collection.comment = comment;
  5033. }
  5034. } else {
  5035. if (afterKey && item.value) item = item.value;
  5036. if (comment === undefined) {
  5037. if (afterKey || !item.commentBefore) item.spaceBefore = true;
  5038. } else {
  5039. if (item.commentBefore) item.commentBefore += '\n' + comment;else item.commentBefore = comment;
  5040. }
  5041. }
  5042. }
  5043. } catch (err) {
  5044. _iterator.e(err);
  5045. } finally {
  5046. _iterator.f();
  5047. }
  5048. }
  5049. // on error, will return { str: string, errors: Error[] }
  5050. function resolveString(doc, node) {
  5051. var res = node.strValue;
  5052. if (!res) return '';
  5053. if (typeof res === 'string') return res;
  5054. res.errors.forEach(function (error) {
  5055. if (!error.source) error.source = node;
  5056. doc.errors.push(error);
  5057. });
  5058. return res.str;
  5059. }
  5060. function resolveTagHandle(doc, node) {
  5061. var _node$tag = node.tag,
  5062. handle = _node$tag.handle,
  5063. suffix = _node$tag.suffix;
  5064. var prefix = doc.tagPrefixes.find(function (p) {
  5065. return p.handle === handle;
  5066. });
  5067. if (!prefix) {
  5068. var dtp = doc.getDefaults().tagPrefixes;
  5069. if (dtp) prefix = dtp.find(function (p) {
  5070. return p.handle === handle;
  5071. });
  5072. if (!prefix) throw new YAMLSemanticError(node, "The ".concat(handle, " tag handle is non-default and was not declared."));
  5073. }
  5074. if (!suffix) throw new YAMLSemanticError(node, "The ".concat(handle, " tag has no suffix."));
  5075. if (handle === '!' && (doc.version || doc.options.version) === '1.0') {
  5076. if (suffix[0] === '^') {
  5077. doc.warnings.push(new YAMLWarning(node, 'YAML 1.0 ^ tag expansion is not supported'));
  5078. return suffix;
  5079. }
  5080. if (/[:/]/.test(suffix)) {
  5081. // word/foo -> tag:word.yaml.org,2002:foo
  5082. var vocab = suffix.match(/^([a-z0-9-]+)\/(.*)/i);
  5083. return vocab ? "tag:".concat(vocab[1], ".yaml.org,2002:").concat(vocab[2]) : "tag:".concat(suffix);
  5084. }
  5085. }
  5086. return prefix.prefix + decodeURIComponent(suffix);
  5087. }
  5088. function resolveTagName(doc, node) {
  5089. var tag = node.tag,
  5090. type = node.type;
  5091. var nonSpecific = false;
  5092. if (tag) {
  5093. var handle = tag.handle,
  5094. suffix = tag.suffix,
  5095. verbatim = tag.verbatim;
  5096. if (verbatim) {
  5097. if (verbatim !== '!' && verbatim !== '!!') return verbatim;
  5098. var msg = "Verbatim tags aren't resolved, so ".concat(verbatim, " is invalid.");
  5099. doc.errors.push(new YAMLSemanticError(node, msg));
  5100. } else if (handle === '!' && !suffix) {
  5101. nonSpecific = true;
  5102. } else {
  5103. try {
  5104. return resolveTagHandle(doc, node);
  5105. } catch (error) {
  5106. doc.errors.push(error);
  5107. }
  5108. }
  5109. }
  5110. switch (type) {
  5111. case Type.BLOCK_FOLDED:
  5112. case Type.BLOCK_LITERAL:
  5113. case Type.QUOTE_DOUBLE:
  5114. case Type.QUOTE_SINGLE:
  5115. return defaultTags.STR;
  5116. case Type.FLOW_MAP:
  5117. case Type.MAP:
  5118. return defaultTags.MAP;
  5119. case Type.FLOW_SEQ:
  5120. case Type.SEQ:
  5121. return defaultTags.SEQ;
  5122. case Type.PLAIN:
  5123. return nonSpecific ? defaultTags.STR : null;
  5124. default:
  5125. return null;
  5126. }
  5127. }
  5128. function resolveByTagName(doc, node, tagName) {
  5129. var tags = doc.schema.tags;
  5130. var matchWithTest = [];
  5131. var _iterator = _createForOfIteratorHelper(tags),
  5132. _step;
  5133. try {
  5134. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  5135. var tag = _step.value;
  5136. if (tag.tag === tagName) {
  5137. if (tag.test) matchWithTest.push(tag);else {
  5138. var res = tag.resolve(doc, node);
  5139. return res instanceof Collection$1 ? res : new Scalar(res);
  5140. }
  5141. }
  5142. }
  5143. } catch (err) {
  5144. _iterator.e(err);
  5145. } finally {
  5146. _iterator.f();
  5147. }
  5148. var str = resolveString(doc, node);
  5149. if (typeof str === 'string' && matchWithTest.length > 0) return resolveScalar(str, matchWithTest, tags.scalarFallback);
  5150. return null;
  5151. }
  5152. function getFallbackTagName(_ref) {
  5153. var type = _ref.type;
  5154. switch (type) {
  5155. case Type.FLOW_MAP:
  5156. case Type.MAP:
  5157. return defaultTags.MAP;
  5158. case Type.FLOW_SEQ:
  5159. case Type.SEQ:
  5160. return defaultTags.SEQ;
  5161. default:
  5162. return defaultTags.STR;
  5163. }
  5164. }
  5165. function resolveTag(doc, node, tagName) {
  5166. try {
  5167. var res = resolveByTagName(doc, node, tagName);
  5168. if (res) {
  5169. if (tagName && node.tag) res.tag = tagName;
  5170. return res;
  5171. }
  5172. } catch (error) {
  5173. /* istanbul ignore if */
  5174. if (!error.source) error.source = node;
  5175. doc.errors.push(error);
  5176. return null;
  5177. }
  5178. try {
  5179. var fallback = getFallbackTagName(node);
  5180. if (!fallback) throw new Error("The tag ".concat(tagName, " is unavailable"));
  5181. var msg = "The tag ".concat(tagName, " is unavailable, falling back to ").concat(fallback);
  5182. doc.warnings.push(new YAMLWarning(node, msg));
  5183. var _res = resolveByTagName(doc, node, fallback);
  5184. _res.tag = tagName;
  5185. return _res;
  5186. } catch (error) {
  5187. var refError = new YAMLReferenceError(node, error.message);
  5188. refError.stack = error.stack;
  5189. doc.errors.push(refError);
  5190. return null;
  5191. }
  5192. }
  5193. var isCollectionItem = function isCollectionItem(node) {
  5194. if (!node) return false;
  5195. var type = node.type;
  5196. return type === Type.MAP_KEY || type === Type.MAP_VALUE || type === Type.SEQ_ITEM;
  5197. };
  5198. function resolveNodeProps(errors, node) {
  5199. var comments = {
  5200. before: [],
  5201. after: []
  5202. };
  5203. var hasAnchor = false;
  5204. var hasTag = false;
  5205. var props = isCollectionItem(node.context.parent) ? node.context.parent.props.concat(node.props) : node.props;
  5206. var _iterator = _createForOfIteratorHelper(props),
  5207. _step;
  5208. try {
  5209. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  5210. var _step$value = _step.value,
  5211. start = _step$value.start,
  5212. end = _step$value.end;
  5213. switch (node.context.src[start]) {
  5214. case Char.COMMENT:
  5215. {
  5216. if (!node.commentHasRequiredWhitespace(start)) {
  5217. var msg = 'Comments must be separated from other tokens by white space characters';
  5218. errors.push(new YAMLSemanticError(node, msg));
  5219. }
  5220. var header = node.header,
  5221. valueRange = node.valueRange;
  5222. var cc = valueRange && (start > valueRange.start || header && start > header.start) ? comments.after : comments.before;
  5223. cc.push(node.context.src.slice(start + 1, end));
  5224. break;
  5225. }
  5226. // Actual anchor & tag resolution is handled by schema, here we just complain
  5227. case Char.ANCHOR:
  5228. if (hasAnchor) {
  5229. var _msg = 'A node can have at most one anchor';
  5230. errors.push(new YAMLSemanticError(node, _msg));
  5231. }
  5232. hasAnchor = true;
  5233. break;
  5234. case Char.TAG:
  5235. if (hasTag) {
  5236. var _msg2 = 'A node can have at most one tag';
  5237. errors.push(new YAMLSemanticError(node, _msg2));
  5238. }
  5239. hasTag = true;
  5240. break;
  5241. }
  5242. }
  5243. } catch (err) {
  5244. _iterator.e(err);
  5245. } finally {
  5246. _iterator.f();
  5247. }
  5248. return {
  5249. comments: comments,
  5250. hasAnchor: hasAnchor,
  5251. hasTag: hasTag
  5252. };
  5253. }
  5254. function resolveNodeValue(doc, node) {
  5255. var anchors = doc.anchors,
  5256. errors = doc.errors,
  5257. schema = doc.schema;
  5258. if (node.type === Type.ALIAS) {
  5259. var name = node.rawValue;
  5260. var src = anchors.getNode(name);
  5261. if (!src) {
  5262. var msg = "Aliased anchor not found: ".concat(name);
  5263. errors.push(new YAMLReferenceError(node, msg));
  5264. return null;
  5265. } // Lazy resolution for circular references
  5266. var res = new Alias$1(src);
  5267. anchors._cstAliases.push(res);
  5268. return res;
  5269. }
  5270. var tagName = resolveTagName(doc, node);
  5271. if (tagName) return resolveTag(doc, node, tagName);
  5272. if (node.type !== Type.PLAIN) {
  5273. var _msg3 = "Failed to resolve ".concat(node.type, " node here");
  5274. errors.push(new YAMLSyntaxError(node, _msg3));
  5275. return null;
  5276. }
  5277. try {
  5278. var str = resolveString(doc, node);
  5279. return resolveScalar(str, schema.tags, schema.tags.scalarFallback);
  5280. } catch (error) {
  5281. if (!error.source) error.source = node;
  5282. errors.push(error);
  5283. return null;
  5284. }
  5285. } // sets node.resolved on success
  5286. function resolveNode(doc, node) {
  5287. if (!node) return null;
  5288. if (node.error) doc.errors.push(node.error);
  5289. var _resolveNodeProps = resolveNodeProps(doc.errors, node),
  5290. comments = _resolveNodeProps.comments,
  5291. hasAnchor = _resolveNodeProps.hasAnchor,
  5292. hasTag = _resolveNodeProps.hasTag;
  5293. if (hasAnchor) {
  5294. var anchors = doc.anchors;
  5295. var name = node.anchor;
  5296. var prev = anchors.getNode(name); // At this point, aliases for any preceding node with the same anchor
  5297. // name have already been resolved, so it may safely be renamed.
  5298. if (prev) anchors.map[anchors.newName(name)] = prev; // During parsing, we need to store the CST node in anchors.map as
  5299. // anchors need to be available during resolution to allow for
  5300. // circular references.
  5301. anchors.map[name] = node;
  5302. }
  5303. if (node.type === Type.ALIAS && (hasAnchor || hasTag)) {
  5304. var msg = 'An alias node must not specify any properties';
  5305. doc.errors.push(new YAMLSemanticError(node, msg));
  5306. }
  5307. var res = resolveNodeValue(doc, node);
  5308. if (res) {
  5309. res.range = [node.range.start, node.range.end];
  5310. if (doc.options.keepCstNodes) res.cstNode = node;
  5311. if (doc.options.keepNodeTypes) res.type = node.type;
  5312. var cb = comments.before.join('\n');
  5313. if (cb) {
  5314. res.commentBefore = res.commentBefore ? "".concat(res.commentBefore, "\n").concat(cb) : cb;
  5315. }
  5316. var ca = comments.after.join('\n');
  5317. if (ca) res.comment = res.comment ? "".concat(res.comment, "\n").concat(ca) : ca;
  5318. }
  5319. return node.resolved = res;
  5320. }
  5321. function resolveMap(doc, cst) {
  5322. if (cst.type !== Type.MAP && cst.type !== Type.FLOW_MAP) {
  5323. var msg = "A ".concat(cst.type, " node cannot be resolved as a mapping");
  5324. doc.errors.push(new YAMLSyntaxError(cst, msg));
  5325. return null;
  5326. }
  5327. var _ref = cst.type === Type.FLOW_MAP ? resolveFlowMapItems(doc, cst) : resolveBlockMapItems(doc, cst),
  5328. comments = _ref.comments,
  5329. items = _ref.items;
  5330. var map = new YAMLMap();
  5331. map.items = items;
  5332. resolveComments(map, comments);
  5333. var hasCollectionKey = false;
  5334. for (var i = 0; i < items.length; ++i) {
  5335. var iKey = items[i].key;
  5336. if (iKey instanceof Collection$1) hasCollectionKey = true;
  5337. if (doc.schema.merge && iKey && iKey.value === MERGE_KEY) {
  5338. items[i] = new Merge(items[i]);
  5339. var sources = items[i].value.items;
  5340. var error = null;
  5341. sources.some(function (node) {
  5342. if (node instanceof Alias$1) {
  5343. // During parsing, alias sources are CST nodes; to account for
  5344. // circular references their resolved values can't be used here.
  5345. var type = node.source.type;
  5346. if (type === Type.MAP || type === Type.FLOW_MAP) return false;
  5347. return error = 'Merge nodes aliases can only point to maps';
  5348. }
  5349. return error = 'Merge nodes can only have Alias nodes as values';
  5350. });
  5351. if (error) doc.errors.push(new YAMLSemanticError(cst, error));
  5352. } else {
  5353. for (var j = i + 1; j < items.length; ++j) {
  5354. var jKey = items[j].key;
  5355. if (iKey === jKey || iKey && jKey && Object.prototype.hasOwnProperty.call(iKey, 'value') && iKey.value === jKey.value) {
  5356. var _msg = "Map keys must be unique; \"".concat(iKey, "\" is repeated");
  5357. doc.errors.push(new YAMLSemanticError(cst, _msg));
  5358. break;
  5359. }
  5360. }
  5361. }
  5362. }
  5363. if (hasCollectionKey && !doc.options.mapAsMap) {
  5364. var warn = 'Keys with collection values will be stringified as YAML due to JS Object restrictions. Use mapAsMap: true to avoid this.';
  5365. doc.warnings.push(new YAMLWarning(cst, warn));
  5366. }
  5367. cst.resolved = map;
  5368. return map;
  5369. }
  5370. var valueHasPairComment = function valueHasPairComment(_ref2) {
  5371. var _ref2$context = _ref2.context,
  5372. lineStart = _ref2$context.lineStart,
  5373. node = _ref2$context.node,
  5374. src = _ref2$context.src,
  5375. props = _ref2.props;
  5376. if (props.length === 0) return false;
  5377. var start = props[0].start;
  5378. if (node && start > node.valueRange.start) return false;
  5379. if (src[start] !== Char.COMMENT) return false;
  5380. for (var i = lineStart; i < start; ++i) {
  5381. if (src[i] === '\n') return false;
  5382. }
  5383. return true;
  5384. };
  5385. function resolvePairComment(item, pair) {
  5386. if (!valueHasPairComment(item)) return;
  5387. var comment = item.getPropValue(0, Char.COMMENT, true);
  5388. var found = false;
  5389. var cb = pair.value.commentBefore;
  5390. if (cb && cb.startsWith(comment)) {
  5391. pair.value.commentBefore = cb.substr(comment.length + 1);
  5392. found = true;
  5393. } else {
  5394. var cc = pair.value.comment;
  5395. if (!item.node && cc && cc.startsWith(comment)) {
  5396. pair.value.comment = cc.substr(comment.length + 1);
  5397. found = true;
  5398. }
  5399. }
  5400. if (found) pair.comment = comment;
  5401. }
  5402. function resolveBlockMapItems(doc, cst) {
  5403. var comments = [];
  5404. var items = [];
  5405. var key = undefined;
  5406. var keyStart = null;
  5407. for (var i = 0; i < cst.items.length; ++i) {
  5408. var item = cst.items[i];
  5409. switch (item.type) {
  5410. case Type.BLANK_LINE:
  5411. comments.push({
  5412. afterKey: !!key,
  5413. before: items.length
  5414. });
  5415. break;
  5416. case Type.COMMENT:
  5417. comments.push({
  5418. afterKey: !!key,
  5419. before: items.length,
  5420. comment: item.comment
  5421. });
  5422. break;
  5423. case Type.MAP_KEY:
  5424. if (key !== undefined) items.push(new Pair(key));
  5425. if (item.error) doc.errors.push(item.error);
  5426. key = resolveNode(doc, item.node);
  5427. keyStart = null;
  5428. break;
  5429. case Type.MAP_VALUE:
  5430. {
  5431. if (key === undefined) key = null;
  5432. if (item.error) doc.errors.push(item.error);
  5433. if (!item.context.atLineStart && item.node && item.node.type === Type.MAP && !item.node.context.atLineStart) {
  5434. var msg = 'Nested mappings are not allowed in compact mappings';
  5435. doc.errors.push(new YAMLSemanticError(item.node, msg));
  5436. }
  5437. var valueNode = item.node;
  5438. if (!valueNode && item.props.length > 0) {
  5439. // Comments on an empty mapping value need to be preserved, so we
  5440. // need to construct a minimal empty node here to use instead of the
  5441. // missing `item.node`. -- eemeli/yaml#19
  5442. valueNode = new PlainValue(Type.PLAIN, []);
  5443. valueNode.context = {
  5444. parent: item,
  5445. src: item.context.src
  5446. };
  5447. var pos = item.range.start + 1;
  5448. valueNode.range = {
  5449. start: pos,
  5450. end: pos
  5451. };
  5452. valueNode.valueRange = {
  5453. start: pos,
  5454. end: pos
  5455. };
  5456. if (typeof item.range.origStart === 'number') {
  5457. var origPos = item.range.origStart + 1;
  5458. valueNode.range.origStart = valueNode.range.origEnd = origPos;
  5459. valueNode.valueRange.origStart = valueNode.valueRange.origEnd = origPos;
  5460. }
  5461. }
  5462. var pair = new Pair(key, resolveNode(doc, valueNode));
  5463. resolvePairComment(item, pair);
  5464. items.push(pair);
  5465. if (key && typeof keyStart === 'number') {
  5466. if (item.range.start > keyStart + 1024) doc.errors.push(getLongKeyError(cst, key));
  5467. }
  5468. key = undefined;
  5469. keyStart = null;
  5470. }
  5471. break;
  5472. default:
  5473. if (key !== undefined) items.push(new Pair(key));
  5474. key = resolveNode(doc, item);
  5475. keyStart = item.range.start;
  5476. if (item.error) doc.errors.push(item.error);
  5477. next: for (var j = i + 1;; ++j) {
  5478. var nextItem = cst.items[j];
  5479. switch (nextItem && nextItem.type) {
  5480. case Type.BLANK_LINE:
  5481. case Type.COMMENT:
  5482. continue next;
  5483. case Type.MAP_VALUE:
  5484. break next;
  5485. default:
  5486. {
  5487. var _msg2 = 'Implicit map keys need to be followed by map values';
  5488. doc.errors.push(new YAMLSemanticError(item, _msg2));
  5489. break next;
  5490. }
  5491. }
  5492. }
  5493. if (item.valueRangeContainsNewline) {
  5494. var _msg3 = 'Implicit map keys need to be on a single line';
  5495. doc.errors.push(new YAMLSemanticError(item, _msg3));
  5496. }
  5497. }
  5498. }
  5499. if (key !== undefined) items.push(new Pair(key));
  5500. return {
  5501. comments: comments,
  5502. items: items
  5503. };
  5504. }
  5505. function resolveFlowMapItems(doc, cst) {
  5506. var comments = [];
  5507. var items = [];
  5508. var key = undefined;
  5509. var explicitKey = false;
  5510. var next = '{';
  5511. for (var i = 0; i < cst.items.length; ++i) {
  5512. var item = cst.items[i];
  5513. if (typeof item.char === 'string') {
  5514. var char = item.char,
  5515. offset = item.offset;
  5516. if (char === '?' && key === undefined && !explicitKey) {
  5517. explicitKey = true;
  5518. next = ':';
  5519. continue;
  5520. }
  5521. if (char === ':') {
  5522. if (key === undefined) key = null;
  5523. if (next === ':') {
  5524. next = ',';
  5525. continue;
  5526. }
  5527. } else {
  5528. if (explicitKey) {
  5529. if (key === undefined && char !== ',') key = null;
  5530. explicitKey = false;
  5531. }
  5532. if (key !== undefined) {
  5533. items.push(new Pair(key));
  5534. key = undefined;
  5535. if (char === ',') {
  5536. next = ':';
  5537. continue;
  5538. }
  5539. }
  5540. }
  5541. if (char === '}') {
  5542. if (i === cst.items.length - 1) continue;
  5543. } else if (char === next) {
  5544. next = ':';
  5545. continue;
  5546. }
  5547. var msg = "Flow map contains an unexpected ".concat(char);
  5548. var err = new YAMLSyntaxError(cst, msg);
  5549. err.offset = offset;
  5550. doc.errors.push(err);
  5551. } else if (item.type === Type.BLANK_LINE) {
  5552. comments.push({
  5553. afterKey: !!key,
  5554. before: items.length
  5555. });
  5556. } else if (item.type === Type.COMMENT) {
  5557. checkFlowCommentSpace(doc.errors, item);
  5558. comments.push({
  5559. afterKey: !!key,
  5560. before: items.length,
  5561. comment: item.comment
  5562. });
  5563. } else if (key === undefined) {
  5564. if (next === ',') doc.errors.push(new YAMLSemanticError(item, 'Separator , missing in flow map'));
  5565. key = resolveNode(doc, item);
  5566. } else {
  5567. if (next !== ',') doc.errors.push(new YAMLSemanticError(item, 'Indicator : missing in flow map entry'));
  5568. items.push(new Pair(key, resolveNode(doc, item)));
  5569. key = undefined;
  5570. explicitKey = false;
  5571. }
  5572. }
  5573. checkFlowCollectionEnd(doc.errors, cst);
  5574. if (key !== undefined) items.push(new Pair(key));
  5575. return {
  5576. comments: comments,
  5577. items: items
  5578. };
  5579. }
  5580. function resolveSeq(doc, cst) {
  5581. if (cst.type !== Type.SEQ && cst.type !== Type.FLOW_SEQ) {
  5582. var msg = "A ".concat(cst.type, " node cannot be resolved as a sequence");
  5583. doc.errors.push(new YAMLSyntaxError(cst, msg));
  5584. return null;
  5585. }
  5586. var _ref = cst.type === Type.FLOW_SEQ ? resolveFlowSeqItems(doc, cst) : resolveBlockSeqItems(doc, cst),
  5587. comments = _ref.comments,
  5588. items = _ref.items;
  5589. var seq = new YAMLSeq();
  5590. seq.items = items;
  5591. resolveComments(seq, comments);
  5592. if (!doc.options.mapAsMap && items.some(function (it) {
  5593. return it instanceof Pair && it.key instanceof Collection$1;
  5594. })) {
  5595. var warn = 'Keys with collection values will be stringified as YAML due to JS Object restrictions. Use mapAsMap: true to avoid this.';
  5596. doc.warnings.push(new YAMLWarning(cst, warn));
  5597. }
  5598. cst.resolved = seq;
  5599. return seq;
  5600. }
  5601. function resolveBlockSeqItems(doc, cst) {
  5602. var comments = [];
  5603. var items = [];
  5604. for (var i = 0; i < cst.items.length; ++i) {
  5605. var item = cst.items[i];
  5606. switch (item.type) {
  5607. case Type.BLANK_LINE:
  5608. comments.push({
  5609. before: items.length
  5610. });
  5611. break;
  5612. case Type.COMMENT:
  5613. comments.push({
  5614. comment: item.comment,
  5615. before: items.length
  5616. });
  5617. break;
  5618. case Type.SEQ_ITEM:
  5619. if (item.error) doc.errors.push(item.error);
  5620. items.push(resolveNode(doc, item.node));
  5621. if (item.hasProps) {
  5622. var msg = 'Sequence items cannot have tags or anchors before the - indicator';
  5623. doc.errors.push(new YAMLSemanticError(item, msg));
  5624. }
  5625. break;
  5626. default:
  5627. if (item.error) doc.errors.push(item.error);
  5628. doc.errors.push(new YAMLSyntaxError(item, "Unexpected ".concat(item.type, " node in sequence")));
  5629. }
  5630. }
  5631. return {
  5632. comments: comments,
  5633. items: items
  5634. };
  5635. }
  5636. function resolveFlowSeqItems(doc, cst) {
  5637. var comments = [];
  5638. var items = [];
  5639. var explicitKey = false;
  5640. var key = undefined;
  5641. var keyStart = null;
  5642. var next = '[';
  5643. var prevItem = null;
  5644. for (var i = 0; i < cst.items.length; ++i) {
  5645. var item = cst.items[i];
  5646. if (typeof item.char === 'string') {
  5647. var char = item.char,
  5648. offset = item.offset;
  5649. if (char !== ':' && (explicitKey || key !== undefined)) {
  5650. if (explicitKey && key === undefined) key = next ? items.pop() : null;
  5651. items.push(new Pair(key));
  5652. explicitKey = false;
  5653. key = undefined;
  5654. keyStart = null;
  5655. }
  5656. if (char === next) {
  5657. next = null;
  5658. } else if (!next && char === '?') {
  5659. explicitKey = true;
  5660. } else if (next !== '[' && char === ':' && key === undefined) {
  5661. if (next === ',') {
  5662. key = items.pop();
  5663. if (key instanceof Pair) {
  5664. var msg = 'Chaining flow sequence pairs is invalid';
  5665. var err = new YAMLSemanticError(cst, msg);
  5666. err.offset = offset;
  5667. doc.errors.push(err);
  5668. }
  5669. if (!explicitKey && typeof keyStart === 'number') {
  5670. var keyEnd = item.range ? item.range.start : item.offset;
  5671. if (keyEnd > keyStart + 1024) doc.errors.push(getLongKeyError(cst, key));
  5672. var src = prevItem.context.src;
  5673. for (var _i = keyStart; _i < keyEnd; ++_i) {
  5674. if (src[_i] === '\n') {
  5675. var _msg = 'Implicit keys of flow sequence pairs need to be on a single line';
  5676. doc.errors.push(new YAMLSemanticError(prevItem, _msg));
  5677. break;
  5678. }
  5679. }
  5680. }
  5681. } else {
  5682. key = null;
  5683. }
  5684. keyStart = null;
  5685. explicitKey = false;
  5686. next = null;
  5687. } else if (next === '[' || char !== ']' || i < cst.items.length - 1) {
  5688. var _msg2 = "Flow sequence contains an unexpected ".concat(char);
  5689. var _err = new YAMLSyntaxError(cst, _msg2);
  5690. _err.offset = offset;
  5691. doc.errors.push(_err);
  5692. }
  5693. } else if (item.type === Type.BLANK_LINE) {
  5694. comments.push({
  5695. before: items.length
  5696. });
  5697. } else if (item.type === Type.COMMENT) {
  5698. checkFlowCommentSpace(doc.errors, item);
  5699. comments.push({
  5700. comment: item.comment,
  5701. before: items.length
  5702. });
  5703. } else {
  5704. if (next) {
  5705. var _msg3 = "Expected a ".concat(next, " in flow sequence");
  5706. doc.errors.push(new YAMLSemanticError(item, _msg3));
  5707. }
  5708. var value = resolveNode(doc, item);
  5709. if (key === undefined) {
  5710. items.push(value);
  5711. prevItem = item;
  5712. } else {
  5713. items.push(new Pair(key, value));
  5714. key = undefined;
  5715. }
  5716. keyStart = item.range.start;
  5717. next = ',';
  5718. }
  5719. }
  5720. checkFlowCollectionEnd(doc.errors, cst);
  5721. if (key !== undefined) items.push(new Pair(key));
  5722. return {
  5723. comments: comments,
  5724. items: items
  5725. };
  5726. }
  5727. /* global atob, btoa, Buffer */
  5728. var binary = {
  5729. identify: function identify(value) {
  5730. return value instanceof Uint8Array;
  5731. },
  5732. // Buffer inherits from Uint8Array
  5733. default: false,
  5734. tag: 'tag:yaml.org,2002:binary',
  5735. /**
  5736. * Returns a Buffer in node and an Uint8Array in browsers
  5737. *
  5738. * To use the resulting buffer as an image, you'll want to do something like:
  5739. *
  5740. * const blob = new Blob([buffer], { type: 'image/jpeg' })
  5741. * document.querySelector('#photo').src = URL.createObjectURL(blob)
  5742. */
  5743. resolve: function resolve(doc, node) {
  5744. var src = resolveString(doc, node);
  5745. if (typeof Buffer === 'function') {
  5746. return Buffer.from(src, 'base64');
  5747. } else if (typeof atob === 'function') {
  5748. // On IE 11, atob() can't handle newlines
  5749. var str = atob(src.replace(/[\n\r]/g, ''));
  5750. var buffer = new Uint8Array(str.length);
  5751. for (var i = 0; i < str.length; ++i) {
  5752. buffer[i] = str.charCodeAt(i);
  5753. }
  5754. return buffer;
  5755. } else {
  5756. var msg = 'This environment does not support reading binary tags; either Buffer or atob is required';
  5757. doc.errors.push(new YAMLReferenceError(node, msg));
  5758. return null;
  5759. }
  5760. },
  5761. options: binaryOptions,
  5762. stringify: function stringify(_ref, ctx, onComment, onChompKeep) {
  5763. var comment = _ref.comment,
  5764. type = _ref.type,
  5765. value = _ref.value;
  5766. var src;
  5767. if (typeof Buffer === 'function') {
  5768. src = value instanceof Buffer ? value.toString('base64') : Buffer.from(value.buffer).toString('base64');
  5769. } else if (typeof btoa === 'function') {
  5770. var s = '';
  5771. for (var i = 0; i < value.length; ++i) {
  5772. s += String.fromCharCode(value[i]);
  5773. }
  5774. src = btoa(s);
  5775. } else {
  5776. throw new Error('This environment does not support writing binary tags; either Buffer or btoa is required');
  5777. }
  5778. if (!type) type = binaryOptions.defaultType;
  5779. if (type === Type.QUOTE_DOUBLE) {
  5780. value = src;
  5781. } else {
  5782. var lineWidth = binaryOptions.lineWidth;
  5783. var n = Math.ceil(src.length / lineWidth);
  5784. var lines = new Array(n);
  5785. for (var _i = 0, o = 0; _i < n; ++_i, o += lineWidth) {
  5786. lines[_i] = src.substr(o, lineWidth);
  5787. }
  5788. value = lines.join(type === Type.BLOCK_LITERAL ? '\n' : ' ');
  5789. }
  5790. return stringifyString({
  5791. comment: comment,
  5792. type: type,
  5793. value: value
  5794. }, ctx, onComment, onChompKeep);
  5795. }
  5796. };
  5797. function parsePairs(doc, cst) {
  5798. var seq = resolveSeq(doc, cst);
  5799. for (var i = 0; i < seq.items.length; ++i) {
  5800. var item = seq.items[i];
  5801. if (item instanceof Pair) continue;else if (item instanceof YAMLMap) {
  5802. if (item.items.length > 1) {
  5803. var msg = 'Each pair must have its own sequence indicator';
  5804. throw new YAMLSemanticError(cst, msg);
  5805. }
  5806. var pair = item.items[0] || new Pair();
  5807. if (item.commentBefore) pair.commentBefore = pair.commentBefore ? "".concat(item.commentBefore, "\n").concat(pair.commentBefore) : item.commentBefore;
  5808. if (item.comment) pair.comment = pair.comment ? "".concat(item.comment, "\n").concat(pair.comment) : item.comment;
  5809. item = pair;
  5810. }
  5811. seq.items[i] = item instanceof Pair ? item : new Pair(item);
  5812. }
  5813. return seq;
  5814. }
  5815. function createPairs(schema, iterable, ctx) {
  5816. var pairs = new YAMLSeq(schema);
  5817. pairs.tag = 'tag:yaml.org,2002:pairs';
  5818. var _iterator = _createForOfIteratorHelper(iterable),
  5819. _step;
  5820. try {
  5821. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  5822. var it = _step.value;
  5823. var key = void 0,
  5824. value = void 0;
  5825. if (Array.isArray(it)) {
  5826. if (it.length === 2) {
  5827. key = it[0];
  5828. value = it[1];
  5829. } else throw new TypeError("Expected [key, value] tuple: ".concat(it));
  5830. } else if (it && it instanceof Object) {
  5831. var keys = Object.keys(it);
  5832. if (keys.length === 1) {
  5833. key = keys[0];
  5834. value = it[key];
  5835. } else throw new TypeError("Expected { key: value } tuple: ".concat(it));
  5836. } else {
  5837. key = it;
  5838. }
  5839. var pair = schema.createPair(key, value, ctx);
  5840. pairs.items.push(pair);
  5841. }
  5842. } catch (err) {
  5843. _iterator.e(err);
  5844. } finally {
  5845. _iterator.f();
  5846. }
  5847. return pairs;
  5848. }
  5849. var pairs = {
  5850. default: false,
  5851. tag: 'tag:yaml.org,2002:pairs',
  5852. resolve: parsePairs,
  5853. createNode: createPairs
  5854. };
  5855. var YAMLOMap = /*#__PURE__*/function (_YAMLSeq) {
  5856. _inherits(YAMLOMap, _YAMLSeq);
  5857. var _super = _createSuper(YAMLOMap);
  5858. function YAMLOMap() {
  5859. var _this;
  5860. _classCallCheck(this, YAMLOMap);
  5861. _this = _super.call(this);
  5862. _defineProperty(_assertThisInitialized(_this), "add", YAMLMap.prototype.add.bind(_assertThisInitialized(_this)));
  5863. _defineProperty(_assertThisInitialized(_this), "delete", YAMLMap.prototype.delete.bind(_assertThisInitialized(_this)));
  5864. _defineProperty(_assertThisInitialized(_this), "get", YAMLMap.prototype.get.bind(_assertThisInitialized(_this)));
  5865. _defineProperty(_assertThisInitialized(_this), "has", YAMLMap.prototype.has.bind(_assertThisInitialized(_this)));
  5866. _defineProperty(_assertThisInitialized(_this), "set", YAMLMap.prototype.set.bind(_assertThisInitialized(_this)));
  5867. _this.tag = YAMLOMap.tag;
  5868. return _this;
  5869. }
  5870. _createClass(YAMLOMap, [{
  5871. key: "toJSON",
  5872. value: function toJSON$1(_, ctx) {
  5873. var map = new Map();
  5874. if (ctx && ctx.onCreate) ctx.onCreate(map);
  5875. var _iterator = _createForOfIteratorHelper(this.items),
  5876. _step;
  5877. try {
  5878. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  5879. var pair = _step.value;
  5880. var key = void 0,
  5881. value = void 0;
  5882. if (pair instanceof Pair) {
  5883. key = toJSON(pair.key, '', ctx);
  5884. value = toJSON(pair.value, key, ctx);
  5885. } else {
  5886. key = toJSON(pair, '', ctx);
  5887. }
  5888. if (map.has(key)) throw new Error('Ordered maps must not include duplicate keys');
  5889. map.set(key, value);
  5890. }
  5891. } catch (err) {
  5892. _iterator.e(err);
  5893. } finally {
  5894. _iterator.f();
  5895. }
  5896. return map;
  5897. }
  5898. }]);
  5899. return YAMLOMap;
  5900. }(YAMLSeq);
  5901. _defineProperty(YAMLOMap, "tag", 'tag:yaml.org,2002:omap');
  5902. function parseOMap(doc, cst) {
  5903. var pairs = parsePairs(doc, cst);
  5904. var seenKeys = [];
  5905. var _iterator2 = _createForOfIteratorHelper(pairs.items),
  5906. _step2;
  5907. try {
  5908. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  5909. var key = _step2.value.key;
  5910. if (key instanceof Scalar) {
  5911. if (seenKeys.includes(key.value)) {
  5912. var msg = 'Ordered maps must not include duplicate keys';
  5913. throw new YAMLSemanticError(cst, msg);
  5914. } else {
  5915. seenKeys.push(key.value);
  5916. }
  5917. }
  5918. }
  5919. } catch (err) {
  5920. _iterator2.e(err);
  5921. } finally {
  5922. _iterator2.f();
  5923. }
  5924. return Object.assign(new YAMLOMap(), pairs);
  5925. }
  5926. function createOMap(schema, iterable, ctx) {
  5927. var pairs = createPairs(schema, iterable, ctx);
  5928. var omap = new YAMLOMap();
  5929. omap.items = pairs.items;
  5930. return omap;
  5931. }
  5932. var omap = {
  5933. identify: function identify(value) {
  5934. return value instanceof Map;
  5935. },
  5936. nodeClass: YAMLOMap,
  5937. default: false,
  5938. tag: 'tag:yaml.org,2002:omap',
  5939. resolve: parseOMap,
  5940. createNode: createOMap
  5941. };
  5942. var YAMLSet = /*#__PURE__*/function (_YAMLMap) {
  5943. _inherits(YAMLSet, _YAMLMap);
  5944. var _super = _createSuper(YAMLSet);
  5945. function YAMLSet() {
  5946. var _this;
  5947. _classCallCheck(this, YAMLSet);
  5948. _this = _super.call(this);
  5949. _this.tag = YAMLSet.tag;
  5950. return _this;
  5951. }
  5952. _createClass(YAMLSet, [{
  5953. key: "add",
  5954. value: function add(key) {
  5955. var pair = key instanceof Pair ? key : new Pair(key);
  5956. var prev = findPair(this.items, pair.key);
  5957. if (!prev) this.items.push(pair);
  5958. }
  5959. }, {
  5960. key: "get",
  5961. value: function get(key, keepPair) {
  5962. var pair = findPair(this.items, key);
  5963. return !keepPair && pair instanceof Pair ? pair.key instanceof Scalar ? pair.key.value : pair.key : pair;
  5964. }
  5965. }, {
  5966. key: "set",
  5967. value: function set(key, value) {
  5968. if (typeof value !== 'boolean') throw new Error("Expected boolean value for set(key, value) in a YAML set, not ".concat(_typeof(value)));
  5969. var prev = findPair(this.items, key);
  5970. if (prev && !value) {
  5971. this.items.splice(this.items.indexOf(prev), 1);
  5972. } else if (!prev && value) {
  5973. this.items.push(new Pair(key));
  5974. }
  5975. }
  5976. }, {
  5977. key: "toJSON",
  5978. value: function toJSON(_, ctx) {
  5979. return _get(_getPrototypeOf(YAMLSet.prototype), "toJSON", this).call(this, _, ctx, Set);
  5980. }
  5981. }, {
  5982. key: "toString",
  5983. value: function toString(ctx, onComment, onChompKeep) {
  5984. if (!ctx) return JSON.stringify(this);
  5985. if (this.hasAllNullValues()) return _get(_getPrototypeOf(YAMLSet.prototype), "toString", this).call(this, ctx, onComment, onChompKeep);else throw new Error('Set items must all have null values');
  5986. }
  5987. }]);
  5988. return YAMLSet;
  5989. }(YAMLMap);
  5990. _defineProperty(YAMLSet, "tag", 'tag:yaml.org,2002:set');
  5991. function parseSet(doc, cst) {
  5992. var map = resolveMap(doc, cst);
  5993. if (!map.hasAllNullValues()) throw new YAMLSemanticError(cst, 'Set items must all have null values');
  5994. return Object.assign(new YAMLSet(), map);
  5995. }
  5996. function createSet(schema, iterable, ctx) {
  5997. var set = new YAMLSet();
  5998. var _iterator = _createForOfIteratorHelper(iterable),
  5999. _step;
  6000. try {
  6001. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  6002. var value = _step.value;
  6003. set.items.push(schema.createPair(value, null, ctx));
  6004. }
  6005. } catch (err) {
  6006. _iterator.e(err);
  6007. } finally {
  6008. _iterator.f();
  6009. }
  6010. return set;
  6011. }
  6012. var set = {
  6013. identify: function identify(value) {
  6014. return value instanceof Set;
  6015. },
  6016. nodeClass: YAMLSet,
  6017. default: false,
  6018. tag: 'tag:yaml.org,2002:set',
  6019. resolve: parseSet,
  6020. createNode: createSet
  6021. };
  6022. var parseSexagesimal = function parseSexagesimal(sign, parts) {
  6023. var n = parts.split(':').reduce(function (n, p) {
  6024. return n * 60 + Number(p);
  6025. }, 0);
  6026. return sign === '-' ? -n : n;
  6027. }; // hhhh:mm:ss.sss
  6028. var stringifySexagesimal = function stringifySexagesimal(_ref) {
  6029. var value = _ref.value;
  6030. if (isNaN(value) || !isFinite(value)) return stringifyNumber(value);
  6031. var sign = '';
  6032. if (value < 0) {
  6033. sign = '-';
  6034. value = Math.abs(value);
  6035. }
  6036. var parts = [value % 60]; // seconds, including ms
  6037. if (value < 60) {
  6038. parts.unshift(0); // at least one : is required
  6039. } else {
  6040. value = Math.round((value - parts[0]) / 60);
  6041. parts.unshift(value % 60); // minutes
  6042. if (value >= 60) {
  6043. value = Math.round((value - parts[0]) / 60);
  6044. parts.unshift(value); // hours
  6045. }
  6046. }
  6047. return sign + parts.map(function (n) {
  6048. return n < 10 ? '0' + String(n) : String(n);
  6049. }).join(':').replace(/000000\d*$/, '') // % 60 may introduce error
  6050. ;
  6051. };
  6052. var intTime = {
  6053. identify: function identify(value) {
  6054. return typeof value === 'number';
  6055. },
  6056. default: true,
  6057. tag: 'tag:yaml.org,2002:int',
  6058. format: 'TIME',
  6059. test: /^([-+]?)([0-9][0-9_]*(?::[0-5]?[0-9])+)$/,
  6060. resolve: function resolve(str, sign, parts) {
  6061. return parseSexagesimal(sign, parts.replace(/_/g, ''));
  6062. },
  6063. stringify: stringifySexagesimal
  6064. };
  6065. var floatTime = {
  6066. identify: function identify(value) {
  6067. return typeof value === 'number';
  6068. },
  6069. default: true,
  6070. tag: 'tag:yaml.org,2002:float',
  6071. format: 'TIME',
  6072. test: /^([-+]?)([0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*)$/,
  6073. resolve: function resolve(str, sign, parts) {
  6074. return parseSexagesimal(sign, parts.replace(/_/g, ''));
  6075. },
  6076. stringify: stringifySexagesimal
  6077. };
  6078. var timestamp = {
  6079. identify: function identify(value) {
  6080. return value instanceof Date;
  6081. },
  6082. default: true,
  6083. tag: 'tag:yaml.org,2002:timestamp',
  6084. // If the time zone is omitted, the timestamp is assumed to be specified in UTC. The time part
  6085. // may be omitted altogether, resulting in a date format. In such a case, the time part is
  6086. // assumed to be 00:00:00Z (start of day, UTC).
  6087. test: RegExp('^(?:' + '([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})' + // YYYY-Mm-Dd
  6088. '(?:(?:t|T|[ \\t]+)' + // t | T | whitespace
  6089. '([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)' + // Hh:Mm:Ss(.ss)?
  6090. '(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?' + // Z | +5 | -03:30
  6091. ')?' + ')$'),
  6092. resolve: function resolve(str, year, month, day, hour, minute, second, millisec, tz) {
  6093. if (millisec) millisec = (millisec + '00').substr(1, 3);
  6094. var date = Date.UTC(year, month - 1, day, hour || 0, minute || 0, second || 0, millisec || 0);
  6095. if (tz && tz !== 'Z') {
  6096. var d = parseSexagesimal(tz[0], tz.slice(1));
  6097. if (Math.abs(d) < 30) d *= 60;
  6098. date -= 60000 * d;
  6099. }
  6100. return new Date(date);
  6101. },
  6102. stringify: function stringify(_ref2) {
  6103. var value = _ref2.value;
  6104. return value.toISOString().replace(/((T00:00)?:00)?\.000Z$/, '');
  6105. }
  6106. };
  6107. /* global console, process, YAML_SILENCE_DEPRECATION_WARNINGS, YAML_SILENCE_WARNINGS */
  6108. function shouldWarn(deprecation) {
  6109. var env = typeof process !== 'undefined' && process.env || {};
  6110. if (deprecation) {
  6111. if (typeof YAML_SILENCE_DEPRECATION_WARNINGS !== 'undefined') return !YAML_SILENCE_DEPRECATION_WARNINGS;
  6112. return !env.YAML_SILENCE_DEPRECATION_WARNINGS;
  6113. }
  6114. if (typeof YAML_SILENCE_WARNINGS !== 'undefined') return !YAML_SILENCE_WARNINGS;
  6115. return !env.YAML_SILENCE_WARNINGS;
  6116. }
  6117. function warn(warning, type) {
  6118. if (shouldWarn(false)) {
  6119. var emit = typeof process !== 'undefined' && process.emitWarning; // This will throw in Jest if `warning` is an Error instance due to
  6120. // https://github.com/facebook/jest/issues/2549
  6121. if (emit) emit(warning, type);else {
  6122. // eslint-disable-next-line no-console
  6123. console.warn(type ? "".concat(type, ": ").concat(warning) : warning);
  6124. }
  6125. }
  6126. }
  6127. var warned = {};
  6128. function warnOptionDeprecation(name, alternative) {
  6129. if (!warned[name] && shouldWarn(true)) {
  6130. warned[name] = true;
  6131. var msg = "The option '".concat(name, "' will be removed in a future release");
  6132. msg += alternative ? ", use '".concat(alternative, "' instead.") : '.';
  6133. warn(msg, 'DeprecationWarning');
  6134. }
  6135. }
  6136. function createMap(schema, obj, ctx) {
  6137. var map = new YAMLMap(schema);
  6138. if (obj instanceof Map) {
  6139. var _iterator = _createForOfIteratorHelper(obj),
  6140. _step;
  6141. try {
  6142. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  6143. var _step$value = _slicedToArray(_step.value, 2),
  6144. key = _step$value[0],
  6145. value = _step$value[1];
  6146. map.items.push(schema.createPair(key, value, ctx));
  6147. }
  6148. } catch (err) {
  6149. _iterator.e(err);
  6150. } finally {
  6151. _iterator.f();
  6152. }
  6153. } else if (obj && _typeof(obj) === 'object') {
  6154. for (var _i = 0, _Object$keys = Object.keys(obj); _i < _Object$keys.length; _i++) {
  6155. var _key = _Object$keys[_i];
  6156. map.items.push(schema.createPair(_key, obj[_key], ctx));
  6157. }
  6158. }
  6159. if (typeof schema.sortMapEntries === 'function') {
  6160. map.items.sort(schema.sortMapEntries);
  6161. }
  6162. return map;
  6163. }
  6164. var map = {
  6165. createNode: createMap,
  6166. default: true,
  6167. nodeClass: YAMLMap,
  6168. tag: 'tag:yaml.org,2002:map',
  6169. resolve: resolveMap
  6170. };
  6171. function createSeq(schema, obj, ctx) {
  6172. var seq = new YAMLSeq(schema);
  6173. if (obj && obj[Symbol.iterator]) {
  6174. var _iterator = _createForOfIteratorHelper(obj),
  6175. _step;
  6176. try {
  6177. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  6178. var it = _step.value;
  6179. var v = schema.createNode(it, ctx.wrapScalars, null, ctx);
  6180. seq.items.push(v);
  6181. }
  6182. } catch (err) {
  6183. _iterator.e(err);
  6184. } finally {
  6185. _iterator.f();
  6186. }
  6187. }
  6188. return seq;
  6189. }
  6190. var seq = {
  6191. createNode: createSeq,
  6192. default: true,
  6193. nodeClass: YAMLSeq,
  6194. tag: 'tag:yaml.org,2002:seq',
  6195. resolve: resolveSeq
  6196. };
  6197. var string = {
  6198. identify: function identify(value) {
  6199. return typeof value === 'string';
  6200. },
  6201. default: true,
  6202. tag: 'tag:yaml.org,2002:str',
  6203. resolve: resolveString,
  6204. stringify: function stringify(item, ctx, onComment, onChompKeep) {
  6205. ctx = Object.assign({
  6206. actualString: true
  6207. }, ctx);
  6208. return stringifyString(item, ctx, onComment, onChompKeep);
  6209. },
  6210. options: strOptions
  6211. };
  6212. var failsafe = [map, seq, string];
  6213. /* global BigInt */
  6214. var intIdentify = function intIdentify(value) {
  6215. return typeof value === 'bigint' || Number.isInteger(value);
  6216. };
  6217. var intResolve = function intResolve(src, part, radix) {
  6218. return intOptions.asBigInt ? BigInt(src) : parseInt(part, radix);
  6219. };
  6220. function intStringify(node, radix, prefix) {
  6221. var value = node.value;
  6222. if (intIdentify(value) && value >= 0) return prefix + value.toString(radix);
  6223. return stringifyNumber(node);
  6224. }
  6225. var nullObj = {
  6226. identify: function identify(value) {
  6227. return value == null;
  6228. },
  6229. createNode: function createNode(schema, value, ctx) {
  6230. return ctx.wrapScalars ? new Scalar(null) : null;
  6231. },
  6232. default: true,
  6233. tag: 'tag:yaml.org,2002:null',
  6234. test: /^(?:~|[Nn]ull|NULL)?$/,
  6235. resolve: function resolve() {
  6236. return null;
  6237. },
  6238. options: nullOptions,
  6239. stringify: function stringify() {
  6240. return nullOptions.nullStr;
  6241. }
  6242. };
  6243. var boolObj = {
  6244. identify: function identify(value) {
  6245. return typeof value === 'boolean';
  6246. },
  6247. default: true,
  6248. tag: 'tag:yaml.org,2002:bool',
  6249. test: /^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,
  6250. resolve: function resolve(str) {
  6251. return str[0] === 't' || str[0] === 'T';
  6252. },
  6253. options: boolOptions,
  6254. stringify: function stringify(_ref) {
  6255. var value = _ref.value;
  6256. return value ? boolOptions.trueStr : boolOptions.falseStr;
  6257. }
  6258. };
  6259. var octObj = {
  6260. identify: function identify(value) {
  6261. return intIdentify(value) && value >= 0;
  6262. },
  6263. default: true,
  6264. tag: 'tag:yaml.org,2002:int',
  6265. format: 'OCT',
  6266. test: /^0o([0-7]+)$/,
  6267. resolve: function resolve(str, oct) {
  6268. return intResolve(str, oct, 8);
  6269. },
  6270. options: intOptions,
  6271. stringify: function stringify(node) {
  6272. return intStringify(node, 8, '0o');
  6273. }
  6274. };
  6275. var intObj = {
  6276. identify: intIdentify,
  6277. default: true,
  6278. tag: 'tag:yaml.org,2002:int',
  6279. test: /^[-+]?[0-9]+$/,
  6280. resolve: function resolve(str) {
  6281. return intResolve(str, str, 10);
  6282. },
  6283. options: intOptions,
  6284. stringify: stringifyNumber
  6285. };
  6286. var hexObj = {
  6287. identify: function identify(value) {
  6288. return intIdentify(value) && value >= 0;
  6289. },
  6290. default: true,
  6291. tag: 'tag:yaml.org,2002:int',
  6292. format: 'HEX',
  6293. test: /^0x([0-9a-fA-F]+)$/,
  6294. resolve: function resolve(str, hex) {
  6295. return intResolve(str, hex, 16);
  6296. },
  6297. options: intOptions,
  6298. stringify: function stringify(node) {
  6299. return intStringify(node, 16, '0x');
  6300. }
  6301. };
  6302. var nanObj = {
  6303. identify: function identify(value) {
  6304. return typeof value === 'number';
  6305. },
  6306. default: true,
  6307. tag: 'tag:yaml.org,2002:float',
  6308. test: /^(?:[-+]?\.inf|(\.nan))$/i,
  6309. resolve: function resolve(str, nan) {
  6310. return nan ? NaN : str[0] === '-' ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY;
  6311. },
  6312. stringify: stringifyNumber
  6313. };
  6314. var expObj = {
  6315. identify: function identify(value) {
  6316. return typeof value === 'number';
  6317. },
  6318. default: true,
  6319. tag: 'tag:yaml.org,2002:float',
  6320. format: 'EXP',
  6321. test: /^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,
  6322. resolve: function resolve(str) {
  6323. return parseFloat(str);
  6324. },
  6325. stringify: function stringify(_ref2) {
  6326. var value = _ref2.value;
  6327. return Number(value).toExponential();
  6328. }
  6329. };
  6330. var floatObj = {
  6331. identify: function identify(value) {
  6332. return typeof value === 'number';
  6333. },
  6334. default: true,
  6335. tag: 'tag:yaml.org,2002:float',
  6336. test: /^[-+]?(?:\.([0-9]+)|[0-9]+\.([0-9]*))$/,
  6337. resolve: function resolve(str, frac1, frac2) {
  6338. var frac = frac1 || frac2;
  6339. var node = new Scalar(parseFloat(str));
  6340. if (frac && frac[frac.length - 1] === '0') node.minFractionDigits = frac.length;
  6341. return node;
  6342. },
  6343. stringify: stringifyNumber
  6344. };
  6345. var core = failsafe.concat([nullObj, boolObj, octObj, intObj, hexObj, nanObj, expObj, floatObj]);
  6346. /* global BigInt */
  6347. var intIdentify$1 = function intIdentify(value) {
  6348. return typeof value === 'bigint' || Number.isInteger(value);
  6349. };
  6350. var stringifyJSON = function stringifyJSON(_ref) {
  6351. var value = _ref.value;
  6352. return JSON.stringify(value);
  6353. };
  6354. var json = [map, seq, {
  6355. identify: function identify(value) {
  6356. return typeof value === 'string';
  6357. },
  6358. default: true,
  6359. tag: 'tag:yaml.org,2002:str',
  6360. resolve: resolveString,
  6361. stringify: stringifyJSON
  6362. }, {
  6363. identify: function identify(value) {
  6364. return value == null;
  6365. },
  6366. createNode: function createNode(schema, value, ctx) {
  6367. return ctx.wrapScalars ? new Scalar(null) : null;
  6368. },
  6369. default: true,
  6370. tag: 'tag:yaml.org,2002:null',
  6371. test: /^null$/,
  6372. resolve: function resolve() {
  6373. return null;
  6374. },
  6375. stringify: stringifyJSON
  6376. }, {
  6377. identify: function identify(value) {
  6378. return typeof value === 'boolean';
  6379. },
  6380. default: true,
  6381. tag: 'tag:yaml.org,2002:bool',
  6382. test: /^true|false$/,
  6383. resolve: function resolve(str) {
  6384. return str === 'true';
  6385. },
  6386. stringify: stringifyJSON
  6387. }, {
  6388. identify: intIdentify$1,
  6389. default: true,
  6390. tag: 'tag:yaml.org,2002:int',
  6391. test: /^-?(?:0|[1-9][0-9]*)$/,
  6392. resolve: function resolve(str) {
  6393. return intOptions.asBigInt ? BigInt(str) : parseInt(str, 10);
  6394. },
  6395. stringify: function stringify(_ref2) {
  6396. var value = _ref2.value;
  6397. return intIdentify$1(value) ? value.toString() : JSON.stringify(value);
  6398. }
  6399. }, {
  6400. identify: function identify(value) {
  6401. return typeof value === 'number';
  6402. },
  6403. default: true,
  6404. tag: 'tag:yaml.org,2002:float',
  6405. test: /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,
  6406. resolve: function resolve(str) {
  6407. return parseFloat(str);
  6408. },
  6409. stringify: stringifyJSON
  6410. }];
  6411. json.scalarFallback = function (str) {
  6412. throw new SyntaxError("Unresolved plain scalar ".concat(JSON.stringify(str)));
  6413. };
  6414. /* global BigInt */
  6415. var boolStringify = function boolStringify(_ref) {
  6416. var value = _ref.value;
  6417. return value ? boolOptions.trueStr : boolOptions.falseStr;
  6418. };
  6419. var intIdentify$2 = function intIdentify(value) {
  6420. return typeof value === 'bigint' || Number.isInteger(value);
  6421. };
  6422. function intResolve$1(sign, src, radix) {
  6423. var str = src.replace(/_/g, '');
  6424. if (intOptions.asBigInt) {
  6425. switch (radix) {
  6426. case 2:
  6427. str = "0b".concat(str);
  6428. break;
  6429. case 8:
  6430. str = "0o".concat(str);
  6431. break;
  6432. case 16:
  6433. str = "0x".concat(str);
  6434. break;
  6435. }
  6436. var _n = BigInt(str);
  6437. return sign === '-' ? BigInt(-1) * _n : _n;
  6438. }
  6439. var n = parseInt(str, radix);
  6440. return sign === '-' ? -1 * n : n;
  6441. }
  6442. function intStringify$1(node, radix, prefix) {
  6443. var value = node.value;
  6444. if (intIdentify$2(value)) {
  6445. var str = value.toString(radix);
  6446. return value < 0 ? '-' + prefix + str.substr(1) : prefix + str;
  6447. }
  6448. return stringifyNumber(node);
  6449. }
  6450. var yaml11 = failsafe.concat([{
  6451. identify: function identify(value) {
  6452. return value == null;
  6453. },
  6454. createNode: function createNode(schema, value, ctx) {
  6455. return ctx.wrapScalars ? new Scalar(null) : null;
  6456. },
  6457. default: true,
  6458. tag: 'tag:yaml.org,2002:null',
  6459. test: /^(?:~|[Nn]ull|NULL)?$/,
  6460. resolve: function resolve() {
  6461. return null;
  6462. },
  6463. options: nullOptions,
  6464. stringify: function stringify() {
  6465. return nullOptions.nullStr;
  6466. }
  6467. }, {
  6468. identify: function identify(value) {
  6469. return typeof value === 'boolean';
  6470. },
  6471. default: true,
  6472. tag: 'tag:yaml.org,2002:bool',
  6473. test: /^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,
  6474. resolve: function resolve() {
  6475. return true;
  6476. },
  6477. options: boolOptions,
  6478. stringify: boolStringify
  6479. }, {
  6480. identify: function identify(value) {
  6481. return typeof value === 'boolean';
  6482. },
  6483. default: true,
  6484. tag: 'tag:yaml.org,2002:bool',
  6485. test: /^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/i,
  6486. resolve: function resolve() {
  6487. return false;
  6488. },
  6489. options: boolOptions,
  6490. stringify: boolStringify
  6491. }, {
  6492. identify: intIdentify$2,
  6493. default: true,
  6494. tag: 'tag:yaml.org,2002:int',
  6495. format: 'BIN',
  6496. test: /^([-+]?)0b([0-1_]+)$/,
  6497. resolve: function resolve(str, sign, bin) {
  6498. return intResolve$1(sign, bin, 2);
  6499. },
  6500. stringify: function stringify(node) {
  6501. return intStringify$1(node, 2, '0b');
  6502. }
  6503. }, {
  6504. identify: intIdentify$2,
  6505. default: true,
  6506. tag: 'tag:yaml.org,2002:int',
  6507. format: 'OCT',
  6508. test: /^([-+]?)0([0-7_]+)$/,
  6509. resolve: function resolve(str, sign, oct) {
  6510. return intResolve$1(sign, oct, 8);
  6511. },
  6512. stringify: function stringify(node) {
  6513. return intStringify$1(node, 8, '0');
  6514. }
  6515. }, {
  6516. identify: intIdentify$2,
  6517. default: true,
  6518. tag: 'tag:yaml.org,2002:int',
  6519. test: /^([-+]?)([0-9][0-9_]*)$/,
  6520. resolve: function resolve(str, sign, abs) {
  6521. return intResolve$1(sign, abs, 10);
  6522. },
  6523. stringify: stringifyNumber
  6524. }, {
  6525. identify: intIdentify$2,
  6526. default: true,
  6527. tag: 'tag:yaml.org,2002:int',
  6528. format: 'HEX',
  6529. test: /^([-+]?)0x([0-9a-fA-F_]+)$/,
  6530. resolve: function resolve(str, sign, hex) {
  6531. return intResolve$1(sign, hex, 16);
  6532. },
  6533. stringify: function stringify(node) {
  6534. return intStringify$1(node, 16, '0x');
  6535. }
  6536. }, {
  6537. identify: function identify(value) {
  6538. return typeof value === 'number';
  6539. },
  6540. default: true,
  6541. tag: 'tag:yaml.org,2002:float',
  6542. test: /^(?:[-+]?\.inf|(\.nan))$/i,
  6543. resolve: function resolve(str, nan) {
  6544. return nan ? NaN : str[0] === '-' ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY;
  6545. },
  6546. stringify: stringifyNumber
  6547. }, {
  6548. identify: function identify(value) {
  6549. return typeof value === 'number';
  6550. },
  6551. default: true,
  6552. tag: 'tag:yaml.org,2002:float',
  6553. format: 'EXP',
  6554. test: /^[-+]?([0-9][0-9_]*)?(\.[0-9_]*)?[eE][-+]?[0-9]+$/,
  6555. resolve: function resolve(str) {
  6556. return parseFloat(str.replace(/_/g, ''));
  6557. },
  6558. stringify: function stringify(_ref2) {
  6559. var value = _ref2.value;
  6560. return Number(value).toExponential();
  6561. }
  6562. }, {
  6563. identify: function identify(value) {
  6564. return typeof value === 'number';
  6565. },
  6566. default: true,
  6567. tag: 'tag:yaml.org,2002:float',
  6568. test: /^[-+]?(?:[0-9][0-9_]*)?\.([0-9_]*)$/,
  6569. resolve: function resolve(str, frac) {
  6570. var node = new Scalar(parseFloat(str.replace(/_/g, '')));
  6571. if (frac) {
  6572. var f = frac.replace(/_/g, '');
  6573. if (f[f.length - 1] === '0') node.minFractionDigits = f.length;
  6574. }
  6575. return node;
  6576. },
  6577. stringify: stringifyNumber
  6578. }], binary, omap, pairs, set, intTime, floatTime, timestamp);
  6579. var schemas = {
  6580. core: core,
  6581. failsafe: failsafe,
  6582. json: json,
  6583. yaml11: yaml11
  6584. };
  6585. var tags = {
  6586. binary: binary,
  6587. bool: boolObj,
  6588. float: floatObj,
  6589. floatExp: expObj,
  6590. floatNaN: nanObj,
  6591. floatTime: floatTime,
  6592. int: intObj,
  6593. intHex: hexObj,
  6594. intOct: octObj,
  6595. intTime: intTime,
  6596. map: map,
  6597. null: nullObj,
  6598. omap: omap,
  6599. pairs: pairs,
  6600. seq: seq,
  6601. set: set,
  6602. timestamp: timestamp
  6603. };
  6604. function findTagObject(value, tagName, tags) {
  6605. if (tagName) {
  6606. var match = tags.filter(function (t) {
  6607. return t.tag === tagName;
  6608. });
  6609. var tagObj = match.find(function (t) {
  6610. return !t.format;
  6611. }) || match[0];
  6612. if (!tagObj) throw new Error("Tag ".concat(tagName, " not found"));
  6613. return tagObj;
  6614. } // TODO: deprecate/remove class check
  6615. return tags.find(function (t) {
  6616. return (t.identify && t.identify(value) || t.class && value instanceof t.class) && !t.format;
  6617. });
  6618. }
  6619. function createNode(value, tagName, ctx) {
  6620. if (value instanceof Node$1) return value;
  6621. var defaultPrefix = ctx.defaultPrefix,
  6622. onTagObj = ctx.onTagObj,
  6623. prevObjects = ctx.prevObjects,
  6624. schema = ctx.schema,
  6625. wrapScalars = ctx.wrapScalars;
  6626. if (tagName && tagName.startsWith('!!')) tagName = defaultPrefix + tagName.slice(2);
  6627. var tagObj = findTagObject(value, tagName, schema.tags);
  6628. if (!tagObj) {
  6629. if (typeof value.toJSON === 'function') value = value.toJSON();
  6630. if (_typeof(value) !== 'object') return wrapScalars ? new Scalar(value) : value;
  6631. tagObj = value instanceof Map ? map : value[Symbol.iterator] ? seq : map;
  6632. }
  6633. if (onTagObj) {
  6634. onTagObj(tagObj);
  6635. delete ctx.onTagObj;
  6636. } // Detect duplicate references to the same object & use Alias nodes for all
  6637. // after first. The `obj` wrapper allows for circular references to resolve.
  6638. var obj = {};
  6639. if (value && _typeof(value) === 'object' && prevObjects) {
  6640. var prev = prevObjects.get(value);
  6641. if (prev) {
  6642. var alias = new Alias$1(prev); // leaves source dirty; must be cleaned by caller
  6643. ctx.aliasNodes.push(alias); // defined along with prevObjects
  6644. return alias;
  6645. }
  6646. obj.value = value;
  6647. prevObjects.set(value, obj);
  6648. }
  6649. obj.node = tagObj.createNode ? tagObj.createNode(ctx.schema, value, ctx) : wrapScalars ? new Scalar(value) : value;
  6650. if (tagName && obj.node instanceof Node$1) obj.node.tag = tagName;
  6651. return obj.node;
  6652. }
  6653. function getSchemaTags(schemas, knownTags, customTags, schemaId) {
  6654. var tags = schemas[schemaId.replace(/\W/g, '')]; // 'yaml-1.1' -> 'yaml11'
  6655. if (!tags) {
  6656. var keys = Object.keys(schemas).map(function (key) {
  6657. return JSON.stringify(key);
  6658. }).join(', ');
  6659. throw new Error("Unknown schema \"".concat(schemaId, "\"; use one of ").concat(keys));
  6660. }
  6661. if (Array.isArray(customTags)) {
  6662. var _iterator = _createForOfIteratorHelper(customTags),
  6663. _step;
  6664. try {
  6665. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  6666. var tag = _step.value;
  6667. tags = tags.concat(tag);
  6668. }
  6669. } catch (err) {
  6670. _iterator.e(err);
  6671. } finally {
  6672. _iterator.f();
  6673. }
  6674. } else if (typeof customTags === 'function') {
  6675. tags = customTags(tags.slice());
  6676. }
  6677. for (var i = 0; i < tags.length; ++i) {
  6678. var _tag = tags[i];
  6679. if (typeof _tag === 'string') {
  6680. var tagObj = knownTags[_tag];
  6681. if (!tagObj) {
  6682. var _keys = Object.keys(knownTags).map(function (key) {
  6683. return JSON.stringify(key);
  6684. }).join(', ');
  6685. throw new Error("Unknown custom tag \"".concat(_tag, "\"; use one of ").concat(_keys));
  6686. }
  6687. tags[i] = tagObj;
  6688. }
  6689. }
  6690. return tags;
  6691. }
  6692. var sortMapEntriesByKey = function sortMapEntriesByKey(a, b) {
  6693. return a.key < b.key ? -1 : a.key > b.key ? 1 : 0;
  6694. };
  6695. var Schema = /*#__PURE__*/function () {
  6696. // TODO: remove in v2
  6697. // TODO: remove in v2
  6698. function Schema(_ref) {
  6699. var customTags = _ref.customTags,
  6700. merge = _ref.merge,
  6701. schema = _ref.schema,
  6702. sortMapEntries = _ref.sortMapEntries,
  6703. deprecatedCustomTags = _ref.tags;
  6704. _classCallCheck(this, Schema);
  6705. this.merge = !!merge;
  6706. this.name = schema;
  6707. this.sortMapEntries = sortMapEntries === true ? sortMapEntriesByKey : sortMapEntries || null;
  6708. if (!customTags && deprecatedCustomTags) warnOptionDeprecation('tags', 'customTags');
  6709. this.tags = getSchemaTags(schemas, tags, customTags || deprecatedCustomTags, schema);
  6710. }
  6711. _createClass(Schema, [{
  6712. key: "createNode",
  6713. value: function createNode$1(value, wrapScalars, tagName, ctx) {
  6714. var baseCtx = {
  6715. defaultPrefix: Schema.defaultPrefix,
  6716. schema: this,
  6717. wrapScalars: wrapScalars
  6718. };
  6719. var createCtx = ctx ? Object.assign(ctx, baseCtx) : baseCtx;
  6720. return createNode(value, tagName, createCtx);
  6721. }
  6722. }, {
  6723. key: "createPair",
  6724. value: function createPair(key, value, ctx) {
  6725. if (!ctx) ctx = {
  6726. wrapScalars: true
  6727. };
  6728. var k = this.createNode(key, ctx.wrapScalars, null, ctx);
  6729. var v = this.createNode(value, ctx.wrapScalars, null, ctx);
  6730. return new Pair(k, v);
  6731. }
  6732. }]);
  6733. return Schema;
  6734. }();
  6735. _defineProperty(Schema, "defaultPrefix", defaultTagPrefix);
  6736. _defineProperty(Schema, "defaultTags", defaultTags);
  6737. var defaultOptions = {
  6738. anchorPrefix: 'a',
  6739. customTags: null,
  6740. indent: 2,
  6741. indentSeq: true,
  6742. keepCstNodes: false,
  6743. keepNodeTypes: true,
  6744. keepBlobsInJSON: true,
  6745. mapAsMap: false,
  6746. maxAliasCount: 100,
  6747. prettyErrors: false,
  6748. // TODO Set true in v2
  6749. simpleKeys: false,
  6750. version: '1.2'
  6751. };
  6752. var scalarOptions = {
  6753. get binary() {
  6754. return binaryOptions;
  6755. },
  6756. set binary(opt) {
  6757. Object.assign(binaryOptions, opt);
  6758. },
  6759. get bool() {
  6760. return boolOptions;
  6761. },
  6762. set bool(opt) {
  6763. Object.assign(boolOptions, opt);
  6764. },
  6765. get int() {
  6766. return intOptions;
  6767. },
  6768. set int(opt) {
  6769. Object.assign(intOptions, opt);
  6770. },
  6771. get null() {
  6772. return nullOptions;
  6773. },
  6774. set null(opt) {
  6775. Object.assign(nullOptions, opt);
  6776. },
  6777. get str() {
  6778. return strOptions;
  6779. },
  6780. set str(opt) {
  6781. Object.assign(strOptions, opt);
  6782. }
  6783. };
  6784. var documentOptions = {
  6785. '1.0': {
  6786. schema: 'yaml-1.1',
  6787. merge: true,
  6788. tagPrefixes: [{
  6789. handle: '!',
  6790. prefix: defaultTagPrefix
  6791. }, {
  6792. handle: '!!',
  6793. prefix: 'tag:private.yaml.org,2002:'
  6794. }]
  6795. },
  6796. '1.1': {
  6797. schema: 'yaml-1.1',
  6798. merge: true,
  6799. tagPrefixes: [{
  6800. handle: '!',
  6801. prefix: '!'
  6802. }, {
  6803. handle: '!!',
  6804. prefix: defaultTagPrefix
  6805. }]
  6806. },
  6807. '1.2': {
  6808. schema: 'core',
  6809. merge: false,
  6810. tagPrefixes: [{
  6811. handle: '!',
  6812. prefix: '!'
  6813. }, {
  6814. handle: '!!',
  6815. prefix: defaultTagPrefix
  6816. }]
  6817. }
  6818. };
  6819. function stringifyTag(doc, tag) {
  6820. if ((doc.version || doc.options.version) === '1.0') {
  6821. var priv = tag.match(/^tag:private\.yaml\.org,2002:([^:/]+)$/);
  6822. if (priv) return '!' + priv[1];
  6823. var vocab = tag.match(/^tag:([a-zA-Z0-9-]+)\.yaml\.org,2002:(.*)/);
  6824. return vocab ? "!".concat(vocab[1], "/").concat(vocab[2]) : "!".concat(tag.replace(/^tag:/, ''));
  6825. }
  6826. var p = doc.tagPrefixes.find(function (p) {
  6827. return tag.indexOf(p.prefix) === 0;
  6828. });
  6829. if (!p) {
  6830. var dtp = doc.getDefaults().tagPrefixes;
  6831. p = dtp && dtp.find(function (p) {
  6832. return tag.indexOf(p.prefix) === 0;
  6833. });
  6834. }
  6835. if (!p) return tag[0] === '!' ? tag : "!<".concat(tag, ">");
  6836. var suffix = tag.substr(p.prefix.length).replace(/[!,[\]{}]/g, function (ch) {
  6837. return {
  6838. '!': '%21',
  6839. ',': '%2C',
  6840. '[': '%5B',
  6841. ']': '%5D',
  6842. '{': '%7B',
  6843. '}': '%7D'
  6844. }[ch];
  6845. });
  6846. return p.handle + suffix;
  6847. }
  6848. function getTagObject(tags, item) {
  6849. if (item instanceof Alias$1) return Alias$1;
  6850. if (item.tag) {
  6851. var match = tags.filter(function (t) {
  6852. return t.tag === item.tag;
  6853. });
  6854. if (match.length > 0) return match.find(function (t) {
  6855. return t.format === item.format;
  6856. }) || match[0];
  6857. }
  6858. var tagObj, obj;
  6859. if (item instanceof Scalar) {
  6860. obj = item.value; // TODO: deprecate/remove class check
  6861. var _match = tags.filter(function (t) {
  6862. return t.identify && t.identify(obj) || t.class && obj instanceof t.class;
  6863. });
  6864. tagObj = _match.find(function (t) {
  6865. return t.format === item.format;
  6866. }) || _match.find(function (t) {
  6867. return !t.format;
  6868. });
  6869. } else {
  6870. obj = item;
  6871. tagObj = tags.find(function (t) {
  6872. return t.nodeClass && obj instanceof t.nodeClass;
  6873. });
  6874. }
  6875. if (!tagObj) {
  6876. var name = obj && obj.constructor ? obj.constructor.name : _typeof(obj);
  6877. throw new Error("Tag not resolved for ".concat(name, " value"));
  6878. }
  6879. return tagObj;
  6880. } // needs to be called before value stringifier to allow for circular anchor refs
  6881. function stringifyProps(node, tagObj, _ref) {
  6882. var anchors = _ref.anchors,
  6883. doc = _ref.doc;
  6884. var props = [];
  6885. var anchor = doc.anchors.getName(node);
  6886. if (anchor) {
  6887. anchors[anchor] = node;
  6888. props.push("&".concat(anchor));
  6889. }
  6890. if (node.tag) {
  6891. props.push(stringifyTag(doc, node.tag));
  6892. } else if (!tagObj.default) {
  6893. props.push(stringifyTag(doc, tagObj.tag));
  6894. }
  6895. return props.join(' ');
  6896. }
  6897. function stringify(item, ctx, onComment, onChompKeep) {
  6898. var _ctx$doc = ctx.doc,
  6899. anchors = _ctx$doc.anchors,
  6900. schema = _ctx$doc.schema;
  6901. var tagObj;
  6902. if (!(item instanceof Node$1)) {
  6903. var createCtx = {
  6904. aliasNodes: [],
  6905. onTagObj: function onTagObj(o) {
  6906. return tagObj = o;
  6907. },
  6908. prevObjects: new Map()
  6909. };
  6910. item = schema.createNode(item, true, null, createCtx);
  6911. var _iterator = _createForOfIteratorHelper(createCtx.aliasNodes),
  6912. _step;
  6913. try {
  6914. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  6915. var alias = _step.value;
  6916. alias.source = alias.source.node;
  6917. var name = anchors.getName(alias.source);
  6918. if (!name) {
  6919. name = anchors.newName();
  6920. anchors.map[name] = alias.source;
  6921. }
  6922. }
  6923. } catch (err) {
  6924. _iterator.e(err);
  6925. } finally {
  6926. _iterator.f();
  6927. }
  6928. }
  6929. if (item instanceof Pair) return item.toString(ctx, onComment, onChompKeep);
  6930. if (!tagObj) tagObj = getTagObject(schema.tags, item);
  6931. var props = stringifyProps(item, tagObj, ctx);
  6932. if (props.length > 0) ctx.indentAtStart = (ctx.indentAtStart || 0) + props.length + 1;
  6933. var str = typeof tagObj.stringify === 'function' ? tagObj.stringify(item, ctx, onComment, onChompKeep) : item instanceof Scalar ? stringifyString(item, ctx, onComment, onChompKeep) : item.toString(ctx, onComment, onChompKeep);
  6934. if (!props) return str;
  6935. return item instanceof Scalar || str[0] === '{' || str[0] === '[' ? "".concat(props, " ").concat(str) : "".concat(props, "\n").concat(ctx.indent).concat(str);
  6936. }
  6937. var Anchors = /*#__PURE__*/function () {
  6938. _createClass(Anchors, null, [{
  6939. key: "validAnchorNode",
  6940. value: function validAnchorNode(node) {
  6941. return node instanceof Scalar || node instanceof YAMLSeq || node instanceof YAMLMap;
  6942. }
  6943. }]);
  6944. function Anchors(prefix) {
  6945. _classCallCheck(this, Anchors);
  6946. _defineProperty(this, "map", {});
  6947. this.prefix = prefix;
  6948. }
  6949. _createClass(Anchors, [{
  6950. key: "createAlias",
  6951. value: function createAlias(node, name) {
  6952. this.setAnchor(node, name);
  6953. return new Alias$1(node);
  6954. }
  6955. }, {
  6956. key: "createMergePair",
  6957. value: function createMergePair() {
  6958. var _this = this;
  6959. var merge = new Merge();
  6960. for (var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++) {
  6961. sources[_key] = arguments[_key];
  6962. }
  6963. merge.value.items = sources.map(function (s) {
  6964. if (s instanceof Alias$1) {
  6965. if (s.source instanceof YAMLMap) return s;
  6966. } else if (s instanceof YAMLMap) {
  6967. return _this.createAlias(s);
  6968. }
  6969. throw new Error('Merge sources must be Map nodes or their Aliases');
  6970. });
  6971. return merge;
  6972. }
  6973. }, {
  6974. key: "getName",
  6975. value: function getName(node) {
  6976. var map = this.map;
  6977. return Object.keys(map).find(function (a) {
  6978. return map[a] === node;
  6979. });
  6980. }
  6981. }, {
  6982. key: "getNames",
  6983. value: function getNames() {
  6984. return Object.keys(this.map);
  6985. }
  6986. }, {
  6987. key: "getNode",
  6988. value: function getNode(name) {
  6989. return this.map[name];
  6990. }
  6991. }, {
  6992. key: "newName",
  6993. value: function newName(prefix) {
  6994. if (!prefix) prefix = this.prefix;
  6995. var names = Object.keys(this.map);
  6996. for (var i = 1; true; ++i) {
  6997. var name = "".concat(prefix).concat(i);
  6998. if (!names.includes(name)) return name;
  6999. }
  7000. } // During parsing, map & aliases contain CST nodes
  7001. }, {
  7002. key: "resolveNodes",
  7003. value: function resolveNodes() {
  7004. var map = this.map,
  7005. _cstAliases = this._cstAliases;
  7006. Object.keys(map).forEach(function (a) {
  7007. map[a] = map[a].resolved;
  7008. });
  7009. _cstAliases.forEach(function (a) {
  7010. a.source = a.source.resolved;
  7011. });
  7012. delete this._cstAliases;
  7013. }
  7014. }, {
  7015. key: "setAnchor",
  7016. value: function setAnchor(node, name) {
  7017. if (node != null && !Anchors.validAnchorNode(node)) {
  7018. throw new Error('Anchors may only be set for Scalar, Seq and Map nodes');
  7019. }
  7020. if (name && /[\x00-\x19\s,[\]{}]/.test(name)) {
  7021. throw new Error('Anchor names must not contain whitespace or control characters');
  7022. }
  7023. var map = this.map;
  7024. var prev = node && Object.keys(map).find(function (a) {
  7025. return map[a] === node;
  7026. });
  7027. if (prev) {
  7028. if (!name) {
  7029. return prev;
  7030. } else if (prev !== name) {
  7031. delete map[prev];
  7032. map[name] = node;
  7033. }
  7034. } else {
  7035. if (!name) {
  7036. if (!node) return null;
  7037. name = this.newName();
  7038. }
  7039. map[name] = node;
  7040. }
  7041. return name;
  7042. }
  7043. }]);
  7044. return Anchors;
  7045. }();
  7046. var visit = function visit(node, tags) {
  7047. if (node && _typeof(node) === 'object') {
  7048. var tag = node.tag;
  7049. if (node instanceof Collection$1) {
  7050. if (tag) tags[tag] = true;
  7051. node.items.forEach(function (n) {
  7052. return visit(n, tags);
  7053. });
  7054. } else if (node instanceof Pair) {
  7055. visit(node.key, tags);
  7056. visit(node.value, tags);
  7057. } else if (node instanceof Scalar) {
  7058. if (tag) tags[tag] = true;
  7059. }
  7060. }
  7061. return tags;
  7062. };
  7063. var listTagNames = function listTagNames(node) {
  7064. return Object.keys(visit(node, {}));
  7065. };
  7066. function parseContents(doc, contents) {
  7067. var comments = {
  7068. before: [],
  7069. after: []
  7070. };
  7071. var body = undefined;
  7072. var spaceBefore = false;
  7073. var _iterator = _createForOfIteratorHelper(contents),
  7074. _step;
  7075. try {
  7076. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  7077. var node = _step.value;
  7078. if (node.valueRange) {
  7079. if (body !== undefined) {
  7080. var msg = 'Document contains trailing content not separated by a ... or --- line';
  7081. doc.errors.push(new YAMLSyntaxError(node, msg));
  7082. break;
  7083. }
  7084. var res = resolveNode(doc, node);
  7085. if (spaceBefore) {
  7086. res.spaceBefore = true;
  7087. spaceBefore = false;
  7088. }
  7089. body = res;
  7090. } else if (node.comment !== null) {
  7091. var cc = body === undefined ? comments.before : comments.after;
  7092. cc.push(node.comment);
  7093. } else if (node.type === Type.BLANK_LINE) {
  7094. spaceBefore = true;
  7095. if (body === undefined && comments.before.length > 0 && !doc.commentBefore) {
  7096. // space-separated comments at start are parsed as document comments
  7097. doc.commentBefore = comments.before.join('\n');
  7098. comments.before = [];
  7099. }
  7100. }
  7101. }
  7102. } catch (err) {
  7103. _iterator.e(err);
  7104. } finally {
  7105. _iterator.f();
  7106. }
  7107. doc.contents = body || null;
  7108. if (!body) {
  7109. doc.comment = comments.before.concat(comments.after).join('\n') || null;
  7110. } else {
  7111. var cb = comments.before.join('\n');
  7112. if (cb) {
  7113. var cbNode = body instanceof Collection$1 && body.items[0] ? body.items[0] : body;
  7114. cbNode.commentBefore = cbNode.commentBefore ? "".concat(cb, "\n").concat(cbNode.commentBefore) : cb;
  7115. }
  7116. doc.comment = comments.after.join('\n') || null;
  7117. }
  7118. }
  7119. function resolveTagDirective(_ref, directive) {
  7120. var tagPrefixes = _ref.tagPrefixes;
  7121. var _directive$parameters = _slicedToArray(directive.parameters, 2),
  7122. handle = _directive$parameters[0],
  7123. prefix = _directive$parameters[1];
  7124. if (!handle || !prefix) {
  7125. var msg = 'Insufficient parameters given for %TAG directive';
  7126. throw new YAMLSemanticError(directive, msg);
  7127. }
  7128. if (tagPrefixes.some(function (p) {
  7129. return p.handle === handle;
  7130. })) {
  7131. var _msg = 'The %TAG directive must only be given at most once per handle in the same document.';
  7132. throw new YAMLSemanticError(directive, _msg);
  7133. }
  7134. return {
  7135. handle: handle,
  7136. prefix: prefix
  7137. };
  7138. }
  7139. function resolveYamlDirective(doc, directive) {
  7140. var _directive$parameters2 = _slicedToArray(directive.parameters, 1),
  7141. version = _directive$parameters2[0];
  7142. if (directive.name === 'YAML:1.0') version = '1.0';
  7143. if (!version) {
  7144. var msg = 'Insufficient parameters given for %YAML directive';
  7145. throw new YAMLSemanticError(directive, msg);
  7146. }
  7147. if (!documentOptions[version]) {
  7148. var v0 = doc.version || doc.options.version;
  7149. var _msg2 = "Document will be parsed as YAML ".concat(v0, " rather than YAML ").concat(version);
  7150. doc.warnings.push(new YAMLWarning(directive, _msg2));
  7151. }
  7152. return version;
  7153. }
  7154. function parseDirectives(doc, directives, prevDoc) {
  7155. var directiveComments = [];
  7156. var hasDirectives = false;
  7157. var _iterator = _createForOfIteratorHelper(directives),
  7158. _step;
  7159. try {
  7160. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  7161. var directive = _step.value;
  7162. var comment = directive.comment,
  7163. name = directive.name;
  7164. switch (name) {
  7165. case 'TAG':
  7166. try {
  7167. doc.tagPrefixes.push(resolveTagDirective(doc, directive));
  7168. } catch (error) {
  7169. doc.errors.push(error);
  7170. }
  7171. hasDirectives = true;
  7172. break;
  7173. case 'YAML':
  7174. case 'YAML:1.0':
  7175. if (doc.version) {
  7176. var msg = 'The %YAML directive must only be given at most once per document.';
  7177. doc.errors.push(new YAMLSemanticError(directive, msg));
  7178. }
  7179. try {
  7180. doc.version = resolveYamlDirective(doc, directive);
  7181. } catch (error) {
  7182. doc.errors.push(error);
  7183. }
  7184. hasDirectives = true;
  7185. break;
  7186. default:
  7187. if (name) {
  7188. var _msg3 = "YAML only supports %TAG and %YAML directives, and not %".concat(name);
  7189. doc.warnings.push(new YAMLWarning(directive, _msg3));
  7190. }
  7191. }
  7192. if (comment) directiveComments.push(comment);
  7193. }
  7194. } catch (err) {
  7195. _iterator.e(err);
  7196. } finally {
  7197. _iterator.f();
  7198. }
  7199. if (prevDoc && !hasDirectives && '1.1' === (doc.version || prevDoc.version || doc.options.version)) {
  7200. var copyTagPrefix = function copyTagPrefix(_ref2) {
  7201. var handle = _ref2.handle,
  7202. prefix = _ref2.prefix;
  7203. return {
  7204. handle: handle,
  7205. prefix: prefix
  7206. };
  7207. };
  7208. doc.tagPrefixes = prevDoc.tagPrefixes.map(copyTagPrefix);
  7209. doc.version = prevDoc.version;
  7210. }
  7211. doc.commentBefore = directiveComments.join('\n') || null;
  7212. }
  7213. function assertCollection(contents) {
  7214. if (contents instanceof Collection$1) return true;
  7215. throw new Error('Expected a YAML collection as document contents');
  7216. }
  7217. var Document$1 = /*#__PURE__*/function () {
  7218. function Document(options) {
  7219. _classCallCheck(this, Document);
  7220. this.anchors = new Anchors(options.anchorPrefix);
  7221. this.commentBefore = null;
  7222. this.comment = null;
  7223. this.contents = null;
  7224. this.directivesEndMarker = null;
  7225. this.errors = [];
  7226. this.options = options;
  7227. this.schema = null;
  7228. this.tagPrefixes = [];
  7229. this.version = null;
  7230. this.warnings = [];
  7231. }
  7232. _createClass(Document, [{
  7233. key: "add",
  7234. value: function add(value) {
  7235. assertCollection(this.contents);
  7236. return this.contents.add(value);
  7237. }
  7238. }, {
  7239. key: "addIn",
  7240. value: function addIn(path, value) {
  7241. assertCollection(this.contents);
  7242. this.contents.addIn(path, value);
  7243. }
  7244. }, {
  7245. key: "delete",
  7246. value: function _delete(key) {
  7247. assertCollection(this.contents);
  7248. return this.contents.delete(key);
  7249. }
  7250. }, {
  7251. key: "deleteIn",
  7252. value: function deleteIn(path) {
  7253. if (isEmptyPath(path)) {
  7254. if (this.contents == null) return false;
  7255. this.contents = null;
  7256. return true;
  7257. }
  7258. assertCollection(this.contents);
  7259. return this.contents.deleteIn(path);
  7260. }
  7261. }, {
  7262. key: "getDefaults",
  7263. value: function getDefaults() {
  7264. return Document.defaults[this.version] || Document.defaults[this.options.version] || {};
  7265. }
  7266. }, {
  7267. key: "get",
  7268. value: function get(key, keepScalar) {
  7269. return this.contents instanceof Collection$1 ? this.contents.get(key, keepScalar) : undefined;
  7270. }
  7271. }, {
  7272. key: "getIn",
  7273. value: function getIn(path, keepScalar) {
  7274. if (isEmptyPath(path)) return !keepScalar && this.contents instanceof Scalar ? this.contents.value : this.contents;
  7275. return this.contents instanceof Collection$1 ? this.contents.getIn(path, keepScalar) : undefined;
  7276. }
  7277. }, {
  7278. key: "has",
  7279. value: function has(key) {
  7280. return this.contents instanceof Collection$1 ? this.contents.has(key) : false;
  7281. }
  7282. }, {
  7283. key: "hasIn",
  7284. value: function hasIn(path) {
  7285. if (isEmptyPath(path)) return this.contents !== undefined;
  7286. return this.contents instanceof Collection$1 ? this.contents.hasIn(path) : false;
  7287. }
  7288. }, {
  7289. key: "set",
  7290. value: function set(key, value) {
  7291. assertCollection(this.contents);
  7292. this.contents.set(key, value);
  7293. }
  7294. }, {
  7295. key: "setIn",
  7296. value: function setIn(path, value) {
  7297. if (isEmptyPath(path)) this.contents = value;else {
  7298. assertCollection(this.contents);
  7299. this.contents.setIn(path, value);
  7300. }
  7301. }
  7302. }, {
  7303. key: "setSchema",
  7304. value: function setSchema(id, customTags) {
  7305. if (!id && !customTags && this.schema) return;
  7306. if (typeof id === 'number') id = id.toFixed(1);
  7307. if (id === '1.0' || id === '1.1' || id === '1.2') {
  7308. if (this.version) this.version = id;else this.options.version = id;
  7309. delete this.options.schema;
  7310. } else if (id && typeof id === 'string') {
  7311. this.options.schema = id;
  7312. }
  7313. if (Array.isArray(customTags)) this.options.customTags = customTags;
  7314. var opt = Object.assign({}, this.getDefaults(), this.options);
  7315. this.schema = new Schema(opt);
  7316. }
  7317. }, {
  7318. key: "parse",
  7319. value: function parse(node, prevDoc) {
  7320. if (this.options.keepCstNodes) this.cstNode = node;
  7321. if (this.options.keepNodeTypes) this.type = 'DOCUMENT';
  7322. var _node$directives = node.directives,
  7323. directives = _node$directives === void 0 ? [] : _node$directives,
  7324. _node$contents = node.contents,
  7325. contents = _node$contents === void 0 ? [] : _node$contents,
  7326. directivesEndMarker = node.directivesEndMarker,
  7327. error = node.error,
  7328. valueRange = node.valueRange;
  7329. if (error) {
  7330. if (!error.source) error.source = this;
  7331. this.errors.push(error);
  7332. }
  7333. parseDirectives(this, directives, prevDoc);
  7334. if (directivesEndMarker) this.directivesEndMarker = true;
  7335. this.range = valueRange ? [valueRange.start, valueRange.end] : null;
  7336. this.setSchema();
  7337. this.anchors._cstAliases = [];
  7338. parseContents(this, contents);
  7339. this.anchors.resolveNodes();
  7340. if (this.options.prettyErrors) {
  7341. var _iterator = _createForOfIteratorHelper(this.errors),
  7342. _step;
  7343. try {
  7344. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  7345. var _error = _step.value;
  7346. if (_error instanceof YAMLError) _error.makePretty();
  7347. }
  7348. } catch (err) {
  7349. _iterator.e(err);
  7350. } finally {
  7351. _iterator.f();
  7352. }
  7353. var _iterator2 = _createForOfIteratorHelper(this.warnings),
  7354. _step2;
  7355. try {
  7356. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  7357. var warn = _step2.value;
  7358. if (warn instanceof YAMLError) warn.makePretty();
  7359. }
  7360. } catch (err) {
  7361. _iterator2.e(err);
  7362. } finally {
  7363. _iterator2.f();
  7364. }
  7365. }
  7366. return this;
  7367. }
  7368. }, {
  7369. key: "listNonDefaultTags",
  7370. value: function listNonDefaultTags() {
  7371. return listTagNames(this.contents).filter(function (t) {
  7372. return t.indexOf(Schema.defaultPrefix) !== 0;
  7373. });
  7374. }
  7375. }, {
  7376. key: "setTagPrefix",
  7377. value: function setTagPrefix(handle, prefix) {
  7378. if (handle[0] !== '!' || handle[handle.length - 1] !== '!') throw new Error('Handle must start and end with !');
  7379. if (prefix) {
  7380. var prev = this.tagPrefixes.find(function (p) {
  7381. return p.handle === handle;
  7382. });
  7383. if (prev) prev.prefix = prefix;else this.tagPrefixes.push({
  7384. handle: handle,
  7385. prefix: prefix
  7386. });
  7387. } else {
  7388. this.tagPrefixes = this.tagPrefixes.filter(function (p) {
  7389. return p.handle !== handle;
  7390. });
  7391. }
  7392. }
  7393. }, {
  7394. key: "toJSON",
  7395. value: function toJSON$1(arg, onAnchor) {
  7396. var _this = this;
  7397. var _this$options = this.options,
  7398. keepBlobsInJSON = _this$options.keepBlobsInJSON,
  7399. mapAsMap = _this$options.mapAsMap,
  7400. maxAliasCount = _this$options.maxAliasCount;
  7401. var keep = keepBlobsInJSON && (typeof arg !== 'string' || !(this.contents instanceof Scalar));
  7402. var ctx = {
  7403. doc: this,
  7404. indentStep: ' ',
  7405. keep: keep,
  7406. mapAsMap: keep && !!mapAsMap,
  7407. maxAliasCount: maxAliasCount,
  7408. stringify: stringify // Requiring directly in Pair would create circular dependencies
  7409. };
  7410. var anchorNames = Object.keys(this.anchors.map);
  7411. if (anchorNames.length > 0) ctx.anchors = new Map(anchorNames.map(function (name) {
  7412. return [_this.anchors.map[name], {
  7413. alias: [],
  7414. aliasCount: 0,
  7415. count: 1
  7416. }];
  7417. }));
  7418. var res = toJSON(this.contents, arg, ctx);
  7419. if (typeof onAnchor === 'function' && ctx.anchors) {
  7420. var _iterator3 = _createForOfIteratorHelper(ctx.anchors.values()),
  7421. _step3;
  7422. try {
  7423. for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
  7424. var _step3$value = _step3.value,
  7425. count = _step3$value.count,
  7426. _res = _step3$value.res;
  7427. onAnchor(_res, count);
  7428. }
  7429. } catch (err) {
  7430. _iterator3.e(err);
  7431. } finally {
  7432. _iterator3.f();
  7433. }
  7434. }
  7435. return res;
  7436. }
  7437. }, {
  7438. key: "toString",
  7439. value: function toString() {
  7440. if (this.errors.length > 0) throw new Error('Document with errors cannot be stringified');
  7441. var indentSize = this.options.indent;
  7442. if (!Number.isInteger(indentSize) || indentSize <= 0) {
  7443. var s = JSON.stringify(indentSize);
  7444. throw new Error("\"indent\" option must be a positive integer, not ".concat(s));
  7445. }
  7446. this.setSchema();
  7447. var lines = [];
  7448. var hasDirectives = false;
  7449. if (this.version) {
  7450. var vd = '%YAML 1.2';
  7451. if (this.schema.name === 'yaml-1.1') {
  7452. if (this.version === '1.0') vd = '%YAML:1.0';else if (this.version === '1.1') vd = '%YAML 1.1';
  7453. }
  7454. lines.push(vd);
  7455. hasDirectives = true;
  7456. }
  7457. var tagNames = this.listNonDefaultTags();
  7458. this.tagPrefixes.forEach(function (_ref) {
  7459. var handle = _ref.handle,
  7460. prefix = _ref.prefix;
  7461. if (tagNames.some(function (t) {
  7462. return t.indexOf(prefix) === 0;
  7463. })) {
  7464. lines.push("%TAG ".concat(handle, " ").concat(prefix));
  7465. hasDirectives = true;
  7466. }
  7467. });
  7468. if (hasDirectives || this.directivesEndMarker) lines.push('---');
  7469. if (this.commentBefore) {
  7470. if (hasDirectives || !this.directivesEndMarker) lines.unshift('');
  7471. lines.unshift(this.commentBefore.replace(/^/gm, '#'));
  7472. }
  7473. var ctx = {
  7474. anchors: {},
  7475. doc: this,
  7476. indent: '',
  7477. indentStep: ' '.repeat(indentSize),
  7478. stringify: stringify // Requiring directly in nodes would create circular dependencies
  7479. };
  7480. var chompKeep = false;
  7481. var contentComment = null;
  7482. if (this.contents) {
  7483. if (this.contents instanceof Node$1) {
  7484. if (this.contents.spaceBefore && (hasDirectives || this.directivesEndMarker)) lines.push('');
  7485. if (this.contents.commentBefore) lines.push(this.contents.commentBefore.replace(/^/gm, '#')); // top-level block scalars need to be indented if followed by a comment
  7486. ctx.forceBlockIndent = !!this.comment;
  7487. contentComment = this.contents.comment;
  7488. }
  7489. var onChompKeep = contentComment ? null : function () {
  7490. return chompKeep = true;
  7491. };
  7492. var body = stringify(this.contents, ctx, function () {
  7493. return contentComment = null;
  7494. }, onChompKeep);
  7495. lines.push(addComment(body, '', contentComment));
  7496. } else if (this.contents !== undefined) {
  7497. lines.push(stringify(this.contents, ctx));
  7498. }
  7499. if (this.comment) {
  7500. if ((!chompKeep || contentComment) && lines[lines.length - 1] !== '') lines.push('');
  7501. lines.push(this.comment.replace(/^/gm, '#'));
  7502. }
  7503. return lines.join('\n') + '\n';
  7504. }
  7505. }]);
  7506. return Document;
  7507. }();
  7508. _defineProperty(Document$1, "defaults", documentOptions);
  7509. function createNode$1(value) {
  7510. var wrapScalars = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  7511. var tag = arguments.length > 2 ? arguments[2] : undefined;
  7512. if (tag === undefined && typeof wrapScalars === 'string') {
  7513. tag = wrapScalars;
  7514. wrapScalars = true;
  7515. }
  7516. var options = Object.assign({}, Document$1.defaults[defaultOptions.version], defaultOptions);
  7517. var schema = new Schema(options);
  7518. return schema.createNode(value, wrapScalars, tag);
  7519. }
  7520. var Document$1$1 = /*#__PURE__*/function (_YAMLDocument) {
  7521. _inherits(Document, _YAMLDocument);
  7522. var _super = _createSuper(Document);
  7523. function Document(options) {
  7524. _classCallCheck(this, Document);
  7525. return _super.call(this, Object.assign({}, defaultOptions, options));
  7526. }
  7527. return Document;
  7528. }(Document$1);
  7529. function parseAllDocuments(src, options) {
  7530. var stream = [];
  7531. var prev;
  7532. var _iterator = _createForOfIteratorHelper(parse(src)),
  7533. _step;
  7534. try {
  7535. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  7536. var cstDoc = _step.value;
  7537. var doc = new Document$1$1(options);
  7538. doc.parse(cstDoc, prev);
  7539. stream.push(doc);
  7540. prev = doc;
  7541. }
  7542. } catch (err) {
  7543. _iterator.e(err);
  7544. } finally {
  7545. _iterator.f();
  7546. }
  7547. return stream;
  7548. }
  7549. function parseDocument(src, options) {
  7550. var cst = parse(src);
  7551. var doc = new Document$1$1(options).parse(cst[0]);
  7552. if (cst.length > 1) {
  7553. var errMsg = 'Source contains multiple documents; please use YAML.parseAllDocuments()';
  7554. doc.errors.unshift(new YAMLSemanticError(cst[1], errMsg));
  7555. }
  7556. return doc;
  7557. }
  7558. function parse$1(src, options) {
  7559. var doc = parseDocument(src, options);
  7560. doc.warnings.forEach(function (warning) {
  7561. return warn(warning);
  7562. });
  7563. if (doc.errors.length > 0) throw doc.errors[0];
  7564. return doc.toJSON();
  7565. }
  7566. function stringify$1(value, options) {
  7567. var doc = new Document$1$1(options);
  7568. doc.contents = value;
  7569. return String(doc);
  7570. }
  7571. var YAML = {
  7572. createNode: createNode$1,
  7573. defaultOptions: defaultOptions,
  7574. Document: Document$1$1,
  7575. parse: parse$1,
  7576. parseAllDocuments: parseAllDocuments,
  7577. parseCST: parse,
  7578. parseDocument: parseDocument,
  7579. scalarOptions: scalarOptions,
  7580. stringify: stringify$1
  7581. };
  7582. var dist = /*#__PURE__*/Object.freeze({
  7583. __proto__: null,
  7584. YAML: YAML
  7585. });
  7586. function getAugmentedNamespace(n) {
  7587. if (n.__esModule) return n;
  7588. var a = Object.defineProperty({}, '__esModule', {value: true});
  7589. Object.keys(n).forEach(function (k) {
  7590. var d = Object.getOwnPropertyDescriptor(n, k);
  7591. Object.defineProperty(a, k, d.get ? d : {
  7592. enumerable: true,
  7593. get: function () {
  7594. return n[k];
  7595. }
  7596. });
  7597. });
  7598. return a;
  7599. }
  7600. var require$$0 = /*@__PURE__*/getAugmentedNamespace(dist);
  7601. var browser = require$$0.YAML;
  7602. // ------------------------------------------------------------
  7603. // ccards processor
  7604. // ------------------------------------------------------------
  7605. var ccardProcessor = /** @class */ (function () {
  7606. function ccardProcessor(app) {
  7607. this.app = app;
  7608. }
  7609. ccardProcessor.prototype.run = function (source, el, ctx, folderNote) {
  7610. return __awaiter(this, void 0, void 0, function () {
  7611. var yaml, docEl, docEl, error_1;
  7612. return __generator(this, function (_a) {
  7613. switch (_a.label) {
  7614. case 0:
  7615. _a.trys.push([0, 5, , 6]);
  7616. yaml = browser.parse(source);
  7617. if (!yaml)
  7618. return [2 /*return*/];
  7619. // set default
  7620. if (yaml.type === undefined)
  7621. yaml.type = 'static';
  7622. if (yaml.style === undefined)
  7623. yaml.style = 'card';
  7624. if (!(yaml.type == 'static')) return [3 /*break*/, 2];
  7625. return [4 /*yield*/, this.docElemStatic(yaml)];
  7626. case 1:
  7627. docEl = _a.sent();
  7628. if (docEl) {
  7629. el.appendChild(docEl);
  7630. }
  7631. return [3 /*break*/, 4];
  7632. case 2:
  7633. if (!(yaml.type == 'folder_brief_live')) return [3 /*break*/, 4];
  7634. return [4 /*yield*/, this.docElemFolderBriefLive(yaml, folderNote)];
  7635. case 3:
  7636. docEl = _a.sent();
  7637. if (docEl) {
  7638. el.appendChild(docEl);
  7639. }
  7640. _a.label = 4;
  7641. case 4: return [3 /*break*/, 6];
  7642. case 5:
  7643. error_1 = _a.sent();
  7644. console.log('Code Block: ccard', error_1);
  7645. return [3 /*break*/, 6];
  7646. case 6: return [2 /*return*/];
  7647. }
  7648. });
  7649. });
  7650. };
  7651. // static
  7652. ccardProcessor.prototype.docElemStatic = function (yaml) {
  7653. return __awaiter(this, void 0, void 0, function () {
  7654. var cardBlock, cardsElem;
  7655. return __generator(this, function (_a) {
  7656. if (yaml.items && (yaml.items instanceof Array)) {
  7657. cardBlock = new CardBlock();
  7658. cardBlock.fromYamlCards(yaml);
  7659. cardsElem = cardBlock.getDocElement(this.app);
  7660. return [2 /*return*/, cardsElem];
  7661. }
  7662. return [2 /*return*/, null];
  7663. });
  7664. });
  7665. };
  7666. // folder_brief_live
  7667. ccardProcessor.prototype.docElemFolderBriefLive = function (yaml, folderNote) {
  7668. return __awaiter(this, void 0, void 0, function () {
  7669. var folderPath, activeFile, notePath, folderExist, view, folderBrief, briefCards, ccardElem;
  7670. return __generator(this, function (_a) {
  7671. switch (_a.label) {
  7672. case 0:
  7673. folderPath = '';
  7674. activeFile = this.app.workspace.getActiveFile();
  7675. notePath = activeFile.path;
  7676. if (!yaml.folder) return [3 /*break*/, 2];
  7677. return [4 /*yield*/, this.app.vault.adapter.exists(yaml.folder)];
  7678. case 1:
  7679. folderExist = _a.sent();
  7680. if (folderExist)
  7681. folderPath = yaml.folder;
  7682. return [3 /*break*/, 4];
  7683. case 2: return [4 /*yield*/, folderNote.getNoteFolderBriefPath(notePath)];
  7684. case 3:
  7685. folderPath = _a.sent();
  7686. _a.label = 4;
  7687. case 4:
  7688. if (!(folderPath.length > 0)) return [3 /*break*/, 6];
  7689. view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
  7690. if (!view) return [3 /*break*/, 6];
  7691. folderBrief = new FolderBrief(this.app);
  7692. // brief options
  7693. if (yaml.briefMax) {
  7694. folderBrief.briefMax = yaml.briefMax;
  7695. }
  7696. if (yaml.noteOnly != undefined) {
  7697. folderBrief.noteOnly = yaml.noteOnly;
  7698. }
  7699. return [4 /*yield*/, folderBrief.makeBriefCards(folderPath, notePath)];
  7700. case 5:
  7701. briefCards = _a.sent();
  7702. briefCards.fromYamlOptions(yaml);
  7703. ccardElem = briefCards.getDocElement(this.app);
  7704. return [2 /*return*/, ccardElem];
  7705. case 6: return [2 /*return*/, null];
  7706. }
  7707. });
  7708. });
  7709. };
  7710. return ccardProcessor;
  7711. }());
  7712. var FOLDER_NOTE_DEFAULT_SETTINGS = {
  7713. folderNoteHide: true,
  7714. folderNoteType: 'inside',
  7715. folderNoteName: '_about_',
  7716. folderNoteKey: 'ctrl',
  7717. folderNoteAutoRename: true,
  7718. folderDelete2Note: false,
  7719. folderNoteStrInit: '# {{FOLDER_NAME}} Overview\n {{FOLDER_BRIEF_LIVE}} \n'
  7720. };
  7721. // ------------------------------------------------------------
  7722. // Settings Tab
  7723. // ------------------------------------------------------------
  7724. var FolderNoteSettingTab = /** @class */ (function (_super) {
  7725. __extends(FolderNoteSettingTab, _super);
  7726. function FolderNoteSettingTab(app, plugin) {
  7727. var _this = _super.call(this, app, plugin) || this;
  7728. _this.plugin = plugin;
  7729. return _this;
  7730. }
  7731. FolderNoteSettingTab.prototype.display = function () {
  7732. var _this = this;
  7733. var containerEl = this.containerEl;
  7734. containerEl.empty();
  7735. containerEl.createEl('h2', { text: 'Folder Note Plugin: Settings.' });
  7736. new obsidian.Setting(containerEl)
  7737. .setName('Note File Method')
  7738. .setDesc('Select the method to put your folder note file. (Read doc for more information.)')
  7739. .addDropdown(function (dropDown) {
  7740. return dropDown
  7741. .addOption('index', 'Index File')
  7742. .addOption('inside', 'Folder Name Inside')
  7743. .addOption('outside', 'Folder Name Outside')
  7744. .setValue(_this.plugin.settings.folderNoteType || 'inside')
  7745. .onChange(function (value) {
  7746. _this.plugin.settings.folderNoteType = value;
  7747. _this.plugin.saveSettings();
  7748. _this.display();
  7749. });
  7750. });
  7751. if (this.plugin.settings.folderNoteType == 'index') {
  7752. new obsidian.Setting(containerEl)
  7753. .setName('Index File Name')
  7754. .setDesc('Set the index file name for folder note. (only for the Index method)')
  7755. .addText(function (text) { return text
  7756. .setValue(_this.plugin.settings.folderNoteName)
  7757. .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
  7758. return __generator(this, function (_a) {
  7759. switch (_a.label) {
  7760. case 0:
  7761. // console.log('Secret: ' + value);
  7762. this.plugin.settings.folderNoteName = value;
  7763. return [4 /*yield*/, this.plugin.saveSettings()];
  7764. case 1:
  7765. _a.sent();
  7766. return [2 /*return*/];
  7767. }
  7768. });
  7769. }); }); });
  7770. }
  7771. new obsidian.Setting(containerEl)
  7772. .setName('Inital Content')
  7773. .setDesc('Set the inital content for new folder note. {{FOLDER_NAME}} will be replaced with current folder name.')
  7774. .addTextArea(function (text) {
  7775. text
  7776. .setPlaceholder('About the folder.')
  7777. .setValue(_this.plugin.settings.folderNoteStrInit)
  7778. .onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
  7779. return __generator(this, function (_a) {
  7780. switch (_a.label) {
  7781. case 0:
  7782. _a.trys.push([0, 2, , 3]);
  7783. this.plugin.settings.folderNoteStrInit = value;
  7784. return [4 /*yield*/, this.plugin.saveSettings()];
  7785. case 1:
  7786. _a.sent();
  7787. return [3 /*break*/, 3];
  7788. case 2:
  7789. _a.sent();
  7790. return [2 /*return*/, false];
  7791. case 3: return [2 /*return*/];
  7792. }
  7793. });
  7794. }); });
  7795. text.inputEl.rows = 8;
  7796. text.inputEl.cols = 50;
  7797. });
  7798. new obsidian.Setting(containerEl)
  7799. .setName('Key for New Note')
  7800. .setDesc('Key + Click a folder to create folder note file. ')
  7801. .addDropdown(function (dropDown) {
  7802. return dropDown
  7803. .addOption('ctrl', 'Ctrl + Click')
  7804. .addOption('alt', 'Alt + Click')
  7805. .setValue(_this.plugin.settings.folderNoteKey || 'ctrl')
  7806. .onChange(function (value) {
  7807. _this.plugin.settings.folderNoteKey = value;
  7808. _this.plugin.saveSettings();
  7809. });
  7810. });
  7811. new obsidian.Setting(containerEl)
  7812. .setName('Hide Folder Note')
  7813. .setDesc('Hide the folder note file in the file explorer panel.')
  7814. .addToggle(function (toggle) {
  7815. toggle.setValue(_this.plugin.settings.folderNoteHide);
  7816. toggle.onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
  7817. return __generator(this, function (_a) {
  7818. switch (_a.label) {
  7819. case 0:
  7820. this.plugin.settings.folderNoteHide = value;
  7821. return [4 /*yield*/, this.plugin.saveSettings()];
  7822. case 1:
  7823. _a.sent();
  7824. return [2 /*return*/];
  7825. }
  7826. });
  7827. }); });
  7828. });
  7829. if (this.plugin.settings.folderNoteType != 'index') {
  7830. new obsidian.Setting(containerEl)
  7831. .setName('Auto Rename')
  7832. .setDesc('Try to automatically rename the folder note if a folder name is changed. (Experimental)')
  7833. .addToggle(function (toggle) {
  7834. toggle.setValue(_this.plugin.settings.folderNoteAutoRename);
  7835. toggle.onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
  7836. return __generator(this, function (_a) {
  7837. switch (_a.label) {
  7838. case 0:
  7839. this.plugin.settings.folderNoteAutoRename = value;
  7840. return [4 /*yield*/, this.plugin.saveSettings()];
  7841. case 1:
  7842. _a.sent();
  7843. return [2 /*return*/];
  7844. }
  7845. });
  7846. }); });
  7847. });
  7848. }
  7849. if (this.plugin.settings.folderNoteType == 'outside') {
  7850. new obsidian.Setting(containerEl)
  7851. .setName('Delete Folder Note')
  7852. .setDesc('Try to delete folder note when a folder is deleted. (Dangerous)')
  7853. .addToggle(function (toggle) {
  7854. toggle.setValue(_this.plugin.settings.folderDelete2Note);
  7855. toggle.onChange(function (value) { return __awaiter(_this, void 0, void 0, function () {
  7856. return __generator(this, function (_a) {
  7857. switch (_a.label) {
  7858. case 0:
  7859. this.plugin.settings.folderDelete2Note = value;
  7860. return [4 /*yield*/, this.plugin.saveSettings()];
  7861. case 1:
  7862. _a.sent();
  7863. return [2 /*return*/];
  7864. }
  7865. });
  7866. }); });
  7867. });
  7868. }
  7869. };
  7870. return FolderNoteSettingTab;
  7871. }(obsidian.PluginSettingTab));
  7872. // ------------------------------------------------------------
  7873. // FolderNotePlugin
  7874. // ------------------------------------------------------------
  7875. var NoteFileMethod$1;
  7876. (function (NoteFileMethod) {
  7877. NoteFileMethod[NoteFileMethod["Index"] = 0] = "Index";
  7878. NoteFileMethod[NoteFileMethod["Inside"] = 1] = "Inside";
  7879. NoteFileMethod[NoteFileMethod["Outside"] = 2] = "Outside";
  7880. })(NoteFileMethod$1 || (NoteFileMethod$1 = {}));
  7881. var FolderNotePlugin = /** @class */ (function (_super) {
  7882. __extends(FolderNotePlugin, _super);
  7883. function FolderNotePlugin() {
  7884. return _super !== null && _super.apply(this, arguments) || this;
  7885. }
  7886. FolderNotePlugin.prototype.onload = function () {
  7887. return __awaiter(this, void 0, void 0, function () {
  7888. var _this = this;
  7889. return __generator(this, function (_a) {
  7890. switch (_a.label) {
  7891. case 0:
  7892. console.log('Loading Folder Note plugin.');
  7893. // load settings
  7894. return [4 /*yield*/, this.loadSettings()];
  7895. case 1:
  7896. // load settings
  7897. _a.sent();
  7898. // for ccard rendering
  7899. this.registerMarkdownCodeBlockProcessor('ccard', function (source, el, ctx) { return __awaiter(_this, void 0, void 0, function () {
  7900. var proc;
  7901. return __generator(this, function (_a) {
  7902. switch (_a.label) {
  7903. case 0:
  7904. proc = new ccardProcessor(this.app);
  7905. return [4 /*yield*/, proc.run(source, el, ctx, this.folderNote)];
  7906. case 1:
  7907. _a.sent();
  7908. return [2 /*return*/];
  7909. }
  7910. });
  7911. }); });
  7912. // for rename event
  7913. this.registerEvent(this.app.vault.on('rename', function (newPath, oldPath) { return _this.handleFileRename(newPath, oldPath); }));
  7914. // for remove folder
  7915. this.registerEvent(this.app.vault.on('delete', function (file) { return _this.handleFileDelete(file); }));
  7916. // for settings
  7917. this.addSettingTab(new FolderNoteSettingTab(this.app, this));
  7918. // for file explorer click
  7919. this.registerDomEvent(document, 'click', function (evt) {
  7920. // get the folder path
  7921. var elemTarget = evt.target;
  7922. var folderElem = _this.folderNote.setByFolderElement(elemTarget);
  7923. // open the infor note
  7924. if (_this.folderNote.folderPath.length > 0) {
  7925. // any key?
  7926. var newKey = false;
  7927. if (_this.settings.folderNoteKey == 'ctrl') {
  7928. newKey = (evt.ctrlKey || evt.metaKey);
  7929. }
  7930. else if (_this.settings.folderNoteKey == 'alt') {
  7931. newKey = evt.altKey;
  7932. }
  7933. // open it
  7934. _this.folderNote.openFolderNote(folderElem, newKey);
  7935. }
  7936. });
  7937. this.addCommand({
  7938. id: 'insert-folder-brief',
  7939. name: 'Insert Folder Brief',
  7940. callback: function () { return __awaiter(_this, void 0, void 0, function () {
  7941. var view, editor, activeFile, folderBrief, folderPath, briefCards;
  7942. return __generator(this, function (_a) {
  7943. switch (_a.label) {
  7944. case 0:
  7945. view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
  7946. if (!view) return [3 /*break*/, 3];
  7947. editor = view.sourceMode.cmEditor;
  7948. activeFile = this.app.workspace.getActiveFile();
  7949. folderBrief = new FolderBrief(this.app);
  7950. return [4 /*yield*/, this.folderNote.getNoteFolderBriefPath(activeFile.path)];
  7951. case 1:
  7952. folderPath = _a.sent();
  7953. return [4 /*yield*/, folderBrief.makeBriefCards(folderPath, activeFile.path)];
  7954. case 2:
  7955. briefCards = _a.sent();
  7956. editor.replaceSelection(briefCards.getYamlCode(), "end");
  7957. _a.label = 3;
  7958. case 3: return [2 /*return*/];
  7959. }
  7960. });
  7961. }); },
  7962. hotkeys: []
  7963. });
  7964. this.addCommand({
  7965. id: 'note-to-folder',
  7966. name: 'Make Current Note to Folder',
  7967. callback: function () { return __awaiter(_this, void 0, void 0, function () {
  7968. var view, activeFile;
  7969. return __generator(this, function (_a) {
  7970. switch (_a.label) {
  7971. case 0:
  7972. view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView);
  7973. if (!view) return [3 /*break*/, 2];
  7974. activeFile = this.app.workspace.getActiveFile();
  7975. this.folderNote.setByNotePath(activeFile.path);
  7976. return [4 /*yield*/, this.folderNote.newNoteFolder()];
  7977. case 1:
  7978. _a.sent();
  7979. _a.label = 2;
  7980. case 2: return [2 /*return*/];
  7981. }
  7982. });
  7983. }); },
  7984. hotkeys: []
  7985. });
  7986. return [2 /*return*/];
  7987. }
  7988. });
  7989. });
  7990. };
  7991. FolderNotePlugin.prototype.onunload = function () {
  7992. console.log('Unloading Folder Note plugin');
  7993. };
  7994. FolderNotePlugin.prototype.updateFolderNote = function () {
  7995. this.folderNote = new FolderNote(this.app, this.settings.folderNoteType, this.settings.folderNoteName);
  7996. this.folderNote.initContent = this.settings.folderNoteStrInit;
  7997. this.folderNote.hideNoteFile = this.settings.folderNoteHide;
  7998. };
  7999. FolderNotePlugin.prototype.loadSettings = function () {
  8000. return __awaiter(this, void 0, void 0, function () {
  8001. var _a, _b, _c, _d;
  8002. return __generator(this, function (_e) {
  8003. switch (_e.label) {
  8004. case 0:
  8005. _a = this;
  8006. _c = (_b = Object).assign;
  8007. _d = [FOLDER_NOTE_DEFAULT_SETTINGS];
  8008. return [4 /*yield*/, this.loadData()];
  8009. case 1:
  8010. _a.settings = _c.apply(_b, _d.concat([_e.sent()]));
  8011. this.updateFolderNote();
  8012. return [2 /*return*/];
  8013. }
  8014. });
  8015. });
  8016. };
  8017. FolderNotePlugin.prototype.saveSettings = function () {
  8018. return __awaiter(this, void 0, void 0, function () {
  8019. return __generator(this, function (_a) {
  8020. switch (_a.label) {
  8021. case 0: return [4 /*yield*/, this.saveData(this.settings)];
  8022. case 1:
  8023. _a.sent();
  8024. this.updateFolderNote();
  8025. return [2 /*return*/];
  8026. }
  8027. });
  8028. });
  8029. };
  8030. // keep notefile name to be the folder name
  8031. FolderNotePlugin.prototype.handleFileRename = function (newPath, oldPath) {
  8032. return __awaiter(this, void 0, void 0, function () {
  8033. return __generator(this, function (_a) {
  8034. if (!this.settings.folderNoteAutoRename)
  8035. return [2 /*return*/];
  8036. this.folderNote.syncName(newPath, oldPath);
  8037. return [2 /*return*/];
  8038. });
  8039. });
  8040. };
  8041. // delete folder
  8042. FolderNotePlugin.prototype.handleFileDelete = function (pathToDel) {
  8043. return __awaiter(this, void 0, void 0, function () {
  8044. return __generator(this, function (_a) {
  8045. if (!this.settings.folderDelete2Note)
  8046. return [2 /*return*/];
  8047. this.folderNote.deleteFolder(pathToDel.path);
  8048. return [2 /*return*/];
  8049. });
  8050. });
  8051. };
  8052. return FolderNotePlugin;
  8053. }(obsidian.Plugin));
  8054. module.exports = FolderNotePlugin;
  8055. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9jYXJkLWl0ZW0udHMiLCJzcmMvZm9sZGVyLWJyaWVmLnRzIiwic3JjL2ZvbGRlci1ub3RlLnRzIiwibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L1BsYWluVmFsdWUtZmY1MTQ3YzYuanMiLCJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UtY3N0LmpzIiwibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3Jlc29sdmVTZXEtMDQ4MjVmMzAuanMiLCJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvd2FybmluZ3MtMGU0YjcwZDMuanMiLCJub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvU2NoZW1hLTJiZjJjNzRlLmpzIiwibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9pbmRleC5qcyIsInNyYy9jY2FyZC1ibG9jay50cyIsInNyYy9zZXR0aW5ncy50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tKSB7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKylcclxuICAgICAgICB0b1tqXSA9IGZyb21baV07XHJcbiAgICByZXR1cm4gdG87XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHtcclxuICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBnZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgcHJpdmF0ZU1hcCwgdmFsdWUpIHtcclxuICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlTWFwLnNldChyZWNlaXZlciwgdmFsdWUpO1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG59XHJcbiIsIlxuaW1wb3J0IHsgQXBwLCB9IGZyb20gXCJvYnNpZGlhblwiO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENhcmQgYmxvY2tcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgZW51bSBDYXJkU3R5bGUge1xuICAgIEZvbGRlciwgTm90ZSwgSW1hZ2UsXG59XG5cbmV4cG9ydCBjbGFzcyBDYXJkQmxvY2sge1xuICAgIHN0eWxlOiBzdHJpbmc7XG4gICAgY29sOiBudW1iZXI7XG4gICAgY2FyZHM6IENhcmRJdGVtW107XG4gICAgaW1hZ2VQcmVmaXg6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnN0eWxlID0gJ2NhcmQnO1xuICAgICAgICB0aGlzLmNhcmRzID0gW107XG4gICAgICAgIHRoaXMuY29sID0gLTE7XG4gICAgICAgIHRoaXMuaW1hZ2VQcmVmaXggPSAnJztcbiAgICB9XG5cbiAgICBhZGRDYXJkKGNhcmQ6IENhcmRJdGVtKSB7XG4gICAgICAgIHRoaXMuY2FyZHMucHVzaChjYXJkKTtcbiAgICB9XG5cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5jYXJkcyA9IFtdO1xuICAgIH1cblxuICAgIGdldENhcmROdW0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcmRzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBnZXREb2NFbGVtZW50KGFwcDogQXBwKSB7XG4gICAgICAgIGNvbnN0IGNhcmREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgPT0gJ3N0cmlwJykge1xuICAgICAgICAgICAgY2FyZERpdi5hZGRDbGFzcygnc3RyaXAtY2FyZC1iYW5kJyk7XG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuY2FyZHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2FyZEVsID0gdGhpcy5jYXJkc1tpXS5nZXRCb3hFbGVtZW50KGFwcCwgdGhpcy5pbWFnZVByZWZpeCk7XG4gICAgICAgICAgICAgICAgY2FyZEVsLmFkZENsYXNzKCdzdHJpcC1jYXJkLXZpZXcnKTtcbiAgICAgICAgICAgICAgICBjYXJkRGl2LmFwcGVuZENoaWxkKGNhcmRFbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIGRlZmF1bHQ6IHRoaXMuc3R5bGUgPT0gJ2NhcmQnXG4gICAgICAgICAgICBjYXJkRGl2LmFkZENsYXNzKCdjdXRlLWNhcmQtYmFuZCcpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmNhcmRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNhcmRFbCA9IHRoaXMuY2FyZHNbaV0uZ2V0Qm94RWxlbWVudChhcHAsIHRoaXMuaW1hZ2VQcmVmaXgpO1xuICAgICAgICAgICAgICAgIGNhcmRFbC5hZGRDbGFzcygnY3V0ZS1jYXJkLXZpZXcnKTtcbiAgICAgICAgICAgICAgICBjYXJkRGl2LmFwcGVuZENoaWxkKGNhcmRFbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jb2wgPiAwKSB7XG4gICAgICAgICAgICAgICAgY2FyZERpdi5zZXRBdHRyKCdzdHlsZScgLCBcbiAgICAgICAgICAgICAgICBgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoJHt0aGlzLmNvbH0sIDFmcik7YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhcmREaXY7XG4gICAgfVxuXG4gICAgZ2V0WWFtbENvZGUoKSB7XG4gICAgICAgIGxldCB5YW1sU3RyID0gJyc7XG4gICAgICAgIGNvbnN0IG5DYXJkID0gdGhpcy5nZXRDYXJkTnVtKCk7XG4gICAgICAgIGlmIChuQ2FyZCA+IDApIHtcbiAgICAgICAgICAgIHlhbWxTdHIgPSAnXFxuYGBgY2NhcmRcXG5pdGVtczogWyc7XG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuY2FyZHMpIHtcbiAgICAgICAgICAgICAgICB5YW1sU3RyICs9ICdcXG4gIHtcXG4nXG4gICAgICAgICAgICAgICAgeWFtbFN0ciArPSB0aGlzLmNhcmRzW2ldLmdldFlhbWxDb2RlKCcgICAgJyk7XG4gICAgICAgICAgICAgICAgeWFtbFN0ciArPSAnICB9LCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGdldCByaWQgb2YgbGFzdCBwZXJpb2RcbiAgICAgICAgICAgIHlhbWxTdHIgPSB5YW1sU3RyLnN1YnN0cmluZygwLCB5YW1sU3RyLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgeWFtbFN0ciArPSAnXFxuXVxcbic7XG4gICAgICAgICAgICBpZiAodGhpcy5jb2wgPiAwKSB7XG4gICAgICAgICAgICAgICAgeWFtbFN0ciArPSBgY29sOiAke3RoaXMuY29sfVxcbmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5YW1sU3RyICs9ICdgYGBcXG4nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5YW1sU3RyO1xuICAgIH1cblxuICAgIGZyb21ZYW1sQ2FyZHMoeWFtbDogYW55KSB7XG4gICAgICAgIC8vIHBhcnNlciBvcHRpb25zXG4gICAgICAgIHRoaXMuZnJvbVlhbWxPcHRpb25zKHlhbWwpO1xuXG4gICAgICAgIC8vIHBhcnNlciBpdGVtc1xuICAgICAgICBpZiAoeWFtbC5pdGVtcykge1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSB5YW1sLml0ZW1zO1xuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBhbGxJdGVtcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhcmRJbmZvID0gYWxsSXRlbXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKCd0aXRsZScgaW4gY2FyZEluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhcmRJdGVtID0gbmV3IENhcmRJdGVtKGNhcmRJbmZvWyd0aXRsZSddLCBDYXJkU3R5bGUuTm90ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNhcmRJdGVtLmZyb21EaWN0KGNhcmRJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDYXJkKGNhcmRJdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXR1cm5cbiAgICAgICAgcmV0dXJuICh0aGlzLmdldENhcmROdW0oKSA+IDApO1xuICAgIH1cblxuICAgIGZyb21ZYW1sT3B0aW9ucyh5YW1sOiBhbnkpIHtcbiAgICAgICAgaWYgKHlhbWwuc3R5bGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGUgPSB5YW1sLnN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5YW1sLmNvbCkge1xuICAgICAgICAgICAgdGhpcy5jb2wgPSB5YW1sLmNvbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeWFtbC5pbWFnZVByZWZpeCkge1xuICAgICAgICAgICAgdGhpcy5pbWFnZVByZWZpeCA9IHlhbWwuaW1hZ2VQcmVmaXg7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYXJkSXRlbSB7XG4gICAgY2FyZFN0eWxlOiBDYXJkU3R5bGU7XG4gICAgaGVhZFRleHQ6IHN0cmluZztcbiAgICBoZWFkSW1hZ2U6IHN0cmluZztcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIHRpdGxlTGluazogc3RyaW5nO1xuICAgIGFic3RyYWN0OiBzdHJpbmc7XG4gICAgZm9vdG5vdGU6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKHRpdGxlOiBzdHJpbmcsIHN0eWxlOiBDYXJkU3R5bGUpIHtcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgICAgICB0aGlzLmFic3RyYWN0ID0gXCJObyBhYnN0cmFjdC5cIjtcbiAgICAgICAgdGhpcy5jYXJkU3R5bGUgPSBzdHlsZTtcbiAgICB9XG5cbiAgICBzZXRIZWFkVGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5oZWFkVGV4dCA9IHRleHQ7XG4gICAgfVxuXG4gICAgc2V0SGVhZEltYWdlKGxpbmtVcmw6IHN0cmluZykge1xuICAgICAgICB0aGlzLmhlYWRJbWFnZSA9IGxpbmtVcmw7XG4gICAgfVxuXG4gICAgc2V0VGl0bGUodGl0bGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gICAgfVxuXG4gICAgc2V0VGl0bGVMaW5rKGxpbmtVcmw6IHN0cmluZykge1xuICAgICAgICB0aGlzLnRpdGxlTGluayA9IGxpbmtVcmw7XG4gICAgfVxuXG4gICAgc2V0QWJzdHJhY3QoYWJzdHJhY3Q6IHN0cmluZykge1xuICAgICAgICB0aGlzLmFic3RyYWN0ID0gYWJzdHJhY3Q7XG4gICAgfVxuXG4gICAgc2V0Rm9vdG5vdGUoZm9vdG5vdGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZvb3Rub3RlID0gZm9vdG5vdGU7XG4gICAgfVxuXG4gICAgZnJvbURpY3QoZGljdDogYW55KSB7XG4gICAgICAgIGlmICgnaGVhZCcgaW4gZGljdCkge1xuICAgICAgICAgICAgdGhpcy5oZWFkVGV4dCA9IGRpY3RbJ2hlYWQnXTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhlYWRUZXh0ID09ICdGb2xkZXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJkU3R5bGUgPSBDYXJkU3R5bGUuRm9sZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5oZWFkVGV4dCA9PSAnTm90ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmRTdHlsZSA9IENhcmRTdHlsZS5Ob3RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgnaW1hZ2UnIGluIGRpY3QpIHRoaXMuaGVhZEltYWdlID0gZGljdFsnaW1hZ2UnXTtcbiAgICAgICAgaWYgKCdsaW5rJyBpbiBkaWN0KSB0aGlzLnRpdGxlTGluayA9IGRpY3RbJ2xpbmsnXTtcbiAgICAgICAgaWYgKCdicmllZicgaW4gZGljdCkgdGhpcy5hYnN0cmFjdCA9IGRpY3RbJ2JyaWVmJ107XG4gICAgICAgIGlmICgnZm9vdCcgaW4gZGljdCkgdGhpcy5mb290bm90ZSA9IGRpY3RbJ2Zvb3QnXTtcbiAgICB9XG5cbiAgICB5YW1sRXNjYXBlUXVvdGVzKG9yZzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBvcmcucmVwbGFjZSgvJy9naSwgXCInJ1wiKTtcbiAgICB9XG5cbiAgICBnZXRZYW1sQ29kZShwcmVmaXg6IHN0cmluZykge1xuICAgICAgICB2YXIgeWFtbFN0ciA9ICcnO1xuICAgICAgICB5YW1sU3RyICs9IGAke3ByZWZpeH10aXRsZTogJyR7dGhpcy55YW1sRXNjYXBlUXVvdGVzKHRoaXMudGl0bGUpfSdgO1xuICAgICAgICBpZiAodGhpcy50aXRsZUxpbmspIHlhbWxTdHIgKz0gYCxcXG4ke3ByZWZpeH1saW5rOiAnJHt0aGlzLnlhbWxFc2NhcGVRdW90ZXModGhpcy50aXRsZUxpbmspfSdgO1xuICAgICAgICBpZiAodGhpcy5hYnN0cmFjdCkgeWFtbFN0ciArPSBgLFxcbiR7cHJlZml4fWJyaWVmOiAnJHt0aGlzLnlhbWxFc2NhcGVRdW90ZXModGhpcy5hYnN0cmFjdCl9J2A7XG4gICAgICAgIGlmICh0aGlzLmZvb3Rub3RlKSB5YW1sU3RyICs9IGAsXFxuJHtwcmVmaXh9Zm9vdDogJyR7dGhpcy55YW1sRXNjYXBlUXVvdGVzKHRoaXMuZm9vdG5vdGUpfSdgO1xuICAgICAgICBpZiAodGhpcy5oZWFkSW1hZ2UpIHtcbiAgICAgICAgICAgIHlhbWxTdHIgKz0gYCxcXG4ke3ByZWZpeH1pbWFnZTogJyR7dGhpcy55YW1sRXNjYXBlUXVvdGVzKHRoaXMuaGVhZEltYWdlKX0nYDtcbiAgICAgICAgfSBcbiAgICAgICAgZWxzZSBpZiAodGhpcy5oZWFkVGV4dCkge1xuICAgICAgICAgICAgeWFtbFN0ciArPSBgLFxcbiR7cHJlZml4fWhlYWQ6ICcke3RoaXMueWFtbEVzY2FwZVF1b3Rlcyh0aGlzLmhlYWRUZXh0KX0nYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNhcmRTdHlsZSA9PSBDYXJkU3R5bGUuRm9sZGVyKSB7XG4gICAgICAgICAgICAgICAgeWFtbFN0ciArPSBgLFxcbiR7cHJlZml4fWhlYWQ6ICdGb2xkZXInYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY2FyZFN0eWxlID09IENhcmRTdHlsZS5Ob3RlKSB7XG4gICAgICAgICAgICAgICAgeWFtbFN0ciArPSBgLFxcbiR7cHJlZml4fWhlYWQ6ICdOb3RlJ2A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5YW1sU3RyICs9IGAsXFxuJHtwcmVmaXh9aGVhZDogJ0NhcmQnYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5YW1sU3RyICs9ICdcXG4nO1xuICAgICAgICByZXR1cm4geWFtbFN0cjtcbiAgICB9XG5cbiAgICBnZXRCb3hFbGVtZW50KGFwcDogQXBwLCBpbWFnZVByZWZpeDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjYXJkRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgLy8gSGVhZGluZ1xuICAgICAgICBsZXQgaGVhZEVsID0gY2FyZEVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgICAgICAgaWYgKHRoaXMuaGVhZEltYWdlKSB7XG4gICAgICAgICAgICB0aGlzLmNhcmRTdHlsZSA9IENhcmRTdHlsZS5JbWFnZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhlYWRJbWFnZS5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbG9yXG4gICAgICAgICAgICAgICAgaGVhZEVsLmFkZENsYXNzKCd0aHVtYi1jb2xvcicpO1xuICAgICAgICAgICAgICAgIGhlYWRFbC5zZXRBdHRyKCdzdHlsZScsIGBiYWNrZ3JvdW5kLWNvbG9yOiAke3RoaXMuaGVhZEltYWdlfTtgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaGVhZEltYWdlLmNvbnRhaW5zKFwiOi8vXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gYXBwIGxvY2FsIGltYWdlXG4gICAgICAgICAgICAgICAgaGVhZEVsLmFkZENsYXNzKCd0aHVtYicpO1xuICAgICAgICAgICAgICAgIGhlYWRFbC5zZXRBdHRyKCdzdHlsZScsIGBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJHt0aGlzLmhlYWRJbWFnZX0pO2ApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBhc3NldCBmaWxlIG5hbWU/XG4gICAgICAgICAgICAgICAgbGV0IGltYWdlVXJsID0gdGhpcy5oZWFkSW1hZ2U7XG4gICAgICAgICAgICAgICAgaWYgKGltYWdlUHJlZml4Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBleHBsaWNpdGx5IHBhdGhcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybFBhdGhMaXN0ID0gaW1hZ2VVcmwuc3BsaXQoJy8nKS5qb2luKCcgJykudHJpbVN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmaXhQYXRoTGlzdCA9IGltYWdlUHJlZml4LnNwbGl0KCcvJykuam9pbignICcpLnRyaW1TdGFydCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXVybFBhdGhMaXN0LnN0YXJ0c1dpdGgoZml4UGF0aExpc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVVybCA9IGltYWdlUHJlZml4ICsgdGhpcy5oZWFkSW1hZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFpbWFnZVVybC5jb250YWlucygnOi8vJykpIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VVcmwgPSBhcHAudmF1bHQuYWRhcHRlci5nZXRSZXNvdXJjZVBhdGgoaW1hZ2VVcmwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoZWFkRWwuYWRkQ2xhc3MoJ3RodW1iJyk7XG4gICAgICAgICAgICAgICAgaGVhZEVsLnNldEF0dHIoJ3N0eWxlJywgYGJhY2tncm91bmQtaW1hZ2U6IHVybCgke2ltYWdlVXJsfSk7YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhlYWRUZXh0KSB7XG4gICAgICAgICAgICAgICAgaGVhZEVsLnRleHRDb250ZW50ID0gdGhpcy5oZWFkVGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNhcmRTdHlsZSA9PSBDYXJkU3R5bGUuRm9sZGVyKSB7XG4gICAgICAgICAgICBoZWFkRWwuYWRkQ2xhc3NlcyhbJ3RodW1iLWNvbG9yJywgJ3RodW1iLWNvbG9yLWZvbGRlciddKTtcbiAgICAgICAgICAgIGhlYWRFbC50ZXh0Q29udGVudCA9ICdGb2xkZXInO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuY2FyZFN0eWxlID09IENhcmRTdHlsZS5Ob3RlKSB7XG4gICAgICAgICAgICBoZWFkRWwuYWRkQ2xhc3NlcyhbJ3RodW1iLWNvbG9yJywgJ3RodW1iLWNvbG9yLW5vdGUnXSk7XG4gICAgICAgICAgICBoZWFkRWwudGV4dENvbnRlbnQgPSAnTm90ZSc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXJ0aWNsZVxuICAgICAgICBsZXQgYXJ0aWNsZUVsID0gY2FyZEVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2FydGljbGUnKSk7XG4gICAgICAgIC8vIFRpdGxlXG4gICAgICAgIGlmICh0aGlzLnRpdGxlTGluaykge1xuICAgICAgICAgICAgbGV0IHRpdGxlRWwgPSBhcnRpY2xlRWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRpdGxlTGluay5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgICAgICAgICB0aXRsZUVsLmFkZENsYXNzKCdpbnRlcm5hbC1saW5rJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aXRsZUVsLmhyZWYgPSB0aGlzLnRpdGxlTGluaztcbiAgICAgICAgICAgIGxldCBoMUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDEnKTtcbiAgICAgICAgICAgIGgxRWwudGV4dENvbnRlbnQgPSB0aGlzLnRpdGxlO1xuICAgICAgICAgICAgdGl0bGVFbC5hcHBlbmRDaGlsZChoMUVsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0aXRsZUVsID0gYXJ0aWNsZUVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2gxJykpO1xuICAgICAgICAgICAgdGl0bGVFbC50ZXh0Q29udGVudCA9IHRoaXMudGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYWJzdHJhY3RcbiAgICAgICAgbGV0IGJyaWVmRWwgPSBhcnRpY2xlRWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpKTtcbiAgICAgICAgYnJpZWZFbC50ZXh0Q29udGVudCA9IHRoaXMuYWJzdHJhY3Q7XG4gICAgICAgIC8vIGZvb3Rub3RlXG4gICAgICAgIGlmICh0aGlzLmZvb3Rub3RlKSB7XG4gICAgICAgICAgICBsZXQgZm9vdEVsID0gYXJ0aWNsZUVsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKSk7XG4gICAgICAgICAgICBmb290RWwudGV4dENvbnRlbnQgPSB0aGlzLmZvb3Rub3RlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsb3NlXG4gICAgICAgIHJldHVybiBjYXJkRWw7XG4gICAgfVxufVxuXG4iLCJcbmltcG9ydCB7IEFwcCwgTWFya2Rvd25WaWV3LCBURmlsZSwgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IENhcmRTdHlsZSwgQ2FyZEJsb2NrLCBDYXJkSXRlbSB9IGZyb20gJy4vY2FyZC1pdGVtJ1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZvbGRlciBCcmllZlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjbGFzcyBGb2xkZXJCcmllZiB7XG4gICAgYXBwOiBBcHA7XG4gICAgZm9sZGVyUGF0aDogc3RyaW5nO1xuICAgIGJyaWVmTWF4OiBudW1iZXI7XG4gICAgbm90ZU9ubHk6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCkge1xuICAgICAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICAgICAgdGhpcy5mb2xkZXJQYXRoID0gJyc7XG4gICAgICAgIHRoaXMuYnJpZWZNYXggPSA2NDtcbiAgICAgICAgdGhpcy5ub3RlT25seSA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGZvciBjYXJkcyB0eXBlOiBmb2xkZXJfYnJpZWZcbiAgICBhc3luYyB5YW1sRm9sZGVyQnJpZWYoeWFtbDogYW55KSB7XG4gICAgICAgIHZhciBmb2xkZXJQYXRoID0gJyc7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUZpbGUgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xuICAgICAgICB2YXIgbm90ZVBhdGggPSBhY3RpdmVGaWxlLnBhdGg7XG4gICAgICAgIGlmICh5YW1sLmNhcmRzLmZvbGRlcikge1xuICAgICAgICAgICAgZm9sZGVyUGF0aCA9IHlhbWwuY2FyZHMuZm9sZGVyO1xuICAgICAgICAgICAgbGV0IGZvbGRlckV4aXN0ID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMoZm9sZGVyUGF0aCk7XG4gICAgICAgICAgICBpZiAoIWZvbGRlckV4aXN0KSBmb2xkZXJQYXRoID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb2xkZXJQYXRoID0gYWN0aXZlRmlsZS5wYXJlbnQucGF0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdlbmVyYXRlXG4gICAgICAgIGlmIChmb2xkZXJQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgICAgICAgICAgaWYgKHZpZXcpIHtcbiAgICAgICAgICAgICAgICBsZXQgYnJpZWZDYXJkcyA9IGF3YWl0IHRoaXMubWFrZUJyaWVmQ2FyZHMoZm9sZGVyUGF0aCwgbm90ZVBhdGgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhcmRzRWxlbSA9IGJyaWVmQ2FyZHMuZ2V0RG9jRWxlbWVudCh0aGlzLmFwcCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhcmRzRWxlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgLy8gZ2VuZXJhdGUgZm9sZGVyIG92ZXJ2aWV3XG4gICAgYXN5bmMgbWFrZUJyaWVmQ2FyZHMoZm9sZGVyUGF0aDogc3RyaW5nLCBhY3RpdmVOb3RlUGF0aDogc3RyaW5nKSB7XG4gICAgICAgIC8vIHNldCBub3RlIG5hbWVcbiAgICAgICAgbGV0IGNhcmRCbG9jayA9IG5ldyBDYXJkQmxvY2soKTtcblxuICAgICAgICAvLyBjaGlsZHJlbiBzdGF0aXN0aWNcbiAgICAgICAgbGV0IHBhdGhMaXN0ID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5saXN0KGZvbGRlclBhdGgpO1xuICAgICAgICBjb25zdCBzdWJGb2xkZXJMaXN0ID0gcGF0aExpc3QuZm9sZGVycztcbiAgICAgICAgY29uc3Qgc3ViRmlsZUxpc3QgPSBwYXRoTGlzdC5maWxlcztcblxuICAgICAgICAvLyBzdWIgZm9sZGVyc1xuICAgICAgICBpZiAoIXRoaXMubm90ZU9ubHkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3ViRm9sZGVyTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBzdWJGb2xkZXJQYXRoID0gc3ViRm9sZGVyTGlzdFtpXTtcbiAgICAgICAgICAgICAgICAvLyBoYXZlIG91dHNpZGUgZm9sZGVyIG5vdGU/XG4gICAgICAgICAgICAgICAgbGV0IG5vdGVFeGlzdHMgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhzdWJGb2xkZXJQYXRoICsgJy5tZCcpO1xuICAgICAgICAgICAgICAgIGlmICghbm90ZUV4aXN0cykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZGVyQ2FyZCA9IGF3YWl0IHRoaXMubWFrZUZvbGRlckNhcmQoZm9sZGVyUGF0aCwgc3ViRm9sZGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhcmRCbG9jay5hZGRDYXJkKGZvbGRlckNhcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vdGVzXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3ViRmlsZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzdWJGaWxlUGF0aCA9IHN1YkZpbGVMaXN0W2ldO1xuICAgICAgICAgICAgaWYgKCFzdWJGaWxlUGF0aC5lbmRzV2l0aCgnLm1kJykpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHN1YkZpbGVQYXRoID09IGFjdGl2ZU5vdGVQYXRoKSBjb250aW51ZTsgLy8gb21pdCBzZWxmIGluY2x1ZGVpbmdcbiAgICAgICAgICAgIGxldCBub3RlQ2FyZCA9IGF3YWl0IHRoaXMubWFrZU5vdGVDYXJkKGZvbGRlclBhdGgsIHN1YkZpbGVQYXRoKTtcbiAgICAgICAgICAgIGNhcmRCbG9jay5hZGRDYXJkKG5vdGVDYXJkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJldHVyblxuICAgICAgICByZXR1cm4gY2FyZEJsb2NrO1xuICAgIH1cblxuICAgIC8vIG1ha2UgZm9sZGVyIGJyaWVmIGNhcmRcbiAgICBhc3luYyBtYWtlRm9sZGVyQ2FyZChmb2xkZXJQYXRoOiBzdHJpbmcsIHN1YkZvbGRlclBhdGg6IHN0cmluZykge1xuICAgICAgICAvLyB0aXRsZVxuICAgICAgICB2YXIgc3ViRm9sZGVyTmFtZSA9IHN1YkZvbGRlclBhdGguc3BsaXQoJy8nKS5wb3AoKTtcbiAgICAgICAgbGV0IGNhcmQgPSBuZXcgQ2FyZEl0ZW0oc3ViRm9sZGVyTmFtZSwgQ2FyZFN0eWxlLkZvbGRlcik7XG5cbiAgICAgICAgLy8gZGVzY3JpcHRpb25cbiAgICAgICAgbGV0IHN1YlBhdGhMaXN0ID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5saXN0KHN1YkZvbGRlclBhdGgpO1xuICAgICAgICB2YXIgZm9sZGVyQnJpZWYgPSAnQ29udGFpbnMgJztcbiAgICAgICAgZm9sZGVyQnJpZWYgKz0gc3ViUGF0aExpc3QuZm9sZGVycy5sZW5ndGgudG9TdHJpbmcoKSArICcgZm9sZGVycywgJztcbiAgICAgICAgZm9sZGVyQnJpZWYgKz0gc3ViUGF0aExpc3QuZmlsZXMubGVuZ3RoLnRvU3RyaW5nKCkgKyAnIG5vdGVzLic7XG4gICAgICAgIGNhcmQuc2V0QWJzdHJhY3QoZm9sZGVyQnJpZWYpO1xuXG4gICAgICAgIC8vIGZvb3Rub3RlLCB1c2UgZGF0ZSBpbiB0aGUgZnV0dXJlXG4gICAgICAgIGNhcmQuc2V0Rm9vdG5vdGUoc3ViRm9sZGVyUGF0aC5yZXBsYWNlKGZvbGRlclBhdGggKyAnLycsICcnKSk7XG4gICAgICAgIFxuICAgICAgICAvLyByZXR1cm5cbiAgICAgICAgcmV0dXJuIGNhcmQ7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBub3RlIGJyaWVmIGNhcmRcbiAgICBhc3luYyBtYWtlTm90ZUNhcmQoZm9sZGVyUGF0aDogc3RyaW5nLCBub3RlUGF0aDogc3RyaW5nKSB7XG4gICAgICAgIC8vIHRpdGlsZVxuICAgICAgICB2YXIgbm90ZU5hbWUgPSBub3RlUGF0aC5zcGxpdCgnLycpLnBvcCgpO1xuICAgICAgICB2YXIgbm90ZVRpdGxlID0gbm90ZU5hbWUuc3Vic3RyaW5nKDAsIG5vdGVOYW1lLmxlbmd0aCAtIDMpO1xuICAgICAgICBsZXQgY2FyZCA9IG5ldyBDYXJkSXRlbShub3RlVGl0bGUsIENhcmRTdHlsZS5Ob3RlKTtcbiAgICAgICAgY2FyZC5zZXRUaXRsZUxpbmsobm90ZVBhdGgpO1xuXG4gICAgICAgIC8vIHJlYWQgY29udGVudFxuICAgICAgICBsZXQgZmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aChub3RlUGF0aCk7XG4gICAgICAgIGlmIChmaWxlICYmIGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRPcmcgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgICAgICAgICAgLy8gbGV0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLnJlYWQobm90ZVBhdGgpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coY29udGVudCk7XG5cbiAgICAgICAgICAgIC8vIGltYWdlXG4gICAgICAgICAgICB2YXIgaW1hZ2VVcmwgPSB0aGlzLmdldENvbnRlbnRJbWFnZShjb250ZW50T3JnLCBmb2xkZXJQYXRoKTtcbiAgICAgICAgICAgIGlmIChpbWFnZVVybC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY2FyZC5zZXRIZWFkSW1hZ2UoaW1hZ2VVcmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBjb250ZW50P1xuICAgICAgICAgICAgdmFyIGNvbnRlbnRCcmllZiA9IHRoaXMuZ2V0Q29udGVudEJyaWVmKGNvbnRlbnRPcmcpO1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRCcmllZi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRCcmllZi5sZW5ndGggPiB0aGlzLmJyaWVmTWF4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRCcmllZiA9IGNvbnRlbnRCcmllZi5zdWJzdHJpbmcoMCwgdGhpcy5icmllZk1heCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRCcmllZiArPSAnLi4uJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FyZC5zZXRBYnN0cmFjdChjb250ZW50QnJpZWYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb290IG5vdGVcbiAgICAgICAgICAgIGNvbnN0IGZpbGVTdCA9IChmaWxlIGFzIFRGaWxlKTtcbiAgICAgICAgICAgIGlmIChmaWxlU3Quc3RhdCkge1xuICAgICAgICAgICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoZmlsZVN0LnN0YXQubXRpbWUpO1xuICAgICAgICAgICAgICAgIGNhcmQuc2V0Rm9vdG5vdGUoZGF0ZS50b0xvY2FsZVN0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhcmQuc2V0Rm9vdG5vdGUobm90ZVBhdGgucmVwbGFjZShmb2xkZXJQYXRoICsgJy8nLCAnJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV0dXJuXG4gICAgICAgIHJldHVybiBjYXJkO1xuICAgIH1cblxuICAgIGdldENvbnRlbnRJbWFnZShjb250ZW50T3JnOiBzdHJpbmcsIGZvbGRlclBhdGg6IHN0cmluZykge1xuICAgICAgICB2YXIgaW1hZ2VVcmwgPSAnJztcbiAgICAgICAgLy8gZm9yIHBhdHRlbjogIVt4eHgucG5nXVxuICAgICAgICBsZXQgcmVnZXhJbWcgPSBuZXcgUmVnRXhwKCchXFxcXFsoLio/KVxcXFxdXFxcXCgoLio/KVxcXFwpJyk7XG4gICAgICAgIHZhciBtYXRjaCA9IHJlZ2V4SW1nLmV4ZWMoY29udGVudE9yZyk7XG4gICAgICAgIGlmIChtYXRjaCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbWFnZVVybCA9IG1hdGNoWzJdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZm9yIHBhdHRlbjogIVtbeHh4LnBuZ11dXG4gICAgICAgICAgICBsZXQgcmVnZXhJbWcyID0gbmV3IFJlZ0V4cCgnIVxcXFxbXFxcXFsoLio/KVxcXFxdXFxcXF0nKTtcbiAgICAgICAgICAgIG1hdGNoID0gcmVnZXhJbWcyLmV4ZWMoY29udGVudE9yZyk7XG4gICAgICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCkgaW1hZ2VVcmwgPSBtYXRjaFsxXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgaW1hZ2UgdXJsXG4gICAgICAgIGlmIChpbWFnZVVybC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWltYWdlVXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICAgICAgICAgIGxldCBoZWFkUGF0aCA9IGZvbGRlclBhdGg7XG4gICAgICAgICAgICAgICAgbGV0IHJlbGF0aXZlUGF0aCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHdoaWxlIChpbWFnZVVybC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZVVybCA9IGltYWdlVXJsLnN1YnN0cmluZygzKTtcbiAgICAgICAgICAgICAgICAgICAgaGVhZFBhdGggPSBoZWFkUGF0aC5zdWJzdHJpbmcoMCwgaGVhZFBhdGgubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VVcmwgPSBoZWFkUGF0aCArICcvJyArIGltYWdlVXJsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbWFnZVVybCA9IGltYWdlVXJsLnJlcGxhY2UoL1xcJTIwL2csICcgJylcbiAgICAgICAgICAgICAgICAvLyBpbWFnZVVybCA9IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0UmVzb3VyY2VQYXRoKGltYWdlVXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW1hZ2VVcmw7XG4gICAgfVxuXG4gICAgZ2V0Q29udGVudEJyaWVmKGNvbnRlbnRPcmc6IHN0cmluZykge1xuICAgICAgICAvLyByZW1vdmUgc29tZSBzcGVjaWFsIGNvbnRlbnRcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBjb250ZW50T3JnLnRyaW0oKTtcblxuICAgICAgICAvLyBza2lwIHlhbWwgaGVhZFxuICAgICAgICBpZiAoY29udGVudC5zdGFydHNXaXRoKCctLS1cXHInKSB8fCBjb250ZW50LnN0YXJ0c1dpdGgoJy0tLVxcbicpICkge1xuICAgICAgICAgICAgY29uc3QgaFBvczIgPSBjb250ZW50LmluZGV4T2YoJy0tLScsIDQpO1xuICAgICAgICAgICAgaWYgKGhQb3MyID49IDAgJiYgKGNvbnRlbnRbaFBvczItMV0gPT0gJ1xcbicgfHwgKGNvbnRlbnRbaFBvczItMV0gPT0gJ1xccicpKSkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZyhoUG9zMis0KS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZW50ID0gY29udGVudFxuICAgICAgICAvLyBSZW1vdmUgWUFNTCBjb2RlXG4gICAgICAgIC8vIC5yZXBsYWNlKC9eLS0tW1xcclxcbl1bXigtLS0pXSpbXFxyXFxuXS0tLVtcXHJcXG5dL2csICcnKVxuICAgICAgICAvLyBSZW1vdmUgSFRNTCB0YWdzXG4gICAgICAgIC5yZXBsYWNlKC88W14+XSo+L2csICcnKVxuICAgICAgICAvLyB3aWtpIHN0eWxlIGxpbmtzXG4gICAgICAgIC5yZXBsYWNlKC9cXCFcXFtcXFsoLio/KVxcXVxcXS9nLCAnJylcbiAgICAgICAgLnJlcGxhY2UoL1xcW1xcWyguKj8pXFxdXFxdL2csICckMScpXG4gICAgICAgIC8vIFJlbW92ZSBpbWFnZXNcbiAgICAgICAgLnJlcGxhY2UoL1xcIVxcWyguKj8pXFxdW1xcW1xcKF0uKj9bXFxdXFwpXS9nLCAnJylcbiAgICAgICAgLy8gUmVtb3ZlIGlubGluZSBsaW5rc1xuICAgICAgICAucmVwbGFjZSgvXFxbKC4qPylcXF1bXFxbXFwoXS4qP1tcXF1cXCldL2csICckMScpXG4gICAgICAgIC8vIFJlbW92ZSBlbXBoYXNpcyAocmVwZWF0IHRoZSBsaW5lIHRvIHJlbW92ZSBkb3VibGUgZW1waGFzaXMpXG4gICAgICAgIC5yZXBsYWNlKC8oW1xcKl9dezEsM30pKFxcUy4qP1xcU3swLDF9KVxcMS9nLCAnJDInKVxuICAgICAgICAvLyBSZW1vdmUgYmxvY2txdW90ZXNcbiAgICAgICAgLnJlcGxhY2UoL1xcbigmZ3Q7fFxcPikoLiopL2csICcnKVxuICAgICAgICAvLyBSZW1vdmUgY29kZSBibG9ja3NcbiAgICAgICAgLnJlcGxhY2UoLyhgYGBbXlxcc10qXFxuW1xcc1xcU10qP1xcbmBgYCkvZywgJycpXG4gICAgICAgIC8vIFJlbW92ZSBpbmxpbmUgY29kZVxuICAgICAgICAucmVwbGFjZSgvYCguKz8pYC9nLCAnJDEnKVxuICAgICAgICAudHJpbSgpXG5cbiAgICAgICAgLy8gdHJ5IHRvIGdldCB0aGUgZmlyc3QgcGFyYWdyYXBoXG4gICAgICAgIHZhciBjb250ZW50QnJpZWYgPSAnJztcbiAgICAgICAgY29udGVudCA9ICdcXG4nICsgY29udGVudCArICdcXG4nO1xuICAgICAgICBsZXQgcmVnZXhQMSA9IG5ldyBSZWdFeHAoJ1xcbihbXlxcbnxeI3xePl0pKFteXFxuXSspXFxuJywgJ2cnKTsgXG4gICAgICAgIHZhciBtYXRjaCA9IG51bGw7XG4gICAgICAgIGlmICgobWF0Y2ggPSByZWdleFAxLmV4ZWMoY29udGVudCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb250ZW50QnJpZWYgPSBtYXRjaFsxXSArIG1hdGNoWzJdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2NvbnRlbnRCcmllZicsIGNvbnRlbnRCcmllZik7XG4gICAgICAgIGNvbnRlbnRCcmllZiA9IGNvbnRlbnRCcmllZi50cmltKCk7XG5cbiAgICAgICAgLy8gdXNlIHNlY3Rpb24gaGVhZGluZ3NcbiAgICAgICAgaWYgKGNvbnRlbnRCcmllZi5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgbGV0IHJlZ2V4SGVhZCA9IG5ldyBSZWdFeHAoJ14jezEsNn0oPyEjKSguKilbXFxyXFxuXScsICdtZycpO1xuICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4SGVhZC5leGVjKGNvbnRlbnQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRCcmllZiArPSBtYXRjaFsxXSArICcsICc7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRCcmllZi5sZW5ndGggPiB0aGlzLmJyaWVmTWF4KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb250ZW50QnJpZWYuZW5kc1dpdGgoJywgJykpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50QnJpZWYgPSBjb250ZW50QnJpZWYuc3Vic3RyaW5nKDAsIGNvbnRlbnRCcmllZi5sZW5ndGgtMik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXR1cm5cbiAgICAgICAgcmV0dXJuIGNvbnRlbnRCcmllZjtcbiAgICB9XG59XG4iLCJcbmltcG9ydCB7IEFwcCwgTWFya2Rvd25WaWV3LCBURmlsZSwgfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IEZvbGRlckJyaWVmIH0gZnJvbSAnLi9mb2xkZXItYnJpZWYnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZvbGRlciBOb3RlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZW51bSBOb3RlRmlsZU1ldGhvZCB7XG4gICAgSW5kZXgsIEluc2lkZSwgT3V0c2lkZSxcbn1cblxuZXhwb3J0IGNsYXNzIEZvbGRlck5vdGUge1xuICAgIGFwcDogQXBwO1xuICAgIC8vIGNvcHkgZnJvbSBzZXR0aW5nc1xuICAgIG1ldGhvZDogTm90ZUZpbGVNZXRob2Q7XG4gICAgaW5kZXhCYXNlOiBzdHJpbmc7XG4gICAgaW5pdENvbnRlbnQ6IHN0cmluZztcbiAgICBoaWRlTm90ZUZpbGU6IGJvb2xlYW47XG4gICAgLy8gbG9jYWwgdmFyc1xuICAgIGZvbGRlclBhdGg6IHN0cmluZztcbiAgICBub3RlUGF0aDogc3RyaW5nO1xuICAgIG5vdGVCYXNlOiBzdHJpbmc7XG4gICAgLy8gZm9yIHJlbmFtZVxuICAgIGZpbGVzVG9SZW5hbWU6IHN0cmluZ1tdO1xuICAgIGZpbGVzVG9SZW5hbWVTZXQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgbWV0aG9kU3RyOiBzdHJpbmcsIGluZGV4QmFzZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuYXBwID0gYXBwO1xuICAgICAgICB0aGlzLnNldE1ldGhvZChtZXRob2RTdHIsIGluZGV4QmFzZSk7XG4gICAgICAgIHRoaXMuZW1wdHlQYXRoKCk7XG4gICAgICAgIC8vIGZvciByZW5hbWVcbiAgICAgICAgdGhpcy5maWxlc1RvUmVuYW1lID0gW107XG4gICAgICAgIHRoaXMuZmlsZXNUb1JlbmFtZVNldCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIHNldCB0aGUgbWV0aG9kXG4gICAgc2V0TWV0aG9kKG1ldGhvZFN0cjogc3RyaW5nLCBpbmRleEJhc2U6IHN0cmluZykge1xuICAgICAgICBpZiAobWV0aG9kU3RyID09ICdpbmRleCcpIHtcbiAgICAgICAgICAgIHRoaXMubWV0aG9kID0gTm90ZUZpbGVNZXRob2QuSW5kZXg7XG4gICAgICAgICAgICB0aGlzLmluZGV4QmFzZSA9IGluZGV4QmFzZTtcbiAgICAgICAgfSBcbiAgICAgICAgZWxzZSBpZiAobWV0aG9kU3RyID09ICdpbnNpZGUnKSB7IFxuICAgICAgICAgICAgdGhpcy5tZXRob2QgPSBOb3RlRmlsZU1ldGhvZC5JbnNpZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWV0aG9kU3RyID09ICdvdXRzaWRlJykgeyBcbiAgICAgICAgICAgIHRoaXMubWV0aG9kID0gTm90ZUZpbGVNZXRob2QuT3V0c2lkZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNsZWFyXG4gICAgZW1wdHlQYXRoKCkge1xuICAgICAgICB0aGlzLmZvbGRlclBhdGggPSAnJztcbiAgICAgICAgdGhpcy5ub3RlUGF0aCA9ICcnO1xuICAgICAgICB0aGlzLm5vdGVCYXNlID0gJyc7XG4gICAgfVxuXG4gICAgLy8gc2V0IGJ5IGZvbGRlciBwYXRoXG4gICAgc2V0QnlGb2xkZXJQYXRoKHBhdGg6IHN0cmluZykge1xuICAgICAgICB0aGlzLmVtcHR5UGF0aCgpO1xuICAgICAgICB2YXIgZm9sZGVyUGF0aCA9IHBhdGgudHJpbSgpO1xuICAgICAgICBpZiAoZm9sZGVyUGF0aC5sZW5ndGggPT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIHNldFxuICAgICAgICB0aGlzLmZvbGRlclBhdGggPSBmb2xkZXJQYXRoO1xuICAgICAgICB2YXIgbm90ZVBhdGhzID0gdGhpcy5nZXRGb2xkZXJOb3RlUGF0aChmb2xkZXJQYXRoKTtcbiAgICAgICAgdGhpcy5ub3RlUGF0aCA9IG5vdGVQYXRoc1swXTtcbiAgICAgICAgdGhpcy5ub3RlQmFzZSA9IG5vdGVQYXRoc1sxXTtcbiAgICB9XG5cbiAgICAvLyBzZXQgYnkgbm90ZSwgc2hvdWxkIGVuZHMgd2l0aCAubWRcbiAgICBzZXRCeU5vdGVQYXRoKHBhdGg6IHN0cmluZykge1xuICAgICAgICB0aGlzLmVtcHR5UGF0aCgpO1xuICAgICAgICB2YXIgbm90ZVBhdGggPSBwYXRoLnRyaW0oKTtcbiAgICAgICAgaWYgKG5vdGVQYXRoLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICAgIGlmICghbm90ZVBhdGguZW5kc1dpdGgoJy5tZCcpKSByZXR1cm47XG5cbiAgICAgICAgLy8gc2V0XG4gICAgICAgIHRoaXMubm90ZVBhdGggPSBub3RlUGF0aDtcbiAgICAgICAgdGhpcy5ub3RlQmFzZSA9IHRoaXMuZ2V0RmlsZUJhc2VOYW1lKG5vdGVQYXRoKTtcbiAgICAgICAgdGhpcy5mb2xkZXJQYXRoID0gdGhpcy5nZXROb3RlRm9sZGVyUGF0aChub3RlUGF0aCk7XG4gICAgfVxuXG4gICAgLy8gc2V0IGJ5IGZvbGRlciBlbGVtZW50XG4gICAgc2V0QnlGb2xkZXJFbGVtZW50KGZvbGRlckl0ZW1FbDogRWxlbWVudCkge1xuICAgICAgICB2YXIgZm9sZGVyUGF0aCA9ICcnO1xuICAgICAgICB2YXIgZm9sZGVyTmFtZSA9ICcnO1xuXG4gICAgICAgIHZhciBjbGFzc05hbWUgPSBmb2xkZXJJdGVtRWwuY2xhc3NOYW1lLnRvU3RyaW5nKCk7XG4gICAgICAgIHZhciBmb2xkZXJFbGVtID0gZm9sZGVySXRlbUVsO1xuICAgICAgICBpZiAoY2xhc3NOYW1lLmNvbnRhaW5zKCduYXYtZm9sZGVyLXRpdGxlLWNvbnRlbnQnKSkge1xuICAgICAgICAgICAgZm9sZGVyTmFtZSA9IGZvbGRlckVsZW0uZ2V0VGV4dCgpO1xuICAgICAgICAgICAgZm9sZGVyRWxlbSA9IGZvbGRlckl0ZW1FbC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgZm9sZGVyUGF0aCA9IGZvbGRlckVsZW0uYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ2RhdGEtcGF0aCcpLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNsYXNzTmFtZS5jb250YWlucygnbmF2LWZvbGRlci10aXRsZScpKSB7XG4gICAgICAgICAgICBmb2xkZXJQYXRoID0gZm9sZGVySXRlbUVsLmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdkYXRhLXBhdGgnKS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIGZvbGRlck5hbWUgPSBmb2xkZXJJdGVtRWwubGFzdEVsZW1lbnRDaGlsZC5nZXRUZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXggdGhlIGZvbGRlciBwYXRoXG4gICAgICAgIGlmIChmb2xkZXJQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBzbGFzaExhc3QgPSBmb2xkZXJQYXRoLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICAgICAgICB2YXIgZm9sZGVyUGF0aExhc3QgPSBmb2xkZXJQYXRoLnNwbGl0KCcvJykucG9wKCk7XG4gICAgICAgICAgICBpZiAoZm9sZGVyUGF0aExhc3QgIT0gZm9sZGVyTmFtZSkge1xuICAgICAgICAgICAgICAgIGZvbGRlclBhdGggPSBmb2xkZXJQYXRoLnN1YnN0cmluZygwLCBzbGFzaExhc3QgKyAxKSArIGZvbGRlck5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZXQgdG8gbWluZVxuICAgICAgICB0aGlzLnNldEJ5Rm9sZGVyUGF0aChmb2xkZXJQYXRoKTtcblxuICAgICAgICAvLyByZXR1cm4gdGhlIGVsZW1lbnQgaW4gdXNlYWdlXG4gICAgICAgIHJldHVybiBmb2xkZXJFbGVtO1xuICAgIH1cblxuICAgIC8vIGdldCBmaWxlIGJhc2UgbmFtZVxuICAgIGdldEZpbGVCYXNlTmFtZShmaWxlUGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHZhciBiYXNlTmFtZSA9IGZpbGVQYXRoLnNwbGl0KCcvJykucG9wKCk7XG4gICAgICAgIHZhciBkb3RQb3MgPSBiYXNlTmFtZS5sYXN0SW5kZXhPZignLicpO1xuICAgICAgICBpZiAoZG90UG9zID4gMCkgYmFzZU5hbWUgPSBiYXNlTmFtZS5zdWJzdHJpbmcoMCwgZG90UG9zKTtcbiAgICAgICAgcmV0dXJuIGJhc2VOYW1lO1xuICAgIH1cblxuICAgIC8vIGdldCBmb2xkZXIgbm90ZSBwYXRoIGJ5IGZvbGRlciBwYXRoXG4gICAgZ2V0Rm9sZGVyTm90ZVBhdGgoZm9sZGVyUGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHZhciBub3RlUGF0aCA9ICcnO1xuICAgICAgICB2YXIgbm90ZUJhc2VOYW1lID0gdGhpcy5pbmRleEJhc2U7XG4gICAgICAgIGlmICh0aGlzLm1ldGhvZCA9PSBOb3RlRmlsZU1ldGhvZC5JbmRleCkge1xuICAgICAgICAgICAgbm90ZVBhdGggPSBmb2xkZXJQYXRoICsgJy8nICsgbm90ZUJhc2VOYW1lICsgJy5tZCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBub3RlQmFzZU5hbWUgPSBmb2xkZXJQYXRoLnNwbGl0KCcvJykucG9wKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXRob2QgPT0gTm90ZUZpbGVNZXRob2QuSW5zaWRlKSB7XG4gICAgICAgICAgICAgICAgbm90ZVBhdGggPSBmb2xkZXJQYXRoICsgJy8nICsgbm90ZUJhc2VOYW1lICsgJy5tZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICAodGhpcy5tZXRob2QgPT0gTm90ZUZpbGVNZXRob2QuT3V0c2lkZSkge1xuICAgICAgICAgICAgICAgIG5vdGVQYXRoID0gZm9sZGVyUGF0aCArICcubWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdub3RlUGF0aDogJywgbm90ZVBhdGgpO1xuICAgICAgICByZXR1cm4gW25vdGVQYXRoLCBub3RlQmFzZU5hbWVdO1xuICAgIH1cblxuICAgIC8vIGdldCBub3RlIGZvbGRlciwgbWFrZSBzdXJlIGl0IGlzIGEgbm90ZSBmaWxlXG4gICAgZ2V0Tm90ZUZvbGRlclBhdGgobm90ZVBhdGg6IHN0cmluZykge1xuICAgICAgICB2YXIgZm9sZGVyUGF0aCA9ICcnO1xuICAgICAgICBpZiAodGhpcy5tZXRob2QgPT0gTm90ZUZpbGVNZXRob2QuSW5kZXgpIHtcbiAgICAgICAgICAgIGZvbGRlclBhdGggPSBub3RlUGF0aC5zdWJzdHJpbmcoMCwgbm90ZVBhdGgubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5tZXRob2QgPT0gTm90ZUZpbGVNZXRob2QuSW5zaWRlKSB7XG4gICAgICAgICAgICBmb2xkZXJQYXRoID0gbm90ZVBhdGguc3Vic3RyaW5nKDAsIG5vdGVQYXRoLmxhc3RJbmRleE9mKCcvJykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubWV0aG9kID09IE5vdGVGaWxlTWV0aG9kLk91dHNpZGUpIHtcbiAgICAgICAgICAgIGZvbGRlclBhdGggPSBub3RlUGF0aC5zdWJzdHJpbmcoMCwgIG5vdGVQYXRoLmxlbmd0aC0zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9sZGVyUGF0aDtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBpZiBpdCBpcyBmb2xkZXIgbm90ZSBuYW1lXG4gICAgYXN5bmMgaXNGb2xkZXJOb3RlUGF0aChub3RlUGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHZhciBpc0ZOID0gZmFsc2U7XG4gICAgICAgIGlmICghbm90ZVBhdGguZW5kc1dpdGgoJy5tZCcpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMubWV0aG9kID09IE5vdGVGaWxlTWV0aG9kLkluZGV4KSB7XG4gICAgICAgICAgICBpc0ZOID0gbm90ZVBhdGguZW5kc1dpdGgoYC8ke3RoaXMuaW5kZXhCYXNlfS5tZGApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubWV0aG9kID09IE5vdGVGaWxlTWV0aG9kLkluc2lkZSkge1xuICAgICAgICAgICAgdmFyIG5vdGVCYXNlTmFtZSA9IHRoaXMuZ2V0RmlsZUJhc2VOYW1lKG5vdGVQYXRoKTtcbiAgICAgICAgICAgIGlmIChub3RlUGF0aC5lbmRzV2l0aChub3RlQmFzZU5hbWUgKyAnLycgKyBub3RlQmFzZU5hbWUgKyAnLm1kJykpICB7XG4gICAgICAgICAgICAgICAgaXNGTiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5tZXRob2QgPT0gTm90ZUZpbGVNZXRob2QuT3V0c2lkZSkge1xuICAgICAgICAgICAgdmFyIGZvbGRlclBhdGggPSBub3RlUGF0aC5zdWJzdHJpbmcoMCwgbm90ZVBhdGgubGVuZ3RoLTMpO1xuICAgICAgICAgICAgaXNGTiA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGZvbGRlclBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0ZOO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlzIGZvbGRlciBub3RlIGZpbGU/XG4gICAgYXN5bmMgaXNGb2xkZXJOb3RlKG5vdGVQYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgdmFyIGlzRk4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMubWV0aG9kID09IE5vdGVGaWxlTWV0aG9kLkluZGV4KSB7XG4gICAgICAgICAgICBpc0ZOID0gbm90ZVBhdGguZW5kc1dpdGgoYC8ke3RoaXMuaW5kZXhCYXNlfS5tZGApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubWV0aG9kID09IE5vdGVGaWxlTWV0aG9kLkluc2lkZSkge1xuICAgICAgICAgICAgdmFyIG5vdGVCYXNlTmFtZSA9IHRoaXMuZ2V0RmlsZUJhc2VOYW1lKG5vdGVQYXRoKTtcbiAgICAgICAgICAgIGlzRk4gPSBub3RlUGF0aC5lbmRzV2l0aChgJHtub3RlQmFzZU5hbWV9LyR7bm90ZUJhc2VOYW1lfS5tZGApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubWV0aG9kID09IE5vdGVGaWxlTWV0aG9kLk91dHNpZGUpIHtcbiAgICAgICAgICAgIHZhciBmb2xkZXJQYXRoID0gbm90ZVBhdGguc3Vic3RyaW5nKDAsIG5vdGVQYXRoLmxlbmd0aC0zKTtcbiAgICAgICAgICAgIGlzRk4gPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhmb2xkZXJQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNGTjtcbiAgICB9XG5cbiAgICAvLyBvcGVuIG5vdGUgZmlsZVxuICAgIGFzeW5jIG9wZW5Gb2xkZXJOb3RlKGZvbGRlckVsZW06IEVsZW1lbnQsIGRvQ3JlYXRlOiBib29sZWFuKSB7XG4gICAgICAgIC8vIGNoZWNrIG5vdGUgZmlsZVxuICAgICAgICBsZXQgZm9sZGVyTm90ZUV4aXN0cyA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHRoaXMubm90ZVBhdGgpO1xuICAgICAgICBpZiAoIWZvbGRlck5vdGVFeGlzdHMgJiYgZG9DcmVhdGUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubmV3Rm9sZGVyTm90ZSgpO1xuICAgICAgICAgICAgZm9sZGVyTm90ZUV4aXN0cyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvcGVuIHRoZSBub3RlXG4gICAgICAgIGlmIChmb2xkZXJOb3RlRXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVGb2xkZXJOb3RlKGZvbGRlckVsZW0pO1xuICAgICAgICAgICAgLy8gc2hvdyB0aGUgbm90ZVxuICAgICAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dCh0aGlzLm5vdGVQYXRoLCAnJywgZmFsc2UsIHsgYWN0aXZlOiB0cnVlIH0pO1xuICAgICAgICB9IFxuICAgICAgICBlbHNlIGlmIChmb2xkZXJFbGVtLmhhc0NsYXNzKCdoYXMtZm9sZGVyLW5vdGUnKSkge1xuICAgICAgICAgICAgZm9sZGVyRWxlbS5yZW1vdmVDbGFzcygnaGFzLWZvbGRlci1ub3RlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgZm9sZGVyIG5vdGVcbiAgICBhc3luYyBuZXdGb2xkZXJOb3RlKCkge1xuICAgICAgICBsZXQgbm90ZUluaXRDb250ZW50ID0gYXdhaXQgdGhpcy5leHBhbmRDb250ZW50KHRoaXMuaW5pdENvbnRlbnQpO1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLndyaXRlKHRoaXMubm90ZVBhdGgsIG5vdGVJbml0Q29udGVudCk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGZvbGRlciBieSBub3RlXG4gICAgYXN5bmMgbmV3Tm90ZUZvbGRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMubWV0aG9kID09IE5vdGVGaWxlTWV0aG9kLk91dHNpZGUpIHtcbiAgICAgICAgICAgIGxldCBmb2xkZXJFeGlzdHMgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyh0aGlzLmZvbGRlclBhdGgpO1xuICAgICAgICAgICAgaWYgKCFmb2xkZXJFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKHRoaXMuZm9sZGVyUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5tZXRob2QgPT0gTm90ZUZpbGVNZXRob2QuSW5zaWRlKSB7XG4gICAgICAgICAgICB2YXIgZm9sZGVyUGF0aCA9IHRoaXMubm90ZVBhdGguc3Vic3RyaW5nKDAsIHRoaXMubm90ZVBhdGgubGVuZ3RoLTMpO1xuICAgICAgICAgICAgbGV0IGZvbGRlckV4aXN0cyA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGZvbGRlclBhdGgpO1xuICAgICAgICAgICAgaWYgKCFmb2xkZXJFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKGZvbGRlclBhdGgpO1xuICAgICAgICAgICAgICAgIHZhciBuZXdOb3RlUGF0aCA9IGZvbGRlclBhdGggKyAnLycgKyB0aGlzLm5vdGVCYXNlICsgJy5tZCc7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5yZW5hbWUodGhpcy5ub3RlUGF0aCwgbmV3Tm90ZVBhdGgpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobmV3Tm90ZVBhdGgsICcnLCBmYWxzZSwgeyBhY3RpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBleHBhbmQgY29udGVudCB0ZW1wbGF0ZVxuICAgIGFzeW5jIGV4cGFuZENvbnRlbnQodGVtcGxhdGU6IHN0cmluZykge1xuICAgICAgICAvLyBrZXl3b3JkOiB7e0ZPTERFUl9OQU1FfX0sIHt7Rk9MREVSX1BBVEh9fVxuICAgICAgICB2YXIgZm9sZGVyTmFtZSA9IHRoaXMuZm9sZGVyUGF0aC5zcGxpdCgnLycpLnBvcCgpO1xuICAgICAgICB2YXIgY29udGVudCA9IHRlbXBsYXRlXG4gICAgICAgICAgICAucmVwbGFjZSgve3tGT0xERVJfTkFNRX19L2csIGZvbGRlck5hbWUpXG4gICAgICAgICAgICAucmVwbGFjZSgve3tGT0xERVJfUEFUSH19L2csIHRoaXMuZm9sZGVyUGF0aClcbiAgICAgICAgLy8ga2V5d29yZDoge3tGT0xERVJfQlJJRUZ9fVxuICAgICAgICBpZiAoY29udGVudC5jb250YWlucygne3tGT0xERVJfQlJJRUZ9fScpKSB7XG4gICAgICAgICAgICBsZXQgZm9sZGVyQnJpZWYgPSBuZXcgRm9sZGVyQnJpZWYodGhpcy5hcHApO1xuICAgICAgICAgICAgbGV0IGJyaWVmQ2FyZHMgPSBhd2FpdCBmb2xkZXJCcmllZi5tYWtlQnJpZWZDYXJkcyh0aGlzLmZvbGRlclBhdGgsIHRoaXMubm90ZVBhdGgpO1xuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgne3tGT0xERVJfQlJJRUZ9fScsIGJyaWVmQ2FyZHMuZ2V0WWFtbENvZGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8ga2V5d29yZDoge3tGT0xERVJfQlJJRUZfTElWRX19XG4gICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKCd7e0ZPTERFUl9CUklFRl9MSVZFfX0nKSkge1xuICAgICAgICAgICAgY29uc3QgYnJpZWZMaXZlQ29kZSA9ICdcXG5gYGBjY2FyZFxcbnR5cGU6IGZvbGRlcl9icmllZl9saXZlXFxuYGBgXFxuJztcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoJ3t7Rk9MREVSX0JSSUVGX0xJVkV9fScsIGJyaWVmTGl2ZUNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cblxuICAgIC8vIGhpZGUgZm9sZGVyIG5vdGVcbiAgICBoaWRlRm9sZGVyTm90ZShmb2xkZXJFbGVtOiBFbGVtZW50KSB7XG4gICAgICAgIC8vIG1vZGlmeSB0aGUgZWxlbWVudFxuICAgICAgICBjb25zdCBoaWRlU2V0dGluZyA9IHRoaXMuaGlkZU5vdGVGaWxlO1xuICAgICAgICBmb2xkZXJFbGVtLmFkZENsYXNzKCdoYXMtZm9sZGVyLW5vdGUnKTtcbiAgICAgICAgdmFyIHBhcmVudEVsZW0gPSBmb2xkZXJFbGVtLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIHZhciBmaWxlU2VsZWN0b3IgPSAnOnNjb3BlID4gZGl2Lm5hdi1mb2xkZXItY2hpbGRyZW4gPiBkaXYubmF2LWZpbGUgPiBkaXYubmF2LWZpbGUtdGl0bGUnO1xuICAgICAgICB2YXIgaXNPdXRzaWRlTWV0aG9kID0gKHRoaXMubWV0aG9kID09IE5vdGVGaWxlTWV0aG9kLk91dHNpZGUpO1xuICAgICAgICBpZiAoaXNPdXRzaWRlTWV0aG9kKSB7XG4gICAgICAgICAgICBwYXJlbnRFbGVtID0gcGFyZW50RWxlbS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgZmlsZVNlbGVjdG9yID0gJzpzY29wZSA+IGRpdi5uYXYtZmlsZSA+IGRpdi5uYXYtZmlsZS10aXRsZSc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG5vdGVCYXNlID0gdGhpcy5ub3RlQmFzZTtcbiAgICAgICAgcGFyZW50RWxlbS5xdWVyeVNlbGVjdG9yQWxsKGZpbGVTZWxlY3RvcilcbiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlRWxlbSkge1xuICAgICAgICAgICAgICAgIHZhciBmaWxlTm9kZVRpdGxlID0gZmlsZUVsZW0uZmlyc3RFbGVtZW50Q2hpbGQudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2ZpbGVOb3RlVGl0bGU6ICcsIGZpbGVOb2RlVGl0bGUpO1xuICAgICAgICAgICAgICAgIGlmIChoaWRlU2V0dGluZyAmJiAoZmlsZU5vZGVUaXRsZSA9PSBub3RlQmFzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZUVsZW0uYWRkQ2xhc3MoJ2lzLWZvbGRlci1ub3RlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc091dHNpZGVNZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZUVsZW0ucmVtb3ZlQ2xhc3MoJ2lzLWZvbGRlci1ub3RlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdpc091dHNpZGVNZXRob2Q6ICcsIGlzT3V0c2lkZU1ldGhvZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuICAgIFxuICAgIC8vIGdldCB0aGUgZmlsZSBicmVpZiBwYXRoXG4gICAgYXN5bmMgZ2V0Tm90ZUZvbGRlckJyaWVmUGF0aChub3RlUGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHZhciBmb2xkZXJQYXRoID0gJyc7XG4gICAgICAgIGxldCBpc0ZOID0gYXdhaXQgdGhpcy5pc0ZvbGRlck5vdGUobm90ZVBhdGgpO1xuICAgICAgICBpZiAoaXNGTikge1xuICAgICAgICAgICAgZm9sZGVyUGF0aCA9IHRoaXMuZ2V0Tm90ZUZvbGRlclBhdGgobm90ZVBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9sZGVyUGF0aCA9IG5vdGVQYXRoLnN1YnN0cmluZygwLCBub3RlUGF0aC5sYXN0SW5kZXhPZignLycpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9sZGVyUGF0aDtcbiAgICB9XG5cbiAgICAvLyBkZWxldGUgYSBmb2xkZXIgXG4gICAgYXN5bmMgZGVsZXRlRm9sZGVyKHBhdGhUb0RlbDogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLm1ldGhvZCA9PSBOb3RlRmlsZU1ldGhvZC5PdXRzaWRlICYmICFwYXRoVG9EZWwuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgICAgICAvLyBkZWxldGUgYSBmb2xkZXJcbiAgICAgICAgICAgIGxldCBteU5vdGVQYXRoID0gcGF0aFRvRGVsICsgJy5tZCc7XG4gICAgICAgICAgICBsZXQgbm90ZUV4aXN0cyA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKG15Tm90ZVBhdGgpO1xuICAgICAgICAgICAgaWYgKG5vdGVFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLnRyYXNoTG9jYWwobXlOb3RlUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzeW5jIGZvbGRlciAvIG5vdGUgbmFtZVxuICAgIGFzeW5jIHN5bmNOYW1lKG5ld1BhdGg6IGFueSwgb2xkUGF0aDogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLm1ldGhvZCA9PSBOb3RlRmlsZU1ldGhvZC5PdXRzaWRlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN5bmNOYW1lT3V0c2lkZShuZXdQYXRoLCBvbGRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm1ldGhvZCA9PSBOb3RlRmlsZU1ldGhvZC5JbnNpZGUpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3luY05hbWVJbnNpZGUobmV3UGF0aCwgb2xkUGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzeW5jIGZvbGRlciAvIG5vdGUgbmFtZSBmb3Igb3V0c2lkZVxuICAgIGFzeW5jIHN5bmNOYW1lT3V0c2lkZShuZXdQYXRoOiBhbnksIG9sZFBhdGg6IGFueSkge1xuICAgICAgICBpZiAoIW9sZFBhdGguZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgICAgICAvLyBjaGFuZ2luZyBmb2xkZXIgbmFtZVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2NoYW5naW5nIGZvbGRlciEhIScpXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnb2xkUGF0aDogJywgb2xkUGF0aCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbmV3UGF0aDogJywgbmV3UGF0aC5wYXRoKTtcbiAgICAgICAgICAgIGxldCBub3RlRXhpc3RzID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMob2xkUGF0aCArICcubWQnKTtcbiAgICAgICAgICAgIGlmIChub3RlRXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9sZE5vdGVQYXRocyA9IHRoaXMuZ2V0Rm9sZGVyTm90ZVBhdGgob2xkUGF0aCk7XG4gICAgICAgICAgICAgICAgdmFyIG5ld05vdGVQYXRocyA9IHRoaXMuZ2V0Rm9sZGVyTm90ZVBhdGgobmV3UGF0aC5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAob2xkTm90ZVBhdGhzWzFdICE9IG5ld05vdGVQYXRoc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLnJlbmFtZShvbGROb3RlUGF0aHNbMF0sIG5ld05vdGVQYXRoc1swXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gY2hhbmdlaW5nIG5vdGUgbmFtZVxuICAgICAgICAgICAgbGV0IGlzRk4gPSBhd2FpdCB0aGlzLmlzRm9sZGVyTm90ZShvbGRQYXRoKTtcbiAgICAgICAgICAgIGlmIChpc0ZOKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ29sZFBhdGg6ICcsIG9sZFBhdGgpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCduZXdQYXRoOiAnLCBuZXdQYXRoLnBhdGgpO1xuICAgICAgICAgICAgICAgIHZhciBvbGRGb2xkZXJQYXRoID0gdGhpcy5nZXROb3RlRm9sZGVyUGF0aChvbGRQYXRoKTtcbiAgICAgICAgICAgICAgICB2YXIgbmV3Rm9sZGVyUGF0aCA9IHRoaXMuZ2V0Tm90ZUZvbGRlclBhdGgobmV3UGF0aC5wYXRoKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLnJlbmFtZShvbGRGb2xkZXJQYXRoLCBuZXdGb2xkZXJQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vICBzeW5jIGZvbGRlciAvIG5vdGUgbmFtZSBmb3IgaW5zaWRlIGNhc2VcbiAgICBhc3luYyBzeW5jTmFtZUluc2lkZShuZXdQYXRoOiBhbnksIG9sZFBhdGg6IGFueSkge1xuICAgICAgICBpZiAoIW9sZFBhdGguZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgICAgICAvLyBjaGFuZ2luZyBmb2xkZXIgbmFtZVxuICAgICAgICAgICAgdmFyIG9sZE5vdGVQYXRocyA9IHRoaXMuZ2V0Rm9sZGVyTm90ZVBhdGgob2xkUGF0aCk7XG4gICAgICAgICAgICB2YXIgbmV3Tm90ZVBhdGhzID0gdGhpcy5nZXRGb2xkZXJOb3RlUGF0aChuZXdQYXRoLnBhdGgpO1xuICAgICAgICAgICAgdmFyIG9sZE5vdGVQYXRoTmV3ID0gbmV3UGF0aC5wYXRoICsgJy8nICsgb2xkTm90ZVBhdGhzWzFdICsgJy5tZCc7XG4gICAgICAgICAgICBsZXQgbm90ZUV4aXN0cyA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKG9sZE5vdGVQYXRoTmV3KTtcbiAgICAgICAgICAgIGlmIChub3RlRXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld05vdGVQYXRoc1swXSAhPSBvbGROb3RlUGF0aE5ldykge1xuICAgICAgICAgICAgICAgICAgICAvLyBwdXQgaXQgdG8gcmVuYW1lXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNUb1JlbmFtZS5wdXNoKG9sZE5vdGVQYXRoTmV3KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlc1RvUmVuYW1lLnB1c2gobmV3Tm90ZVBhdGhzWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5maWxlc1RvUmVuYW1lLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAvLyBjaGFuZ2luZyBub3RlIG5hbWVcbiAgICAgICAgICAgIGxldCBpc0ZOID0gYXdhaXQgdGhpcy5pc0ZvbGRlck5vdGUob2xkUGF0aCk7XG4gICAgICAgICAgICBpZiAoaXNGTikge1xuICAgICAgICAgICAgICAgIHZhciBvbGRGb2xkZXJQYXRoID0gdGhpcy5nZXROb3RlRm9sZGVyUGF0aChvbGRQYXRoKTtcbiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBuZXcgcGF0aFxuICAgICAgICAgICAgICAgIHZhciBub3RlRGlyID0gbmV3UGF0aC5wYXRoO1xuICAgICAgICAgICAgICAgIG5vdGVEaXIgPSBub3RlRGlyLnN1YnN0cmluZygwLCBub3RlRGlyLmxhc3RJbmRleE9mKCcvJykpO1xuICAgICAgICAgICAgICAgIG5vdGVEaXIgPSBub3RlRGlyLnN1YnN0cmluZygwLCBub3RlRGlyLmxhc3RJbmRleE9mKCcvJykpO1xuICAgICAgICAgICAgICAgIHZhciBub3RlQmFzZSA9IG5ld1BhdGgucGF0aC5zcGxpdCgnLycpLnBvcCgpO1xuICAgICAgICAgICAgICAgIG5vdGVCYXNlID0gbm90ZUJhc2Uuc3Vic3RyaW5nKDAsIG5vdGVCYXNlLmxlbmd0aC0zKTtcbiAgICAgICAgICAgICAgICB2YXIgbmV3Rm9sZGVyUGF0aCA9ICcnO1xuICAgICAgICAgICAgICAgIGlmIChub3RlRGlyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Rm9sZGVyUGF0aCA9IG5vdGVEaXIgKyAnLycgKyBub3RlQmFzZTtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXdGb2xkZXJQYXRoID0gbm90ZUJhc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHB1dCBpdCB0byByZW5hbWVcbiAgICAgICAgICAgICAgICBpZiAob2xkRm9sZGVyUGF0aCAhPSBuZXdGb2xkZXJQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNUb1JlbmFtZS5wdXNoKG9sZEZvbGRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzVG9SZW5hbWUucHVzaChuZXdGb2xkZXJQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gb25seSBkbyBvbmNlIGEgdGltZVxuICAgICAgICBpZiAoIXRoaXMuZmlsZXNUb1JlbmFtZVNldCAmJiB0aGlzLmZpbGVzVG9SZW5hbWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5maWxlc1RvUmVuYW1lU2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdyZW5hbWUgaXMgcnVubmluZyBhZnRlciAxIHMuJyk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsZXNUb1JlbmFtZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZEZvbGRlclBhdGggPSB0aGlzLmZpbGVzVG9SZW5hbWVbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXdGb2xkZXJQYXRoID0gdGhpcy5maWxlc1RvUmVuYW1lWzFdO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnTW9kIE9sZCBQYXRoOicsIG9sZEZvbGRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnTW9kIE5ldyBQYXRoOicsIG5ld0ZvbGRlclBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLnJlbmFtZShvbGRGb2xkZXJQYXRoLCBuZXdGb2xkZXJQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlc1RvUmVuYW1lID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNUb1JlbmFtZVNldCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO1xuICB9O1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgICBvLl9fcHJvdG9fXyA9IHA7XG4gICAgcmV0dXJuIG87XG4gIH07XG5cbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gIHRyeSB7XG4gICAgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgaWYgKF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSkge1xuICAgIF9jb25zdHJ1Y3QgPSBSZWZsZWN0LmNvbnN0cnVjdDtcbiAgfSBlbHNlIHtcbiAgICBfY29uc3RydWN0ID0gZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgICB2YXIgYSA9IFtudWxsXTtcbiAgICAgIGEucHVzaC5hcHBseShhLCBhcmdzKTtcbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoUGFyZW50LCBhKTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDb25zdHJ1Y3RvcigpO1xuICAgICAgaWYgKENsYXNzKSBfc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIENsYXNzLnByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfY29uc3RydWN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZUZ1bmN0aW9uKGZuKSB7XG4gIHJldHVybiBGdW5jdGlvbi50b1N0cmluZy5jYWxsKGZuKS5pbmRleE9mKFwiW25hdGl2ZSBjb2RlXVwiKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHtcbiAgdmFyIF9jYWNoZSA9IHR5cGVvZiBNYXAgPT09IFwiZnVuY3Rpb25cIiA/IG5ldyBNYXAoKSA6IHVuZGVmaW5lZDtcblxuICBfd3JhcE5hdGl2ZVN1cGVyID0gZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICAgIGlmIChDbGFzcyA9PT0gbnVsbCB8fCAhX2lzTmF0aXZlRnVuY3Rpb24oQ2xhc3MpKSByZXR1cm4gQ2xhc3M7XG5cbiAgICBpZiAodHlwZW9mIENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIF9jYWNoZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKF9jYWNoZS5oYXMoQ2xhc3MpKSByZXR1cm4gX2NhY2hlLmdldChDbGFzcyk7XG5cbiAgICAgIF9jYWNoZS5zZXQoQ2xhc3MsIFdyYXBwZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFdyYXBwZXIoKSB7XG4gICAgICByZXR1cm4gX2NvbnN0cnVjdChDbGFzcywgYXJndW1lbnRzLCBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIFdyYXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDbGFzcy5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBXcmFwcGVyLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBfc2V0UHJvdG90eXBlT2YoV3JhcHBlciwgQ2xhc3MpO1xuICB9O1xuXG4gIHJldHVybiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKTtcbn1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfVxuXG4gIHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkge1xuICB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSxcbiAgICAgICAgcmVzdWx0O1xuXG4gICAgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHtcbiAgICAgIHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7XG5cbiAgICAgIHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIF9zdXBlclByb3BCYXNlKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHtcbiAgICBvYmplY3QgPSBfZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTtcbiAgICBpZiAob2JqZWN0ID09PSBudWxsKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59XG5cbmZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmIFJlZmxlY3QuZ2V0KSB7XG4gICAgX2dldCA9IFJlZmxlY3QuZ2V0O1xuICB9IGVsc2Uge1xuICAgIF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gICAgICB2YXIgYmFzZSA9IF9zdXBlclByb3BCYXNlKHRhcmdldCwgcHJvcGVydHkpO1xuXG4gICAgICBpZiAoIWJhc2UpIHJldHVybjtcbiAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihiYXNlLCBwcm9wZXJ0eSk7XG5cbiAgICAgIGlmIChkZXNjLmdldCkge1xuICAgICAgICByZXR1cm4gZGVzYy5nZXQuY2FsbChyZWNlaXZlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZXNjLnZhbHVlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlciB8fCB0YXJnZXQpO1xufVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cblxuZnVuY3Rpb24gX3RvQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG4gIHZhciBfZSA9IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcblxuICByZXR1cm4gYXJyMjtcbn1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIobykge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCBvW1N5bWJvbC5pdGVyYXRvcl0gPT0gbnVsbCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChvID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSkge1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzOiBGLFxuICAgICAgICBuOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7XG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgICAgICB2YWx1ZTogb1tpKytdXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9LFxuICAgICAgICBmOiBGXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbiAgfVxuXG4gIHZhciBpdCxcbiAgICAgIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLFxuICAgICAgZGlkRXJyID0gZmFsc2UsXG4gICAgICBlcnI7XG4gIHJldHVybiB7XG4gICAgczogZnVuY3Rpb24gKCkge1xuICAgICAgaXQgPSBvW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9LFxuICAgIG46IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGVwID0gaXQubmV4dCgpO1xuICAgICAgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTtcbiAgICAgIHJldHVybiBzdGVwO1xuICAgIH0sXG4gICAgZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgIGRpZEVyciA9IHRydWU7XG4gICAgICBlcnIgPSBlO1xuICAgIH0sXG4gICAgZjogZnVuY3Rpb24gKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChkaWRFcnIpIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbnZhciBDaGFyID0ge1xuICBBTkNIT1I6ICcmJyxcbiAgQ09NTUVOVDogJyMnLFxuICBUQUc6ICchJyxcbiAgRElSRUNUSVZFU19FTkQ6ICctJyxcbiAgRE9DVU1FTlRfRU5EOiAnLidcbn07XG52YXIgVHlwZSA9IHtcbiAgQUxJQVM6ICdBTElBUycsXG4gIEJMQU5LX0xJTkU6ICdCTEFOS19MSU5FJyxcbiAgQkxPQ0tfRk9MREVEOiAnQkxPQ0tfRk9MREVEJyxcbiAgQkxPQ0tfTElURVJBTDogJ0JMT0NLX0xJVEVSQUwnLFxuICBDT01NRU5UOiAnQ09NTUVOVCcsXG4gIERJUkVDVElWRTogJ0RJUkVDVElWRScsXG4gIERPQ1VNRU5UOiAnRE9DVU1FTlQnLFxuICBGTE9XX01BUDogJ0ZMT1dfTUFQJyxcbiAgRkxPV19TRVE6ICdGTE9XX1NFUScsXG4gIE1BUDogJ01BUCcsXG4gIE1BUF9LRVk6ICdNQVBfS0VZJyxcbiAgTUFQX1ZBTFVFOiAnTUFQX1ZBTFVFJyxcbiAgUExBSU46ICdQTEFJTicsXG4gIFFVT1RFX0RPVUJMRTogJ1FVT1RFX0RPVUJMRScsXG4gIFFVT1RFX1NJTkdMRTogJ1FVT1RFX1NJTkdMRScsXG4gIFNFUTogJ1NFUScsXG4gIFNFUV9JVEVNOiAnU0VRX0lURU0nXG59O1xudmFyIGRlZmF1bHRUYWdQcmVmaXggPSAndGFnOnlhbWwub3JnLDIwMDI6JztcbnZhciBkZWZhdWx0VGFncyA9IHtcbiAgTUFQOiAndGFnOnlhbWwub3JnLDIwMDI6bWFwJyxcbiAgU0VROiAndGFnOnlhbWwub3JnLDIwMDI6c2VxJyxcbiAgU1RSOiAndGFnOnlhbWwub3JnLDIwMDI6c3RyJ1xufTtcblxuZnVuY3Rpb24gZmluZExpbmVTdGFydHMoc3JjKSB7XG4gIHZhciBscyA9IFswXTtcbiAgdmFyIG9mZnNldCA9IHNyYy5pbmRleE9mKCdcXG4nKTtcblxuICB3aGlsZSAob2Zmc2V0ICE9PSAtMSkge1xuICAgIG9mZnNldCArPSAxO1xuICAgIGxzLnB1c2gob2Zmc2V0KTtcbiAgICBvZmZzZXQgPSBzcmMuaW5kZXhPZignXFxuJywgb2Zmc2V0KTtcbiAgfVxuXG4gIHJldHVybiBscztcbn1cblxuZnVuY3Rpb24gZ2V0U3JjSW5mbyhjc3QpIHtcbiAgdmFyIGxpbmVTdGFydHMsIHNyYztcblxuICBpZiAodHlwZW9mIGNzdCA9PT0gJ3N0cmluZycpIHtcbiAgICBsaW5lU3RhcnRzID0gZmluZExpbmVTdGFydHMoY3N0KTtcbiAgICBzcmMgPSBjc3Q7XG4gIH0gZWxzZSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY3N0KSkgY3N0ID0gY3N0WzBdO1xuXG4gICAgaWYgKGNzdCAmJiBjc3QuY29udGV4dCkge1xuICAgICAgaWYgKCFjc3QubGluZVN0YXJ0cykgY3N0LmxpbmVTdGFydHMgPSBmaW5kTGluZVN0YXJ0cyhjc3QuY29udGV4dC5zcmMpO1xuICAgICAgbGluZVN0YXJ0cyA9IGNzdC5saW5lU3RhcnRzO1xuICAgICAgc3JjID0gY3N0LmNvbnRleHQuc3JjO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbGluZVN0YXJ0czogbGluZVN0YXJ0cyxcbiAgICBzcmM6IHNyY1xuICB9O1xufVxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMaW5lUG9zIC0gT25lLWluZGV4ZWQgcG9zaXRpb24gaW4gdGhlIHNvdXJjZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb2xcbiAqL1xuXG4vKipcbiAqIERldGVybWluZSB0aGUgbGluZS9jb2wgcG9zaXRpb24gbWF0Y2hpbmcgYSBjaGFyYWN0ZXIgb2Zmc2V0LlxuICpcbiAqIEFjY2VwdHMgYSBzb3VyY2Ugc3RyaW5nIG9yIGEgQ1NUIGRvY3VtZW50IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiBXaXRoXG4gKiB0aGUgbGF0dGVyLCBzdGFydGluZyBpbmRpY2VzIGZvciBsaW5lcyBhcmUgY2FjaGVkIGluIHRoZSBkb2N1bWVudCBhc1xuICogYGxpbmVTdGFydHM6IG51bWJlcltdYC5cbiAqXG4gKiBSZXR1cm5zIGEgb25lLWluZGV4ZWQgYHsgbGluZSwgY29sIH1gIGxvY2F0aW9uIGlmIGZvdW5kLCBvclxuICogYHVuZGVmaW5lZGAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqIEBwYXJhbSB7c3RyaW5nfERvY3VtZW50fERvY3VtZW50W119IGNzdFxuICogQHJldHVybnMgez9MaW5lUG9zfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0TGluZVBvcyhvZmZzZXQsIGNzdCkge1xuICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicgfHwgb2Zmc2V0IDwgMCkgcmV0dXJuIG51bGw7XG5cbiAgdmFyIF9nZXRTcmNJbmZvID0gZ2V0U3JjSW5mbyhjc3QpLFxuICAgICAgbGluZVN0YXJ0cyA9IF9nZXRTcmNJbmZvLmxpbmVTdGFydHMsXG4gICAgICBzcmMgPSBfZ2V0U3JjSW5mby5zcmM7XG5cbiAgaWYgKCFsaW5lU3RhcnRzIHx8ICFzcmMgfHwgb2Zmc2V0ID4gc3JjLmxlbmd0aCkgcmV0dXJuIG51bGw7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lU3RhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHN0YXJ0ID0gbGluZVN0YXJ0c1tpXTtcblxuICAgIGlmIChvZmZzZXQgPCBzdGFydCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGluZTogaSxcbiAgICAgICAgY29sOiBvZmZzZXQgLSBsaW5lU3RhcnRzW2kgLSAxXSArIDFcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG9mZnNldCA9PT0gc3RhcnQpIHJldHVybiB7XG4gICAgICBsaW5lOiBpICsgMSxcbiAgICAgIGNvbDogMVxuICAgIH07XG4gIH1cblxuICB2YXIgbGluZSA9IGxpbmVTdGFydHMubGVuZ3RoO1xuICByZXR1cm4ge1xuICAgIGxpbmU6IGxpbmUsXG4gICAgY29sOiBvZmZzZXQgLSBsaW5lU3RhcnRzW2xpbmUgLSAxXSArIDFcbiAgfTtcbn1cbi8qKlxuICogR2V0IGEgc3BlY2lmaWVkIGxpbmUgZnJvbSB0aGUgc291cmNlLlxuICpcbiAqIEFjY2VwdHMgYSBzb3VyY2Ugc3RyaW5nIG9yIGEgQ1NUIGRvY3VtZW50IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLiBXaXRoXG4gKiB0aGUgbGF0dGVyLCBzdGFydGluZyBpbmRpY2VzIGZvciBsaW5lcyBhcmUgY2FjaGVkIGluIHRoZSBkb2N1bWVudCBhc1xuICogYGxpbmVTdGFydHM6IG51bWJlcltdYC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBsaW5lIGFzIGEgc3RyaW5nIGlmIGZvdW5kLCBvciBgbnVsbGAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsaW5lIE9uZS1pbmRleGVkIGxpbmUgbnVtYmVyXG4gKiBAcGFyYW0ge3N0cmluZ3xEb2N1bWVudHxEb2N1bWVudFtdfSBjc3RcbiAqIEByZXR1cm5zIHs/c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGdldExpbmUobGluZSwgY3N0KSB7XG4gIHZhciBfZ2V0U3JjSW5mbzIgPSBnZXRTcmNJbmZvKGNzdCksXG4gICAgICBsaW5lU3RhcnRzID0gX2dldFNyY0luZm8yLmxpbmVTdGFydHMsXG4gICAgICBzcmMgPSBfZ2V0U3JjSW5mbzIuc3JjO1xuXG4gIGlmICghbGluZVN0YXJ0cyB8fCAhKGxpbmUgPj0gMSkgfHwgbGluZSA+IGxpbmVTdGFydHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgdmFyIHN0YXJ0ID0gbGluZVN0YXJ0c1tsaW5lIC0gMV07XG4gIHZhciBlbmQgPSBsaW5lU3RhcnRzW2xpbmVdOyAvLyB1bmRlZmluZWQgZm9yIGxhc3QgbGluZTsgdGhhdCdzIG9rIGZvciBzbGljZSgpXG5cbiAgd2hpbGUgKGVuZCAmJiBlbmQgPiBzdGFydCAmJiBzcmNbZW5kIC0gMV0gPT09ICdcXG4nKSB7XG4gICAgLS1lbmQ7XG4gIH1cblxuICByZXR1cm4gc3JjLnNsaWNlKHN0YXJ0LCBlbmQpO1xufVxuLyoqXG4gKiBQcmV0dHktcHJpbnQgdGhlIHN0YXJ0aW5nIGxpbmUgZnJvbSB0aGUgc291cmNlIGluZGljYXRlZCBieSB0aGUgcmFuZ2UgYHBvc2BcbiAqXG4gKiBUcmltcyBvdXRwdXQgdG8gYG1heFdpZHRoYCBjaGFycyB3aGlsZSBrZWVwaW5nIHRoZSBzdGFydGluZyBjb2x1bW4gdmlzaWJsZSxcbiAqIHVzaW5nIGDigKZgIGF0IGVpdGhlciBlbmQgdG8gaW5kaWNhdGUgZHJvcHBlZCBjaGFyYWN0ZXJzLlxuICpcbiAqIFJldHVybnMgYSB0d28tbGluZSBzdHJpbmcgKG9yIGBudWxsYCkgd2l0aCBgXFxuYCBhcyBzZXBhcmF0b3I7IHRoZSBzZWNvbmQgbGluZVxuICogd2lsbCBob2xkIGFwcHJvcHJpYXRlbHkgaW5kZW50ZWQgYF5gIG1hcmtzIGluZGljYXRpbmcgdGhlIGNvbHVtbiByYW5nZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcG9zXG4gKiBAcGFyYW0ge0xpbmVQb3N9IHBvcy5zdGFydFxuICogQHBhcmFtIHtMaW5lUG9zfSBbcG9zLmVuZF1cbiAqIEBwYXJhbSB7c3RyaW5nfERvY3VtZW50fERvY3VtZW50W10qfSBjc3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4V2lkdGg9ODBdXG4gKiBAcmV0dXJucyB7P3N0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBnZXRQcmV0dHlDb250ZXh0KF9yZWYsIGNzdCkge1xuICB2YXIgc3RhcnQgPSBfcmVmLnN0YXJ0LFxuICAgICAgZW5kID0gX3JlZi5lbmQ7XG4gIHZhciBtYXhXaWR0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogODA7XG4gIHZhciBzcmMgPSBnZXRMaW5lKHN0YXJ0LmxpbmUsIGNzdCk7XG4gIGlmICghc3JjKSByZXR1cm4gbnVsbDtcbiAgdmFyIGNvbCA9IHN0YXJ0LmNvbDtcblxuICBpZiAoc3JjLmxlbmd0aCA+IG1heFdpZHRoKSB7XG4gICAgaWYgKGNvbCA8PSBtYXhXaWR0aCAtIDEwKSB7XG4gICAgICBzcmMgPSBzcmMuc3Vic3RyKDAsIG1heFdpZHRoIC0gMSkgKyAn4oCmJztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGhhbGZXaWR0aCA9IE1hdGgucm91bmQobWF4V2lkdGggLyAyKTtcbiAgICAgIGlmIChzcmMubGVuZ3RoID4gY29sICsgaGFsZldpZHRoKSBzcmMgPSBzcmMuc3Vic3RyKDAsIGNvbCArIGhhbGZXaWR0aCAtIDEpICsgJ+KApic7XG4gICAgICBjb2wgLT0gc3JjLmxlbmd0aCAtIG1heFdpZHRoO1xuICAgICAgc3JjID0gJ+KApicgKyBzcmMuc3Vic3RyKDEgLSBtYXhXaWR0aCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVyckxlbiA9IDE7XG4gIHZhciBlcnJFbmQgPSAnJztcblxuICBpZiAoZW5kKSB7XG4gICAgaWYgKGVuZC5saW5lID09PSBzdGFydC5saW5lICYmIGNvbCArIChlbmQuY29sIC0gc3RhcnQuY29sKSA8PSBtYXhXaWR0aCArIDEpIHtcbiAgICAgIGVyckxlbiA9IGVuZC5jb2wgLSBzdGFydC5jb2w7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVyckxlbiA9IE1hdGgubWluKHNyYy5sZW5ndGggKyAxLCBtYXhXaWR0aCkgLSBjb2w7XG4gICAgICBlcnJFbmQgPSAn4oCmJztcbiAgICB9XG4gIH1cblxuICB2YXIgb2Zmc2V0ID0gY29sID4gMSA/ICcgJy5yZXBlYXQoY29sIC0gMSkgOiAnJztcbiAgdmFyIGVyciA9ICdeJy5yZXBlYXQoZXJyTGVuKTtcbiAgcmV0dXJuIFwiXCIuY29uY2F0KHNyYywgXCJcXG5cIikuY29uY2F0KG9mZnNldCkuY29uY2F0KGVycikuY29uY2F0KGVyckVuZCk7XG59XG5cbnZhciBSYW5nZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIF9jcmVhdGVDbGFzcyhSYW5nZSwgbnVsbCwgW3tcbiAgICBrZXk6IFwiY29weVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5KG9yaWcpIHtcbiAgICAgIHJldHVybiBuZXcgUmFuZ2Uob3JpZy5zdGFydCwgb3JpZy5lbmQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIFJhbmdlKHN0YXJ0LCBlbmQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmFuZ2UpO1xuXG4gICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuZW5kID0gZW5kIHx8IHN0YXJ0O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFJhbmdlLCBbe1xuICAgIGtleTogXCJpc0VtcHR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzRW1wdHkoKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHRoaXMuc3RhcnQgIT09ICdudW1iZXInIHx8ICF0aGlzLmVuZCB8fCB0aGlzLmVuZCA8PSB0aGlzLnN0YXJ0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgYG9yaWdTdGFydGAgYW5kIGBvcmlnRW5kYCB0byBwb2ludCB0byB0aGUgb3JpZ2luYWwgc291cmNlIHJhbmdlIGZvclxuICAgICAqIHRoaXMgbm9kZSwgd2hpY2ggbWF5IGRpZmZlciBkdWUgdG8gZHJvcHBlZCBDUiBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gY3IgLSBQb3NpdGlvbnMgb2YgZHJvcHBlZCBDUiBjaGFyYWN0ZXJzXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCAtIFN0YXJ0aW5nIGluZGV4IG9mIGBjcmAgZnJvbSB0aGUgbGFzdCBjYWxsXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBUaGUgbmV4dCBvZmZzZXQsIG1hdGNoaW5nIHRoZSBvbmUgZm91bmQgZm9yIGBvcmlnU3RhcnRgXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRPcmlnUmFuZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0T3JpZ1JhbmdlKGNyLCBvZmZzZXQpIHtcbiAgICAgIHZhciBzdGFydCA9IHRoaXMuc3RhcnQsXG4gICAgICAgICAgZW5kID0gdGhpcy5lbmQ7XG5cbiAgICAgIGlmIChjci5sZW5ndGggPT09IDAgfHwgZW5kIDw9IGNyWzBdKSB7XG4gICAgICAgIHRoaXMub3JpZ1N0YXJ0ID0gc3RhcnQ7XG4gICAgICAgIHRoaXMub3JpZ0VuZCA9IGVuZDtcbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICAgIH1cblxuICAgICAgdmFyIGkgPSBvZmZzZXQ7XG5cbiAgICAgIHdoaWxlIChpIDwgY3IubGVuZ3RoKSB7XG4gICAgICAgIGlmIChjcltpXSA+IHN0YXJ0KSBicmVhaztlbHNlICsraTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcmlnU3RhcnQgPSBzdGFydCArIGk7XG4gICAgICB2YXIgbmV4dE9mZnNldCA9IGk7XG5cbiAgICAgIHdoaWxlIChpIDwgY3IubGVuZ3RoKSB7XG4gICAgICAgIC8vIGlmIGVuZCB3YXMgYXQgXFxuLCBpdCBzaG91bGQgbm93IGJlIGF0IFxcclxuICAgICAgICBpZiAoY3JbaV0gPj0gZW5kKSBicmVhaztlbHNlICsraTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcmlnRW5kID0gZW5kICsgaTtcbiAgICAgIHJldHVybiBuZXh0T2Zmc2V0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSYW5nZTtcbn0oKTtcblxuLyoqIFJvb3QgY2xhc3Mgb2YgYWxsIG5vZGVzICovXG5cbnZhciBOb2RlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgX2NyZWF0ZUNsYXNzKE5vZGUsIG51bGwsIFt7XG4gICAga2V5OiBcImFkZFN0cmluZ1Rlcm1pbmF0b3JcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkU3RyaW5nVGVybWluYXRvcihzcmMsIG9mZnNldCwgc3RyKSB7XG4gICAgICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJ1xcbicpIHJldHVybiBzdHI7XG4gICAgICB2YXIgbmV4dCA9IE5vZGUuZW5kT2ZXaGl0ZVNwYWNlKHNyYywgb2Zmc2V0KTtcbiAgICAgIHJldHVybiBuZXh0ID49IHNyYy5sZW5ndGggfHwgc3JjW25leHRdID09PSAnXFxuJyA/IHN0ciArICdcXG4nIDogc3RyO1xuICAgIH0gLy8gXigtLS18Li4uKVxuXG4gIH0sIHtcbiAgICBrZXk6IFwiYXREb2N1bWVudEJvdW5kYXJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0RG9jdW1lbnRCb3VuZGFyeShzcmMsIG9mZnNldCwgc2VwKSB7XG4gICAgICB2YXIgY2gwID0gc3JjW29mZnNldF07XG4gICAgICBpZiAoIWNoMCkgcmV0dXJuIHRydWU7XG4gICAgICB2YXIgcHJldiA9IHNyY1tvZmZzZXQgLSAxXTtcbiAgICAgIGlmIChwcmV2ICYmIHByZXYgIT09ICdcXG4nKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGlmIChzZXApIHtcbiAgICAgICAgaWYgKGNoMCAhPT0gc2VwKSByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY2gwICE9PSBDaGFyLkRJUkVDVElWRVNfRU5EICYmIGNoMCAhPT0gQ2hhci5ET0NVTUVOVF9FTkQpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNoMSA9IHNyY1tvZmZzZXQgKyAxXTtcbiAgICAgIHZhciBjaDIgPSBzcmNbb2Zmc2V0ICsgMl07XG4gICAgICBpZiAoY2gxICE9PSBjaDAgfHwgY2gyICE9PSBjaDApIHJldHVybiBmYWxzZTtcbiAgICAgIHZhciBjaDMgPSBzcmNbb2Zmc2V0ICsgM107XG4gICAgICByZXR1cm4gIWNoMyB8fCBjaDMgPT09ICdcXG4nIHx8IGNoMyA9PT0gJ1xcdCcgfHwgY2gzID09PSAnICc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImVuZE9mSWRlbnRpZmllclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmRPZklkZW50aWZpZXIoc3JjLCBvZmZzZXQpIHtcbiAgICAgIHZhciBjaCA9IHNyY1tvZmZzZXRdO1xuICAgICAgdmFyIGlzVmVyYmF0aW0gPSBjaCA9PT0gJzwnO1xuICAgICAgdmFyIG5vdE9rID0gaXNWZXJiYXRpbSA/IFsnXFxuJywgJ1xcdCcsICcgJywgJz4nXSA6IFsnXFxuJywgJ1xcdCcsICcgJywgJ1snLCAnXScsICd7JywgJ30nLCAnLCddO1xuXG4gICAgICB3aGlsZSAoY2ggJiYgbm90T2suaW5kZXhPZihjaCkgPT09IC0xKSB7XG4gICAgICAgIGNoID0gc3JjW29mZnNldCArPSAxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVmVyYmF0aW0gJiYgY2ggPT09ICc+Jykgb2Zmc2V0ICs9IDE7XG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbmRPZkluZGVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmRPZkluZGVudChzcmMsIG9mZnNldCkge1xuICAgICAgdmFyIGNoID0gc3JjW29mZnNldF07XG5cbiAgICAgIHdoaWxlIChjaCA9PT0gJyAnKSB7XG4gICAgICAgIGNoID0gc3JjW29mZnNldCArPSAxXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5kT2ZMaW5lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuZE9mTGluZShzcmMsIG9mZnNldCkge1xuICAgICAgdmFyIGNoID0gc3JjW29mZnNldF07XG5cbiAgICAgIHdoaWxlIChjaCAmJiBjaCAhPT0gJ1xcbicpIHtcbiAgICAgICAgY2ggPSBzcmNbb2Zmc2V0ICs9IDFdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJlbmRPZldoaXRlU3BhY2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZW5kT2ZXaGl0ZVNwYWNlKHNyYywgb2Zmc2V0KSB7XG4gICAgICB2YXIgY2ggPSBzcmNbb2Zmc2V0XTtcblxuICAgICAgd2hpbGUgKGNoID09PSAnXFx0JyB8fCBjaCA9PT0gJyAnKSB7XG4gICAgICAgIGNoID0gc3JjW29mZnNldCArPSAxXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhcnRPZkxpbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RhcnRPZkxpbmUoc3JjLCBvZmZzZXQpIHtcbiAgICAgIHZhciBjaCA9IHNyY1tvZmZzZXQgLSAxXTtcbiAgICAgIGlmIChjaCA9PT0gJ1xcbicpIHJldHVybiBvZmZzZXQ7XG5cbiAgICAgIHdoaWxlIChjaCAmJiBjaCAhPT0gJ1xcbicpIHtcbiAgICAgICAgY2ggPSBzcmNbb2Zmc2V0IC09IDFdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2Zmc2V0ICsgMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5kIG9mIGluZGVudGF0aW9uLCBvciBudWxsIGlmIHRoZSBsaW5lJ3MgaW5kZW50IGxldmVsIGlzIG5vdCBtb3JlXG4gICAgICogdGhhbiBgaW5kZW50YFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNyY1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRlbnRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGluZVN0YXJ0XG4gICAgICogQHJldHVybnMgez9udW1iZXJ9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJlbmRPZkJsb2NrSW5kZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuZE9mQmxvY2tJbmRlbnQoc3JjLCBpbmRlbnQsIGxpbmVTdGFydCkge1xuICAgICAgdmFyIGluRW5kID0gTm9kZS5lbmRPZkluZGVudChzcmMsIGxpbmVTdGFydCk7XG5cbiAgICAgIGlmIChpbkVuZCA+IGxpbmVTdGFydCArIGluZGVudCkge1xuICAgICAgICByZXR1cm4gaW5FbmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgd3NFbmQgPSBOb2RlLmVuZE9mV2hpdGVTcGFjZShzcmMsIGluRW5kKTtcbiAgICAgICAgdmFyIGNoID0gc3JjW3dzRW5kXTtcbiAgICAgICAgaWYgKCFjaCB8fCBjaCA9PT0gJ1xcbicpIHJldHVybiB3c0VuZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImF0QmxhbmtcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXRCbGFuayhzcmMsIG9mZnNldCwgZW5kQXNCbGFuaykge1xuICAgICAgdmFyIGNoID0gc3JjW29mZnNldF07XG4gICAgICByZXR1cm4gY2ggPT09ICdcXG4nIHx8IGNoID09PSAnXFx0JyB8fCBjaCA9PT0gJyAnIHx8IGVuZEFzQmxhbmsgJiYgIWNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXh0Tm9kZUlzSW5kZW50ZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmV4dE5vZGVJc0luZGVudGVkKGNoLCBpbmRlbnREaWZmLCBpbmRpY2F0b3JBc0luZGVudCkge1xuICAgICAgaWYgKCFjaCB8fCBpbmRlbnREaWZmIDwgMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGluZGVudERpZmYgPiAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBpbmRpY2F0b3JBc0luZGVudCAmJiBjaCA9PT0gJy0nO1xuICAgIH0gLy8gc2hvdWxkIGJlIGF0IGxpbmUgb3Igc3RyaW5nIGVuZCwgb3IgYXQgbmV4dCBub24td2hpdGVzcGFjZSBjaGFyXG5cbiAgfSwge1xuICAgIGtleTogXCJub3JtYWxpemVPZmZzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbm9ybWFsaXplT2Zmc2V0KHNyYywgb2Zmc2V0KSB7XG4gICAgICB2YXIgY2ggPSBzcmNbb2Zmc2V0XTtcbiAgICAgIHJldHVybiAhY2ggPyBvZmZzZXQgOiBjaCAhPT0gJ1xcbicgJiYgc3JjW29mZnNldCAtIDFdID09PSAnXFxuJyA/IG9mZnNldCAtIDEgOiBOb2RlLmVuZE9mV2hpdGVTcGFjZShzcmMsIG9mZnNldCk7XG4gICAgfSAvLyBmb2xkIHNpbmdsZSBuZXdsaW5lIGludG8gc3BhY2UsIG11bHRpcGxlIG5ld2xpbmVzIHRvIE4gLSAxIG5ld2xpbmVzXG4gICAgLy8gcHJlc3VtZXMgc3JjW29mZnNldF0gPT09ICdcXG4nXG5cbiAgfSwge1xuICAgIGtleTogXCJmb2xkTmV3bGluZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb2xkTmV3bGluZShzcmMsIG9mZnNldCwgaW5kZW50KSB7XG4gICAgICB2YXIgaW5Db3VudCA9IDA7XG4gICAgICB2YXIgZXJyb3IgPSBmYWxzZTtcbiAgICAgIHZhciBmb2xkID0gJyc7XG4gICAgICB2YXIgY2ggPSBzcmNbb2Zmc2V0ICsgMV07XG5cbiAgICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JyB8fCBjaCA9PT0gJ1xcbicpIHtcbiAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgICAgICBpbkNvdW50ID0gMDtcbiAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgZm9sZCArPSAnXFxuJztcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnXFx0JzpcbiAgICAgICAgICAgIGlmIChpbkNvdW50IDw9IGluZGVudCkgZXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgb2Zmc2V0ID0gTm9kZS5lbmRPZldoaXRlU3BhY2Uoc3JjLCBvZmZzZXQgKyAyKSAtIDE7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgaW5Db3VudCArPSAxO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNoID0gc3JjW29mZnNldCArIDFdO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZvbGQpIGZvbGQgPSAnICc7XG4gICAgICBpZiAoY2ggJiYgaW5Db3VudCA8PSBpbmRlbnQpIGVycm9yID0gdHJ1ZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvbGQ6IGZvbGQsXG4gICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgIH07XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gTm9kZSh0eXBlLCBwcm9wcywgY29udGV4dCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBOb2RlKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29udGV4dCcsIHtcbiAgICAgIHZhbHVlOiBjb250ZXh0IHx8IG51bGwsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIHRoaXMucmFuZ2UgPSBudWxsO1xuICAgIHRoaXMudmFsdWVSYW5nZSA9IG51bGw7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzIHx8IFtdO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTm9kZSwgW3tcbiAgICBrZXk6IFwiZ2V0UHJvcFZhbHVlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFByb3BWYWx1ZShpZHgsIGtleSwgc2tpcEtleSkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRleHQpIHJldHVybiBudWxsO1xuICAgICAgdmFyIHNyYyA9IHRoaXMuY29udGV4dC5zcmM7XG4gICAgICB2YXIgcHJvcCA9IHRoaXMucHJvcHNbaWR4XTtcbiAgICAgIHJldHVybiBwcm9wICYmIHNyY1twcm9wLnN0YXJ0XSA9PT0ga2V5ID8gc3JjLnNsaWNlKHByb3Auc3RhcnQgKyAoc2tpcEtleSA/IDEgOiAwKSwgcHJvcC5lbmQpIDogbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tbWVudEhhc1JlcXVpcmVkV2hpdGVzcGFjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21tZW50SGFzUmVxdWlyZWRXaGl0ZXNwYWNlKHN0YXJ0KSB7XG4gICAgICB2YXIgc3JjID0gdGhpcy5jb250ZXh0LnNyYztcbiAgICAgIGlmICh0aGlzLmhlYWRlciAmJiBzdGFydCA9PT0gdGhpcy5oZWFkZXIuZW5kKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIXRoaXMudmFsdWVSYW5nZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIGVuZCA9IHRoaXMudmFsdWVSYW5nZS5lbmQ7XG4gICAgICByZXR1cm4gc3RhcnQgIT09IGVuZCB8fCBOb2RlLmF0Qmxhbmsoc3JjLCBlbmQgLSAxKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFyc2VDb21tZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlQ29tbWVudChzdGFydCkge1xuICAgICAgdmFyIHNyYyA9IHRoaXMuY29udGV4dC5zcmM7XG5cbiAgICAgIGlmIChzcmNbc3RhcnRdID09PSBDaGFyLkNPTU1FTlQpIHtcbiAgICAgICAgdmFyIGVuZCA9IE5vZGUuZW5kT2ZMaW5lKHNyYywgc3RhcnQgKyAxKTtcbiAgICAgICAgdmFyIGNvbW1lbnRSYW5nZSA9IG5ldyBSYW5nZShzdGFydCwgZW5kKTtcbiAgICAgICAgdGhpcy5wcm9wcy5wdXNoKGNvbW1lbnRSYW5nZSk7XG4gICAgICAgIHJldHVybiBlbmQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGFydDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUG9wdWxhdGVzIHRoZSBgb3JpZ1N0YXJ0YCBhbmQgYG9yaWdFbmRgIHZhbHVlcyBvZiBhbGwgcmFuZ2VzIGZvciB0aGlzXG4gICAgICogbm9kZS4gRXh0ZW5kZWQgYnkgY2hpbGQgY2xhc3NlcyB0byBoYW5kbGUgZGVzY2VuZGFudCBub2Rlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGNyIC0gUG9zaXRpb25zIG9mIGRyb3BwZWQgQ1IgY2hhcmFjdGVyc1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgLSBTdGFydGluZyBpbmRleCBvZiBgY3JgIGZyb20gdGhlIGxhc3QgY2FsbFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIG5leHQgb2Zmc2V0LCBtYXRjaGluZyB0aGUgb25lIGZvdW5kIGZvciBgb3JpZ1N0YXJ0YFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0T3JpZ1Jhbmdlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRPcmlnUmFuZ2VzKGNyLCBvZmZzZXQpIHtcbiAgICAgIGlmICh0aGlzLnJhbmdlKSBvZmZzZXQgPSB0aGlzLnJhbmdlLnNldE9yaWdSYW5nZShjciwgb2Zmc2V0KTtcbiAgICAgIGlmICh0aGlzLnZhbHVlUmFuZ2UpIHRoaXMudmFsdWVSYW5nZS5zZXRPcmlnUmFuZ2UoY3IsIG9mZnNldCk7XG4gICAgICB0aGlzLnByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgcmV0dXJuIHByb3Auc2V0T3JpZ1JhbmdlKGNyLCBvZmZzZXQpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHZhciBzcmMgPSB0aGlzLmNvbnRleHQuc3JjLFxuICAgICAgICAgIHJhbmdlID0gdGhpcy5yYW5nZSxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkgcmV0dXJuIHZhbHVlO1xuICAgICAgdmFyIHN0ciA9IHNyYy5zbGljZShyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICAgIHJldHVybiBOb2RlLmFkZFN0cmluZ1Rlcm1pbmF0b3Ioc3JjLCByYW5nZS5lbmQsIHN0cik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFuY2hvclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnByb3BzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBhbmNob3IgPSB0aGlzLmdldFByb3BWYWx1ZShpLCBDaGFyLkFOQ0hPUiwgdHJ1ZSk7XG4gICAgICAgIGlmIChhbmNob3IgIT0gbnVsbCkgcmV0dXJuIGFuY2hvcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbW1lbnRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHZhciBjb21tZW50cyA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGNvbW1lbnQgPSB0aGlzLmdldFByb3BWYWx1ZShpLCBDaGFyLkNPTU1FTlQsIHRydWUpO1xuICAgICAgICBpZiAoY29tbWVudCAhPSBudWxsKSBjb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29tbWVudHMubGVuZ3RoID4gMCA/IGNvbW1lbnRzLmpvaW4oJ1xcbicpIDogbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzQ29tbWVudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuY29udGV4dCkge1xuICAgICAgICB2YXIgc3JjID0gdGhpcy5jb250ZXh0LnNyYztcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpZiAoc3JjW3RoaXMucHJvcHNbaV0uc3RhcnRdID09PSBDaGFyLkNPTU1FTlQpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzUHJvcHNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgdmFyIHNyYyA9IHRoaXMuY29udGV4dC5zcmM7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnByb3BzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgaWYgKHNyY1t0aGlzLnByb3BzW2ldLnN0YXJ0XSAhPT0gQ2hhci5DT01NRU5UKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImluY2x1ZGVzVHJhaWxpbmdMaW5lc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJqc29uTGlrZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIGpzb25MaWtlVHlwZXMgPSBbVHlwZS5GTE9XX01BUCwgVHlwZS5GTE9XX1NFUSwgVHlwZS5RVU9URV9ET1VCTEUsIFR5cGUuUVVPVEVfU0lOR0xFXTtcbiAgICAgIHJldHVybiBqc29uTGlrZVR5cGVzLmluZGV4T2YodGhpcy50eXBlKSAhPT0gLTE7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJhbmdlQXNMaW5lUG9zXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoIXRoaXMucmFuZ2UgfHwgIXRoaXMuY29udGV4dCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHZhciBzdGFydCA9IGdldExpbmVQb3ModGhpcy5yYW5nZS5zdGFydCwgdGhpcy5jb250ZXh0LnJvb3QpO1xuICAgICAgaWYgKCFzdGFydCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHZhciBlbmQgPSBnZXRMaW5lUG9zKHRoaXMucmFuZ2UuZW5kLCB0aGlzLmNvbnRleHQucm9vdCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogc3RhcnQsXG4gICAgICAgIGVuZDogZW5kXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyYXdWYWx1ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlUmFuZ2UgfHwgIXRoaXMuY29udGV4dCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgX3RoaXMkdmFsdWVSYW5nZSA9IHRoaXMudmFsdWVSYW5nZSxcbiAgICAgICAgICBzdGFydCA9IF90aGlzJHZhbHVlUmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgZW5kID0gX3RoaXMkdmFsdWVSYW5nZS5lbmQ7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnNyYy5zbGljZShzdGFydCwgZW5kKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidGFnXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHRhZyA9IHRoaXMuZ2V0UHJvcFZhbHVlKGksIENoYXIuVEFHLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHRhZ1sxXSA9PT0gJzwnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB2ZXJiYXRpbTogdGFnLnNsaWNlKDIsIC0xKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICAgICAgICB2YXIgX3RhZyRtYXRjaCA9IHRhZy5tYXRjaCgvXiguKiEpKFteIV0qKSQvKSxcbiAgICAgICAgICAgICAgICBfdGFnJG1hdGNoMiA9IF9zbGljZWRUb0FycmF5KF90YWckbWF0Y2gsIDMpLFxuICAgICAgICAgICAgICAgIF8gPSBfdGFnJG1hdGNoMlswXSxcbiAgICAgICAgICAgICAgICBoYW5kbGUgPSBfdGFnJG1hdGNoMlsxXSxcbiAgICAgICAgICAgICAgICBzdWZmaXggPSBfdGFnJG1hdGNoMlsyXTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaGFuZGxlOiBoYW5kbGUsXG4gICAgICAgICAgICAgIHN1ZmZpeDogc3VmZml4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidmFsdWVSYW5nZUNvbnRhaW5zTmV3bGluZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlUmFuZ2UgfHwgIXRoaXMuY29udGV4dCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIF90aGlzJHZhbHVlUmFuZ2UyID0gdGhpcy52YWx1ZVJhbmdlLFxuICAgICAgICAgIHN0YXJ0ID0gX3RoaXMkdmFsdWVSYW5nZTIuc3RhcnQsXG4gICAgICAgICAgZW5kID0gX3RoaXMkdmFsdWVSYW5nZTIuZW5kO1xuICAgICAgdmFyIHNyYyA9IHRoaXMuY29udGV4dC5zcmM7XG5cbiAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICAgIGlmIChzcmNbaV0gPT09ICdcXG4nKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBOb2RlO1xufSgpO1xuXG52YXIgWUFNTEVycm9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfRXJyb3IpIHtcbiAgX2luaGVyaXRzKFlBTUxFcnJvciwgX0Vycm9yKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFlBTUxFcnJvcik7XG5cbiAgZnVuY3Rpb24gWUFNTEVycm9yKG5hbWUsIHNvdXJjZSwgbWVzc2FnZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBZQU1MRXJyb3IpO1xuXG4gICAgaWYgKCFtZXNzYWdlIHx8ICEoc291cmNlIGluc3RhbmNlb2YgTm9kZSkpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIGZvciBuZXcgXCIuY29uY2F0KG5hbWUpKTtcbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuICAgIF90aGlzLm5hbWUgPSBuYW1lO1xuICAgIF90aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIF90aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoWUFNTEVycm9yLCBbe1xuICAgIGtleTogXCJtYWtlUHJldHR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1ha2VQcmV0dHkoKSB7XG4gICAgICBpZiAoIXRoaXMuc291cmNlKSByZXR1cm47XG4gICAgICB0aGlzLm5vZGVUeXBlID0gdGhpcy5zb3VyY2UudHlwZTtcbiAgICAgIHZhciBjc3QgPSB0aGlzLnNvdXJjZS5jb250ZXh0ICYmIHRoaXMuc291cmNlLmNvbnRleHQucm9vdDtcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9mZnNldCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhpcy5yYW5nZSA9IG5ldyBSYW5nZSh0aGlzLm9mZnNldCwgdGhpcy5vZmZzZXQgKyAxKTtcbiAgICAgICAgdmFyIHN0YXJ0ID0gY3N0ICYmIGdldExpbmVQb3ModGhpcy5vZmZzZXQsIGNzdCk7XG5cbiAgICAgICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgICAgdmFyIGVuZCA9IHtcbiAgICAgICAgICAgIGxpbmU6IHN0YXJ0LmxpbmUsXG4gICAgICAgICAgICBjb2w6IHN0YXJ0LmNvbCArIDFcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMubGluZVBvcyA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgICAgICAgIGVuZDogZW5kXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLm9mZnNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmFuZ2UgPSB0aGlzLnNvdXJjZS5yYW5nZTtcbiAgICAgICAgdGhpcy5saW5lUG9zID0gdGhpcy5zb3VyY2UucmFuZ2VBc0xpbmVQb3M7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmxpbmVQb3MpIHtcbiAgICAgICAgdmFyIF90aGlzJGxpbmVQb3Mkc3RhcnQgPSB0aGlzLmxpbmVQb3Muc3RhcnQsXG4gICAgICAgICAgICBsaW5lID0gX3RoaXMkbGluZVBvcyRzdGFydC5saW5lLFxuICAgICAgICAgICAgY29sID0gX3RoaXMkbGluZVBvcyRzdGFydC5jb2w7XG4gICAgICAgIHRoaXMubWVzc2FnZSArPSBcIiBhdCBsaW5lIFwiLmNvbmNhdChsaW5lLCBcIiwgY29sdW1uIFwiKS5jb25jYXQoY29sKTtcbiAgICAgICAgdmFyIGN0eCA9IGNzdCAmJiBnZXRQcmV0dHlDb250ZXh0KHRoaXMubGluZVBvcywgY3N0KTtcbiAgICAgICAgaWYgKGN0eCkgdGhpcy5tZXNzYWdlICs9IFwiOlxcblxcblwiLmNvbmNhdChjdHgsIFwiXFxuXCIpO1xuICAgICAgfVxuXG4gICAgICBkZWxldGUgdGhpcy5zb3VyY2U7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFlBTUxFcnJvcjtcbn0oIC8qI19fUFVSRV9fKi9fd3JhcE5hdGl2ZVN1cGVyKEVycm9yKSk7XG52YXIgWUFNTFJlZmVyZW5jZUVycm9yID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfWUFNTEVycm9yKSB7XG4gIF9pbmhlcml0cyhZQU1MUmVmZXJlbmNlRXJyb3IsIF9ZQU1MRXJyb3IpO1xuXG4gIHZhciBfc3VwZXIyID0gX2NyZWF0ZVN1cGVyKFlBTUxSZWZlcmVuY2VFcnJvcik7XG5cbiAgZnVuY3Rpb24gWUFNTFJlZmVyZW5jZUVycm9yKHNvdXJjZSwgbWVzc2FnZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBZQU1MUmVmZXJlbmNlRXJyb3IpO1xuXG4gICAgcmV0dXJuIF9zdXBlcjIuY2FsbCh0aGlzLCAnWUFNTFJlZmVyZW5jZUVycm9yJywgc291cmNlLCBtZXNzYWdlKTtcbiAgfVxuXG4gIHJldHVybiBZQU1MUmVmZXJlbmNlRXJyb3I7XG59KFlBTUxFcnJvcik7XG52YXIgWUFNTFNlbWFudGljRXJyb3IgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9ZQU1MRXJyb3IyKSB7XG4gIF9pbmhlcml0cyhZQU1MU2VtYW50aWNFcnJvciwgX1lBTUxFcnJvcjIpO1xuXG4gIHZhciBfc3VwZXIzID0gX2NyZWF0ZVN1cGVyKFlBTUxTZW1hbnRpY0Vycm9yKTtcblxuICBmdW5jdGlvbiBZQU1MU2VtYW50aWNFcnJvcihzb3VyY2UsIG1lc3NhZ2UpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWUFNTFNlbWFudGljRXJyb3IpO1xuXG4gICAgcmV0dXJuIF9zdXBlcjMuY2FsbCh0aGlzLCAnWUFNTFNlbWFudGljRXJyb3InLCBzb3VyY2UsIG1lc3NhZ2UpO1xuICB9XG5cbiAgcmV0dXJuIFlBTUxTZW1hbnRpY0Vycm9yO1xufShZQU1MRXJyb3IpO1xudmFyIFlBTUxTeW50YXhFcnJvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1lBTUxFcnJvcjMpIHtcbiAgX2luaGVyaXRzKFlBTUxTeW50YXhFcnJvciwgX1lBTUxFcnJvcjMpO1xuXG4gIHZhciBfc3VwZXI0ID0gX2NyZWF0ZVN1cGVyKFlBTUxTeW50YXhFcnJvcik7XG5cbiAgZnVuY3Rpb24gWUFNTFN5bnRheEVycm9yKHNvdXJjZSwgbWVzc2FnZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBZQU1MU3ludGF4RXJyb3IpO1xuXG4gICAgcmV0dXJuIF9zdXBlcjQuY2FsbCh0aGlzLCAnWUFNTFN5bnRheEVycm9yJywgc291cmNlLCBtZXNzYWdlKTtcbiAgfVxuXG4gIHJldHVybiBZQU1MU3ludGF4RXJyb3I7XG59KFlBTUxFcnJvcik7XG52YXIgWUFNTFdhcm5pbmcgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9ZQU1MRXJyb3I0KSB7XG4gIF9pbmhlcml0cyhZQU1MV2FybmluZywgX1lBTUxFcnJvcjQpO1xuXG4gIHZhciBfc3VwZXI1ID0gX2NyZWF0ZVN1cGVyKFlBTUxXYXJuaW5nKTtcblxuICBmdW5jdGlvbiBZQU1MV2FybmluZyhzb3VyY2UsIG1lc3NhZ2UpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWUFNTFdhcm5pbmcpO1xuXG4gICAgcmV0dXJuIF9zdXBlcjUuY2FsbCh0aGlzLCAnWUFNTFdhcm5pbmcnLCBzb3VyY2UsIG1lc3NhZ2UpO1xuICB9XG5cbiAgcmV0dXJuIFlBTUxXYXJuaW5nO1xufShZQU1MRXJyb3IpO1xuXG52YXIgUGxhaW5WYWx1ZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX05vZGUpIHtcbiAgX2luaGVyaXRzKFBsYWluVmFsdWUsIF9Ob2RlKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFBsYWluVmFsdWUpO1xuXG4gIGZ1bmN0aW9uIFBsYWluVmFsdWUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYWluVmFsdWUpO1xuXG4gICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBsYWluVmFsdWUsIFt7XG4gICAga2V5OiBcInBhcnNlQmxvY2tWYWx1ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUJsb2NrVmFsdWUoc3RhcnQpIHtcbiAgICAgIHZhciBfdGhpcyRjb250ZXh0ID0gdGhpcy5jb250ZXh0LFxuICAgICAgICAgIGluZGVudCA9IF90aGlzJGNvbnRleHQuaW5kZW50LFxuICAgICAgICAgIGluRmxvdyA9IF90aGlzJGNvbnRleHQuaW5GbG93LFxuICAgICAgICAgIHNyYyA9IF90aGlzJGNvbnRleHQuc3JjO1xuICAgICAgdmFyIG9mZnNldCA9IHN0YXJ0O1xuICAgICAgdmFyIHZhbHVlRW5kID0gc3RhcnQ7XG5cbiAgICAgIGZvciAodmFyIGNoID0gc3JjW29mZnNldF07IGNoID09PSAnXFxuJzsgY2ggPSBzcmNbb2Zmc2V0XSkge1xuICAgICAgICBpZiAoTm9kZS5hdERvY3VtZW50Qm91bmRhcnkoc3JjLCBvZmZzZXQgKyAxKSkgYnJlYWs7XG4gICAgICAgIHZhciBlbmQgPSBOb2RlLmVuZE9mQmxvY2tJbmRlbnQoc3JjLCBpbmRlbnQsIG9mZnNldCArIDEpO1xuICAgICAgICBpZiAoZW5kID09PSBudWxsIHx8IHNyY1tlbmRdID09PSAnIycpIGJyZWFrO1xuXG4gICAgICAgIGlmIChzcmNbZW5kXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICBvZmZzZXQgPSBlbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWVFbmQgPSBQbGFpblZhbHVlLmVuZE9mTGluZShzcmMsIGVuZCwgaW5GbG93KTtcbiAgICAgICAgICBvZmZzZXQgPSB2YWx1ZUVuZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy52YWx1ZVJhbmdlLmlzRW1wdHkoKSkgdGhpcy52YWx1ZVJhbmdlLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICB0aGlzLnZhbHVlUmFuZ2UuZW5kID0gdmFsdWVFbmQ7XG4gICAgICByZXR1cm4gdmFsdWVFbmQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIHBsYWluIHZhbHVlIGZyb20gdGhlIHNvdXJjZVxuICAgICAqXG4gICAgICogQWNjZXB0ZWQgZm9ybXMgYXJlOlxuICAgICAqIGBgYFxuICAgICAqICNjb21tZW50XG4gICAgICpcbiAgICAgKiBmaXJzdCBsaW5lXG4gICAgICpcbiAgICAgKiBmaXJzdCBsaW5lICNjb21tZW50XG4gICAgICpcbiAgICAgKiBmaXJzdCBsaW5lXG4gICAgICogYmxvY2tcbiAgICAgKiBsaW5lc1xuICAgICAqXG4gICAgICogI2NvbW1lbnRcbiAgICAgKiBibG9ja1xuICAgICAqIGxpbmVzXG4gICAgICogYGBgXG4gICAgICogd2hlcmUgYmxvY2sgbGluZXMgYXJlIGVtcHR5IG9yIGhhdmUgYW4gaW5kZW50IGxldmVsIGdyZWF0ZXIgdGhhbiBgaW5kZW50YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UGFyc2VDb250ZXh0fSBjb250ZXh0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBJbmRleCBvZiB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoaXMgc2NhbGFyLCBtYXkgYmUgYFxcbmBcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInBhcnNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlKGNvbnRleHQsIHN0YXJ0KSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdmFyIGluRmxvdyA9IGNvbnRleHQuaW5GbG93LFxuICAgICAgICAgIHNyYyA9IGNvbnRleHQuc3JjO1xuICAgICAgdmFyIG9mZnNldCA9IHN0YXJ0O1xuICAgICAgdmFyIGNoID0gc3JjW29mZnNldF07XG5cbiAgICAgIGlmIChjaCAmJiBjaCAhPT0gJyMnICYmIGNoICE9PSAnXFxuJykge1xuICAgICAgICBvZmZzZXQgPSBQbGFpblZhbHVlLmVuZE9mTGluZShzcmMsIHN0YXJ0LCBpbkZsb3cpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnZhbHVlUmFuZ2UgPSBuZXcgUmFuZ2Uoc3RhcnQsIG9mZnNldCk7XG4gICAgICBvZmZzZXQgPSBOb2RlLmVuZE9mV2hpdGVTcGFjZShzcmMsIG9mZnNldCk7XG4gICAgICBvZmZzZXQgPSB0aGlzLnBhcnNlQ29tbWVudChvZmZzZXQpO1xuXG4gICAgICBpZiAoIXRoaXMuaGFzQ29tbWVudCB8fCB0aGlzLnZhbHVlUmFuZ2UuaXNFbXB0eSgpKSB7XG4gICAgICAgIG9mZnNldCA9IHRoaXMucGFyc2VCbG9ja1ZhbHVlKG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0clZhbHVlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoIXRoaXMudmFsdWVSYW5nZSB8fCAhdGhpcy5jb250ZXh0KSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBfdGhpcyR2YWx1ZVJhbmdlID0gdGhpcy52YWx1ZVJhbmdlLFxuICAgICAgICAgIHN0YXJ0ID0gX3RoaXMkdmFsdWVSYW5nZS5zdGFydCxcbiAgICAgICAgICBlbmQgPSBfdGhpcyR2YWx1ZVJhbmdlLmVuZDtcbiAgICAgIHZhciBzcmMgPSB0aGlzLmNvbnRleHQuc3JjO1xuICAgICAgdmFyIGNoID0gc3JjW2VuZCAtIDFdO1xuXG4gICAgICB3aGlsZSAoc3RhcnQgPCBlbmQgJiYgKGNoID09PSAnXFxuJyB8fCBjaCA9PT0gJ1xcdCcgfHwgY2ggPT09ICcgJykpIHtcbiAgICAgICAgY2ggPSBzcmNbLS1lbmQgLSAxXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0ciA9ICcnO1xuXG4gICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgICB2YXIgX2NoID0gc3JjW2ldO1xuXG4gICAgICAgIGlmIChfY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgdmFyIF9Ob2RlJGZvbGROZXdsaW5lID0gTm9kZS5mb2xkTmV3bGluZShzcmMsIGksIC0xKSxcbiAgICAgICAgICAgICAgZm9sZCA9IF9Ob2RlJGZvbGROZXdsaW5lLmZvbGQsXG4gICAgICAgICAgICAgIG9mZnNldCA9IF9Ob2RlJGZvbGROZXdsaW5lLm9mZnNldDtcblxuICAgICAgICAgIHN0ciArPSBmb2xkO1xuICAgICAgICAgIGkgPSBvZmZzZXQ7XG4gICAgICAgIH0gZWxzZSBpZiAoX2NoID09PSAnICcgfHwgX2NoID09PSAnXFx0Jykge1xuICAgICAgICAgIC8vIHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgIHZhciB3c1N0YXJ0ID0gaTtcbiAgICAgICAgICB2YXIgbmV4dCA9IHNyY1tpICsgMV07XG5cbiAgICAgICAgICB3aGlsZSAoaSA8IGVuZCAmJiAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKSkge1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgbmV4dCA9IHNyY1tpICsgMV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG5leHQgIT09ICdcXG4nKSBzdHIgKz0gaSA+IHdzU3RhcnQgPyBzcmMuc2xpY2Uod3NTdGFydCwgaSArIDEpIDogX2NoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciArPSBfY2g7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGNoMCA9IHNyY1tzdGFydF07XG5cbiAgICAgIHN3aXRjaCAoY2gwKSB7XG4gICAgICAgIGNhc2UgJ1xcdCc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIG1zZyA9ICdQbGFpbiB2YWx1ZSBjYW5ub3Qgc3RhcnQgd2l0aCBhIHRhYiBjaGFyYWN0ZXInO1xuICAgICAgICAgICAgdmFyIGVycm9ycyA9IFtuZXcgWUFNTFNlbWFudGljRXJyb3IodGhpcywgbXNnKV07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBlcnJvcnM6IGVycm9ycyxcbiAgICAgICAgICAgICAgc3RyOiBzdHJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ0AnOlxuICAgICAgICBjYXNlICdgJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgX21zZyA9IFwiUGxhaW4gdmFsdWUgY2Fubm90IHN0YXJ0IHdpdGggcmVzZXJ2ZWQgY2hhcmFjdGVyIFwiLmNvbmNhdChjaDApO1xuXG4gICAgICAgICAgICB2YXIgX2Vycm9ycyA9IFtuZXcgWUFNTFNlbWFudGljRXJyb3IodGhpcywgX21zZyldO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZXJyb3JzOiBfZXJyb3JzLFxuICAgICAgICAgICAgICBzdHI6IHN0clxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgfVxuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImVuZE9mTGluZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmRPZkxpbmUoc3JjLCBzdGFydCwgaW5GbG93KSB7XG4gICAgICB2YXIgY2ggPSBzcmNbc3RhcnRdO1xuICAgICAgdmFyIG9mZnNldCA9IHN0YXJ0O1xuXG4gICAgICB3aGlsZSAoY2ggJiYgY2ggIT09ICdcXG4nKSB7XG4gICAgICAgIGlmIChpbkZsb3cgJiYgKGNoID09PSAnWycgfHwgY2ggPT09ICddJyB8fCBjaCA9PT0gJ3snIHx8IGNoID09PSAnfScgfHwgY2ggPT09ICcsJykpIGJyZWFrO1xuICAgICAgICB2YXIgbmV4dCA9IHNyY1tvZmZzZXQgKyAxXTtcbiAgICAgICAgaWYgKGNoID09PSAnOicgJiYgKCFuZXh0IHx8IG5leHQgPT09ICdcXG4nIHx8IG5leHQgPT09ICdcXHQnIHx8IG5leHQgPT09ICcgJyB8fCBpbkZsb3cgJiYgbmV4dCA9PT0gJywnKSkgYnJlYWs7XG4gICAgICAgIGlmICgoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcpICYmIG5leHQgPT09ICcjJykgYnJlYWs7XG4gICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICBjaCA9IG5leHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBsYWluVmFsdWU7XG59KE5vZGUpO1xuXG5leHBvcnQgeyBDaGFyIGFzIEMsIE5vZGUgYXMgTiwgUGxhaW5WYWx1ZSBhcyBQLCBSYW5nZSBhcyBSLCBUeXBlIGFzIFQsIFlBTUxTeW50YXhFcnJvciBhcyBZLCBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciBhcyBfLCBfdHlwZW9mIGFzIGEsIF9jcmVhdGVDbGFzcyBhcyBiLCBfY2xhc3NDYWxsQ2hlY2sgYXMgYywgZGVmYXVsdFRhZ1ByZWZpeCBhcyBkLCBfZGVmaW5lUHJvcGVydHkgYXMgZSwgWUFNTFdhcm5pbmcgYXMgZiwgWUFNTFNlbWFudGljRXJyb3IgYXMgZywgX3NsaWNlZFRvQXJyYXkgYXMgaCwgWUFNTEVycm9yIGFzIGksIF9pbmhlcml0cyBhcyBqLCBfY3JlYXRlU3VwZXIgYXMgaywgX2dldCBhcyBsLCBfZ2V0UHJvdG90eXBlT2YgYXMgbSwgZGVmYXVsdFRhZ3MgYXMgbiwgWUFNTFJlZmVyZW5jZUVycm9yIGFzIG8sIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgYXMgcCwgX3RvQXJyYXkgYXMgcSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gYXMgciB9O1xuIiwiaW1wb3J0IHsgaiBhcyBfaW5oZXJpdHMsIGsgYXMgX2NyZWF0ZVN1cGVyLCBjIGFzIF9jbGFzc0NhbGxDaGVjaywgVCBhcyBUeXBlLCBiIGFzIF9jcmVhdGVDbGFzcywgUiBhcyBSYW5nZSwgTiBhcyBOb2RlLCBnIGFzIFlBTUxTZW1hbnRpY0Vycm9yLCBsIGFzIF9nZXQsIG0gYXMgX2dldFByb3RvdHlwZU9mLCBZIGFzIFlBTUxTeW50YXhFcnJvciwgQyBhcyBDaGFyLCBlIGFzIF9kZWZpbmVQcm9wZXJ0eSwgUCBhcyBQbGFpblZhbHVlIH0gZnJvbSAnLi9QbGFpblZhbHVlLWZmNTE0N2M2LmpzJztcblxudmFyIEJsYW5rTGluZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX05vZGUpIHtcbiAgX2luaGVyaXRzKEJsYW5rTGluZSwgX05vZGUpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQmxhbmtMaW5lKTtcblxuICBmdW5jdGlvbiBCbGFua0xpbmUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJsYW5rTGluZSk7XG5cbiAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgVHlwZS5CTEFOS19MSU5FKTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKEJsYW5rTGluZSwgW3tcbiAgICBrZXk6IFwicGFyc2VcIixcblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIGJsYW5rIGxpbmUgZnJvbSB0aGUgc291cmNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BhcnNlQ29udGV4dH0gY29udGV4dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIEluZGV4IG9mIGZpcnN0IFxcbiBjaGFyYWN0ZXJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIEluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhpc1xuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZShjb250ZXh0LCBzdGFydCkge1xuICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHRoaXMucmFuZ2UgPSBuZXcgUmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgMSk7XG4gICAgICByZXR1cm4gc3RhcnQgKyAxO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbmNsdWRlc1RyYWlsaW5nTGluZXNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIC8vIFRoaXMgaXMgbmV2ZXIgY2FsbGVkIGZyb20gYW55d2hlcmUsIGJ1dCBpZiBpdCB3ZXJlLFxuICAgICAgLy8gdGhpcyBpcyB0aGUgdmFsdWUgaXQgc2hvdWxkIHJldHVybi5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBCbGFua0xpbmU7XG59KE5vZGUpO1xuXG52YXIgQ29sbGVjdGlvbkl0ZW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhDb2xsZWN0aW9uSXRlbSwgX05vZGUpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQ29sbGVjdGlvbkl0ZW0pO1xuXG4gIGZ1bmN0aW9uIENvbGxlY3Rpb25JdGVtKHR5cGUsIHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbGxlY3Rpb25JdGVtKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgcHJvcHMpO1xuICAgIF90aGlzLm5vZGUgPSBudWxsO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDb2xsZWN0aW9uSXRlbSwgW3tcbiAgICBrZXk6IFwicGFyc2VcIixcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7UGFyc2VDb250ZXh0fSBjb250ZXh0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBJbmRleCBvZiB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoaXNcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2UoY29udGV4dCwgc3RhcnQpIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICB2YXIgcGFyc2VOb2RlID0gY29udGV4dC5wYXJzZU5vZGUsXG4gICAgICAgICAgc3JjID0gY29udGV4dC5zcmM7XG4gICAgICB2YXIgYXRMaW5lU3RhcnQgPSBjb250ZXh0LmF0TGluZVN0YXJ0LFxuICAgICAgICAgIGxpbmVTdGFydCA9IGNvbnRleHQubGluZVN0YXJ0O1xuICAgICAgaWYgKCFhdExpbmVTdGFydCAmJiB0aGlzLnR5cGUgPT09IFR5cGUuU0VRX0lURU0pIHRoaXMuZXJyb3IgPSBuZXcgWUFNTFNlbWFudGljRXJyb3IodGhpcywgJ1NlcXVlbmNlIGl0ZW1zIG11c3Qgbm90IGhhdmUgcHJlY2VkaW5nIGNvbnRlbnQgb24gdGhlIHNhbWUgbGluZScpO1xuICAgICAgdmFyIGluZGVudCA9IGF0TGluZVN0YXJ0ID8gc3RhcnQgLSBsaW5lU3RhcnQgOiBjb250ZXh0LmluZGVudDtcbiAgICAgIHZhciBvZmZzZXQgPSBOb2RlLmVuZE9mV2hpdGVTcGFjZShzcmMsIHN0YXJ0ICsgMSk7XG4gICAgICB2YXIgY2ggPSBzcmNbb2Zmc2V0XTtcbiAgICAgIHZhciBpbmxpbmVDb21tZW50ID0gY2ggPT09ICcjJztcbiAgICAgIHZhciBjb21tZW50cyA9IFtdO1xuICAgICAgdmFyIGJsYW5rTGluZSA9IG51bGw7XG5cbiAgICAgIHdoaWxlIChjaCA9PT0gJ1xcbicgfHwgY2ggPT09ICcjJykge1xuICAgICAgICBpZiAoY2ggPT09ICcjJykge1xuICAgICAgICAgIHZhciBfZW5kID0gTm9kZS5lbmRPZkxpbmUoc3JjLCBvZmZzZXQgKyAxKTtcblxuICAgICAgICAgIGNvbW1lbnRzLnB1c2gobmV3IFJhbmdlKG9mZnNldCwgX2VuZCkpO1xuICAgICAgICAgIG9mZnNldCA9IF9lbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXRMaW5lU3RhcnQgPSB0cnVlO1xuICAgICAgICAgIGxpbmVTdGFydCA9IG9mZnNldCArIDE7XG4gICAgICAgICAgdmFyIHdzRW5kID0gTm9kZS5lbmRPZldoaXRlU3BhY2Uoc3JjLCBsaW5lU3RhcnQpO1xuXG4gICAgICAgICAgaWYgKHNyY1t3c0VuZF0gPT09ICdcXG4nICYmIGNvbW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgYmxhbmtMaW5lID0gbmV3IEJsYW5rTGluZSgpO1xuICAgICAgICAgICAgbGluZVN0YXJ0ID0gYmxhbmtMaW5lLnBhcnNlKHtcbiAgICAgICAgICAgICAgc3JjOiBzcmNcbiAgICAgICAgICAgIH0sIGxpbmVTdGFydCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2Zmc2V0ID0gTm9kZS5lbmRPZkluZGVudChzcmMsIGxpbmVTdGFydCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaCA9IHNyY1tvZmZzZXRdO1xuICAgICAgfVxuXG4gICAgICBpZiAoTm9kZS5uZXh0Tm9kZUlzSW5kZW50ZWQoY2gsIG9mZnNldCAtIChsaW5lU3RhcnQgKyBpbmRlbnQpLCB0aGlzLnR5cGUgIT09IFR5cGUuU0VRX0lURU0pKSB7XG4gICAgICAgIHRoaXMubm9kZSA9IHBhcnNlTm9kZSh7XG4gICAgICAgICAgYXRMaW5lU3RhcnQ6IGF0TGluZVN0YXJ0LFxuICAgICAgICAgIGluQ29sbGVjdGlvbjogZmFsc2UsXG4gICAgICAgICAgaW5kZW50OiBpbmRlbnQsXG4gICAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICAgICAgcGFyZW50OiB0aGlzXG4gICAgICAgIH0sIG9mZnNldCk7XG4gICAgICB9IGVsc2UgaWYgKGNoICYmIGxpbmVTdGFydCA+IHN0YXJ0ICsgMSkge1xuICAgICAgICBvZmZzZXQgPSBsaW5lU3RhcnQgLSAxO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5ub2RlKSB7XG4gICAgICAgIGlmIChibGFua0xpbmUpIHtcbiAgICAgICAgICAvLyBPbmx5IGJsYW5rIGxpbmVzIHByZWNlZGluZyBub24tZW1wdHkgbm9kZXMgYXJlIGNhcHR1cmVkLiBOb3RlIHRoYXRcbiAgICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgY29sbGVjdGlvbiBpdGVtIHJhbmdlIHN0YXJ0IGluZGljZXMgZG8gbm90IGFsd2F5c1xuICAgICAgICAgIC8vIGluY3JlYXNlIG1vbm90b25pY2FsbHkuIC0tIGVlbWVsaS95YW1sIzEyNlxuICAgICAgICAgIHZhciBpdGVtcyA9IGNvbnRleHQucGFyZW50Lml0ZW1zIHx8IGNvbnRleHQucGFyZW50LmNvbnRlbnRzO1xuICAgICAgICAgIGlmIChpdGVtcykgaXRlbXMucHVzaChibGFua0xpbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1lbnRzLmxlbmd0aCkgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5wcm9wcywgY29tbWVudHMpO1xuICAgICAgICBvZmZzZXQgPSB0aGlzLm5vZGUucmFuZ2UuZW5kO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlubGluZUNvbW1lbnQpIHtcbiAgICAgICAgICB2YXIgYyA9IGNvbW1lbnRzWzBdO1xuICAgICAgICAgIHRoaXMucHJvcHMucHVzaChjKTtcbiAgICAgICAgICBvZmZzZXQgPSBjLmVuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQgPSBOb2RlLmVuZE9mTGluZShzcmMsIHN0YXJ0ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGVuZCA9IHRoaXMubm9kZSA/IHRoaXMubm9kZS52YWx1ZVJhbmdlLmVuZCA6IG9mZnNldDtcbiAgICAgIHRoaXMudmFsdWVSYW5nZSA9IG5ldyBSYW5nZShzdGFydCwgZW5kKTtcbiAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldE9yaWdSYW5nZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0T3JpZ1Jhbmdlcyhjciwgb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSBfZ2V0KF9nZXRQcm90b3R5cGVPZihDb2xsZWN0aW9uSXRlbS5wcm90b3R5cGUpLCBcInNldE9yaWdSYW5nZXNcIiwgdGhpcykuY2FsbCh0aGlzLCBjciwgb2Zmc2V0KTtcbiAgICAgIHJldHVybiB0aGlzLm5vZGUgPyB0aGlzLm5vZGUuc2V0T3JpZ1Jhbmdlcyhjciwgb2Zmc2V0KSA6IG9mZnNldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgc3JjID0gdGhpcy5jb250ZXh0LnNyYyxcbiAgICAgICAgICBub2RlID0gdGhpcy5ub2RlLFxuICAgICAgICAgIHJhbmdlID0gdGhpcy5yYW5nZSxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCkgcmV0dXJuIHZhbHVlO1xuICAgICAgdmFyIHN0ciA9IG5vZGUgPyBzcmMuc2xpY2UocmFuZ2Uuc3RhcnQsIG5vZGUucmFuZ2Uuc3RhcnQpICsgU3RyaW5nKG5vZGUpIDogc3JjLnNsaWNlKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuICAgICAgcmV0dXJuIE5vZGUuYWRkU3RyaW5nVGVybWluYXRvcihzcmMsIHJhbmdlLmVuZCwgc3RyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5jbHVkZXNUcmFpbGluZ0xpbmVzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gISF0aGlzLm5vZGUgJiYgdGhpcy5ub2RlLmluY2x1ZGVzVHJhaWxpbmdMaW5lcztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29sbGVjdGlvbkl0ZW07XG59KE5vZGUpO1xuXG52YXIgQ29tbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX05vZGUpIHtcbiAgX2luaGVyaXRzKENvbW1lbnQsIF9Ob2RlKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKENvbW1lbnQpO1xuXG4gIGZ1bmN0aW9uIENvbW1lbnQoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbW1lbnQpO1xuXG4gICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIFR5cGUuQ09NTUVOVCk7XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlcyBhIGNvbW1lbnQgbGluZSBmcm9tIHRoZSBzb3VyY2VcbiAgICpcbiAgICogQHBhcmFtIHtQYXJzZUNvbnRleHR9IGNvbnRleHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gSW5kZXggb2YgdGhlIGNoYXJhY3RlciBhZnRlciB0aGlzIHNjYWxhclxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhDb21tZW50LCBbe1xuICAgIGtleTogXCJwYXJzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZShjb250ZXh0LCBzdGFydCkge1xuICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnBhcnNlQ29tbWVudChzdGFydCk7XG4gICAgICB0aGlzLnJhbmdlID0gbmV3IFJhbmdlKHN0YXJ0LCBvZmZzZXQpO1xuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29tbWVudDtcbn0oTm9kZSk7XG5cbmZ1bmN0aW9uIGdyYWJDb2xsZWN0aW9uRW5kQ29tbWVudHMobm9kZSkge1xuICB2YXIgY25vZGUgPSBub2RlO1xuXG4gIHdoaWxlIChjbm9kZSBpbnN0YW5jZW9mIENvbGxlY3Rpb25JdGVtKSB7XG4gICAgY25vZGUgPSBjbm9kZS5ub2RlO1xuICB9XG5cbiAgaWYgKCEoY25vZGUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSkgcmV0dXJuIG51bGw7XG4gIHZhciBsZW4gPSBjbm9kZS5pdGVtcy5sZW5ndGg7XG4gIHZhciBjaSA9IC0xO1xuXG4gIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgIHZhciBuID0gY25vZGUuaXRlbXNbaV07XG5cbiAgICBpZiAobi50eXBlID09PSBUeXBlLkNPTU1FTlQpIHtcbiAgICAgIC8vIEtlZXAgc3VmZmljaWVudGx5IGluZGVudGVkIGNvbW1lbnRzIHdpdGggcHJlY2VkaW5nIG5vZGVcbiAgICAgIHZhciBfbiRjb250ZXh0ID0gbi5jb250ZXh0LFxuICAgICAgICAgIGluZGVudCA9IF9uJGNvbnRleHQuaW5kZW50LFxuICAgICAgICAgIGxpbmVTdGFydCA9IF9uJGNvbnRleHQubGluZVN0YXJ0O1xuICAgICAgaWYgKGluZGVudCA+IDAgJiYgbi5yYW5nZS5zdGFydCA+PSBsaW5lU3RhcnQgKyBpbmRlbnQpIGJyZWFrO1xuICAgICAgY2kgPSBpO1xuICAgIH0gZWxzZSBpZiAobi50eXBlID09PSBUeXBlLkJMQU5LX0xJTkUpIGNpID0gaTtlbHNlIGJyZWFrO1xuICB9XG5cbiAgaWYgKGNpID09PSAtMSkgcmV0dXJuIG51bGw7XG4gIHZhciBjYSA9IGNub2RlLml0ZW1zLnNwbGljZShjaSwgbGVuIC0gY2kpO1xuICB2YXIgcHJldkVuZCA9IGNhWzBdLnJhbmdlLnN0YXJ0O1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY25vZGUucmFuZ2UuZW5kID0gcHJldkVuZDtcbiAgICBpZiAoY25vZGUudmFsdWVSYW5nZSAmJiBjbm9kZS52YWx1ZVJhbmdlLmVuZCA+IHByZXZFbmQpIGNub2RlLnZhbHVlUmFuZ2UuZW5kID0gcHJldkVuZDtcbiAgICBpZiAoY25vZGUgPT09IG5vZGUpIGJyZWFrO1xuICAgIGNub2RlID0gY25vZGUuY29udGV4dC5wYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gY2E7XG59XG52YXIgQ29sbGVjdGlvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX05vZGUpIHtcbiAgX2luaGVyaXRzKENvbGxlY3Rpb24sIF9Ob2RlKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKENvbGxlY3Rpb24pO1xuXG4gIF9jcmVhdGVDbGFzcyhDb2xsZWN0aW9uLCBudWxsLCBbe1xuICAgIGtleTogXCJuZXh0Q29udGVudEhhc0luZGVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuZXh0Q29udGVudEhhc0luZGVudChzcmMsIG9mZnNldCwgaW5kZW50KSB7XG4gICAgICB2YXIgbGluZVN0YXJ0ID0gTm9kZS5lbmRPZkxpbmUoc3JjLCBvZmZzZXQpICsgMTtcbiAgICAgIG9mZnNldCA9IE5vZGUuZW5kT2ZXaGl0ZVNwYWNlKHNyYywgbGluZVN0YXJ0KTtcbiAgICAgIHZhciBjaCA9IHNyY1tvZmZzZXRdO1xuICAgICAgaWYgKCFjaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKG9mZnNldCA+PSBsaW5lU3RhcnQgKyBpbmRlbnQpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKGNoICE9PSAnIycgJiYgY2ggIT09ICdcXG4nKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gQ29sbGVjdGlvbi5uZXh0Q29udGVudEhhc0luZGVudChzcmMsIG9mZnNldCwgaW5kZW50KTtcbiAgICB9XG4gIH1dKTtcblxuICBmdW5jdGlvbiBDb2xsZWN0aW9uKGZpcnN0SXRlbSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb2xsZWN0aW9uKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgZmlyc3RJdGVtLnR5cGUgPT09IFR5cGUuU0VRX0lURU0gPyBUeXBlLlNFUSA6IFR5cGUuTUFQKTtcblxuICAgIGZvciAodmFyIGkgPSBmaXJzdEl0ZW0ucHJvcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIGlmIChmaXJzdEl0ZW0ucHJvcHNbaV0uc3RhcnQgPCBmaXJzdEl0ZW0uY29udGV4dC5saW5lU3RhcnQpIHtcbiAgICAgICAgLy8gcHJvcHMgb24gcHJldmlvdXMgbGluZSBhcmUgYXNzdW1lZCBieSB0aGUgY29sbGVjdGlvblxuICAgICAgICBfdGhpcy5wcm9wcyA9IGZpcnN0SXRlbS5wcm9wcy5zbGljZSgwLCBpICsgMSk7XG4gICAgICAgIGZpcnN0SXRlbS5wcm9wcyA9IGZpcnN0SXRlbS5wcm9wcy5zbGljZShpICsgMSk7XG4gICAgICAgIHZhciBpdGVtUmFuZ2UgPSBmaXJzdEl0ZW0ucHJvcHNbMF0gfHwgZmlyc3RJdGVtLnZhbHVlUmFuZ2U7XG4gICAgICAgIGZpcnN0SXRlbS5yYW5nZS5zdGFydCA9IGl0ZW1SYW5nZS5zdGFydDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3RoaXMuaXRlbXMgPSBbZmlyc3RJdGVtXTtcbiAgICB2YXIgZWMgPSBncmFiQ29sbGVjdGlvbkVuZENvbW1lbnRzKGZpcnN0SXRlbSk7XG4gICAgaWYgKGVjKSBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShfdGhpcy5pdGVtcywgZWMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDb2xsZWN0aW9uLCBbe1xuICAgIGtleTogXCJwYXJzZVwiLFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtQYXJzZUNvbnRleHR9IGNvbnRleHRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIEluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhpc1xuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZShjb250ZXh0LCBzdGFydCkge1xuICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHZhciBwYXJzZU5vZGUgPSBjb250ZXh0LnBhcnNlTm9kZSxcbiAgICAgICAgICBzcmMgPSBjb250ZXh0LnNyYzsgLy8gSXQncyBlYXNpZXIgdG8gcmVjYWxjdWxhdGUgbGluZVN0YXJ0IGhlcmUgcmF0aGVyIHRoYW4gdHJhY2tpbmcgZG93biB0aGVcbiAgICAgIC8vIGxhc3QgY29udGV4dCBmcm9tIHdoaWNoIHRvIHJlYWQgaXQgLS0gZWVtZWxpL3lhbWwjMlxuXG4gICAgICB2YXIgbGluZVN0YXJ0ID0gTm9kZS5zdGFydE9mTGluZShzcmMsIHN0YXJ0KTtcbiAgICAgIHZhciBmaXJzdEl0ZW0gPSB0aGlzLml0ZW1zWzBdOyAvLyBGaXJzdC1pdGVtIGNvbnRleHQgbmVlZHMgdG8gYmUgY29ycmVjdCBmb3IgbGF0ZXIgY29tbWVudCBoYW5kbGluZ1xuICAgICAgLy8gLS0gZWVtZWxpL3lhbWwjMTdcblxuICAgICAgZmlyc3RJdGVtLmNvbnRleHQucGFyZW50ID0gdGhpcztcbiAgICAgIHRoaXMudmFsdWVSYW5nZSA9IFJhbmdlLmNvcHkoZmlyc3RJdGVtLnZhbHVlUmFuZ2UpO1xuICAgICAgdmFyIGluZGVudCA9IGZpcnN0SXRlbS5yYW5nZS5zdGFydCAtIGZpcnN0SXRlbS5jb250ZXh0LmxpbmVTdGFydDtcbiAgICAgIHZhciBvZmZzZXQgPSBzdGFydDtcbiAgICAgIG9mZnNldCA9IE5vZGUubm9ybWFsaXplT2Zmc2V0KHNyYywgb2Zmc2V0KTtcbiAgICAgIHZhciBjaCA9IHNyY1tvZmZzZXRdO1xuICAgICAgdmFyIGF0TGluZVN0YXJ0ID0gTm9kZS5lbmRPZldoaXRlU3BhY2Uoc3JjLCBsaW5lU3RhcnQpID09PSBvZmZzZXQ7XG4gICAgICB2YXIgcHJldkluY2x1ZGVzVHJhaWxpbmdMaW5lcyA9IGZhbHNlO1xuXG4gICAgICB3aGlsZSAoY2gpIHtcbiAgICAgICAgd2hpbGUgKGNoID09PSAnXFxuJyB8fCBjaCA9PT0gJyMnKSB7XG4gICAgICAgICAgaWYgKGF0TGluZVN0YXJ0ICYmIGNoID09PSAnXFxuJyAmJiAhcHJldkluY2x1ZGVzVHJhaWxpbmdMaW5lcykge1xuICAgICAgICAgICAgdmFyIGJsYW5rTGluZSA9IG5ldyBCbGFua0xpbmUoKTtcbiAgICAgICAgICAgIG9mZnNldCA9IGJsYW5rTGluZS5wYXJzZSh7XG4gICAgICAgICAgICAgIHNyYzogc3JjXG4gICAgICAgICAgICB9LCBvZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZVJhbmdlLmVuZCA9IG9mZnNldDtcblxuICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBzcmMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNoID0gbnVsbDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChibGFua0xpbmUpO1xuICAgICAgICAgICAgb2Zmc2V0IC09IDE7IC8vIGJsYW5rTGluZS5wYXJzZSgpIGNvbnN1bWVzIHRlcm1pbmFsIG5ld2xpbmVcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnIycpIHtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCBsaW5lU3RhcnQgKyBpbmRlbnQgJiYgIUNvbGxlY3Rpb24ubmV4dENvbnRlbnRIYXNJbmRlbnQoc3JjLCBvZmZzZXQsIGluZGVudCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQ29tbWVudCgpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gY29tbWVudC5wYXJzZSh7XG4gICAgICAgICAgICAgIGluZGVudDogaW5kZW50LFxuICAgICAgICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgICAgICAgICAgc3JjOiBzcmNcbiAgICAgICAgICAgIH0sIG9mZnNldCk7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goY29tbWVudCk7XG4gICAgICAgICAgICB0aGlzLnZhbHVlUmFuZ2UuZW5kID0gb2Zmc2V0O1xuXG4gICAgICAgICAgICBpZiAob2Zmc2V0ID49IHNyYy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY2ggPSBudWxsO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaW5lU3RhcnQgPSBvZmZzZXQgKyAxO1xuICAgICAgICAgIG9mZnNldCA9IE5vZGUuZW5kT2ZJbmRlbnQoc3JjLCBsaW5lU3RhcnQpO1xuXG4gICAgICAgICAgaWYgKE5vZGUuYXRCbGFuayhzcmMsIG9mZnNldCkpIHtcbiAgICAgICAgICAgIHZhciB3c0VuZCA9IE5vZGUuZW5kT2ZXaGl0ZVNwYWNlKHNyYywgb2Zmc2V0KTtcbiAgICAgICAgICAgIHZhciBuZXh0ID0gc3JjW3dzRW5kXTtcblxuICAgICAgICAgICAgaWYgKCFuZXh0IHx8IG5leHQgPT09ICdcXG4nIHx8IG5leHQgPT09ICcjJykge1xuICAgICAgICAgICAgICBvZmZzZXQgPSB3c0VuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaCA9IHNyY1tvZmZzZXRdO1xuICAgICAgICAgIGF0TGluZVN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2gpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvZmZzZXQgIT09IGxpbmVTdGFydCArIGluZGVudCAmJiAoYXRMaW5lU3RhcnQgfHwgY2ggIT09ICc6JykpIHtcbiAgICAgICAgICBpZiAob2Zmc2V0IDwgbGluZVN0YXJ0ICsgaW5kZW50KSB7XG4gICAgICAgICAgICBpZiAobGluZVN0YXJ0ID4gc3RhcnQpIG9mZnNldCA9IGxpbmVTdGFydDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZXJyb3IpIHtcbiAgICAgICAgICAgIHZhciBtc2cgPSAnQWxsIGNvbGxlY3Rpb24gaXRlbXMgbXVzdCBzdGFydCBhdCB0aGUgc2FtZSBjb2x1bW4nO1xuICAgICAgICAgICAgdGhpcy5lcnJvciA9IG5ldyBZQU1MU3ludGF4RXJyb3IodGhpcywgbXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlyc3RJdGVtLnR5cGUgPT09IFR5cGUuU0VRX0lURU0pIHtcbiAgICAgICAgICBpZiAoY2ggIT09ICctJykge1xuICAgICAgICAgICAgaWYgKGxpbmVTdGFydCA+IHN0YXJ0KSBvZmZzZXQgPSBsaW5lU3RhcnQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICctJyAmJiAhdGhpcy5lcnJvcikge1xuICAgICAgICAgIC8vIG1hcCBrZXkgbWF5IHN0YXJ0IHdpdGggLSwgYXMgbG9uZyBhcyBpdCdzIGZvbGxvd2VkIGJ5IGEgbm9uLXdoaXRlc3BhY2UgY2hhclxuICAgICAgICAgIHZhciBfbmV4dCA9IHNyY1tvZmZzZXQgKyAxXTtcblxuICAgICAgICAgIGlmICghX25leHQgfHwgX25leHQgPT09ICdcXG4nIHx8IF9uZXh0ID09PSAnXFx0JyB8fCBfbmV4dCA9PT0gJyAnKSB7XG4gICAgICAgICAgICB2YXIgX21zZyA9ICdBIGNvbGxlY3Rpb24gY2Fubm90IGJlIGJvdGggYSBtYXBwaW5nIGFuZCBhIHNlcXVlbmNlJztcbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBuZXcgWUFNTFN5bnRheEVycm9yKHRoaXMsIF9tc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub2RlID0gcGFyc2VOb2RlKHtcbiAgICAgICAgICBhdExpbmVTdGFydDogYXRMaW5lU3RhcnQsXG4gICAgICAgICAgaW5Db2xsZWN0aW9uOiB0cnVlLFxuICAgICAgICAgIGluZGVudDogaW5kZW50LFxuICAgICAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgICAgIHBhcmVudDogdGhpc1xuICAgICAgICB9LCBvZmZzZXQpO1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBvZmZzZXQ7IC8vIGF0IG5leHQgZG9jdW1lbnQgc3RhcnRcblxuICAgICAgICB0aGlzLml0ZW1zLnB1c2gobm9kZSk7XG4gICAgICAgIHRoaXMudmFsdWVSYW5nZS5lbmQgPSBub2RlLnZhbHVlUmFuZ2UuZW5kO1xuICAgICAgICBvZmZzZXQgPSBOb2RlLm5vcm1hbGl6ZU9mZnNldChzcmMsIG5vZGUucmFuZ2UuZW5kKTtcbiAgICAgICAgY2ggPSBzcmNbb2Zmc2V0XTtcbiAgICAgICAgYXRMaW5lU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgcHJldkluY2x1ZGVzVHJhaWxpbmdMaW5lcyA9IG5vZGUuaW5jbHVkZXNUcmFpbGluZ0xpbmVzOyAvLyBOZWVkIHRvIHJlc2V0IGxpbmVTdGFydCBhbmQgYXRMaW5lU3RhcnQgaGVyZSBpZiBwcmVjZWRpbmcgbm9kZSdzIHJhbmdlXG4gICAgICAgIC8vIGhhcyBhZHZhbmNlZCB0byBjaGVjayB0aGUgY3VycmVudCBsaW5lJ3MgaW5kZW50YXRpb24gbGV2ZWxcbiAgICAgICAgLy8gLS0gZWVtZWxpL3lhbWwjMTAgJiBlZW1lbGkveWFtbCMzOFxuXG4gICAgICAgIGlmIChjaCkge1xuICAgICAgICAgIHZhciBscyA9IG9mZnNldCAtIDE7XG4gICAgICAgICAgdmFyIHByZXYgPSBzcmNbbHNdO1xuXG4gICAgICAgICAgd2hpbGUgKHByZXYgPT09ICcgJyB8fCBwcmV2ID09PSAnXFx0Jykge1xuICAgICAgICAgICAgcHJldiA9IHNyY1stLWxzXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJldiA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGxpbmVTdGFydCA9IGxzICsgMTtcbiAgICAgICAgICAgIGF0TGluZVN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZWMgPSBncmFiQ29sbGVjdGlvbkVuZENvbW1lbnRzKG5vZGUpO1xuICAgICAgICBpZiAoZWMpIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuaXRlbXMsIGVjKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0T3JpZ1Jhbmdlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRPcmlnUmFuZ2VzKGNyLCBvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IF9nZXQoX2dldFByb3RvdHlwZU9mKENvbGxlY3Rpb24ucHJvdG90eXBlKSwgXCJzZXRPcmlnUmFuZ2VzXCIsIHRoaXMpLmNhbGwodGhpcywgY3IsIG9mZnNldCk7XG4gICAgICB0aGlzLml0ZW1zLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgb2Zmc2V0ID0gbm9kZS5zZXRPcmlnUmFuZ2VzKGNyLCBvZmZzZXQpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgIHZhciBzcmMgPSB0aGlzLmNvbnRleHQuc3JjLFxuICAgICAgICAgIGl0ZW1zID0gdGhpcy5pdGVtcyxcbiAgICAgICAgICByYW5nZSA9IHRoaXMucmFuZ2UsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHJldHVybiB2YWx1ZTtcbiAgICAgIHZhciBzdHIgPSBzcmMuc2xpY2UocmFuZ2Uuc3RhcnQsIGl0ZW1zWzBdLnJhbmdlLnN0YXJ0KSArIFN0cmluZyhpdGVtc1swXSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgdmFyIF9pdGVtJGNvbnRleHQgPSBpdGVtLmNvbnRleHQsXG4gICAgICAgICAgICBhdExpbmVTdGFydCA9IF9pdGVtJGNvbnRleHQuYXRMaW5lU3RhcnQsXG4gICAgICAgICAgICBpbmRlbnQgPSBfaXRlbSRjb250ZXh0LmluZGVudDtcbiAgICAgICAgaWYgKGF0TGluZVN0YXJ0KSBmb3IgKHZhciBfaSA9IDA7IF9pIDwgaW5kZW50OyArK19pKSB7XG4gICAgICAgICAgc3RyICs9ICcgJztcbiAgICAgICAgfVxuICAgICAgICBzdHIgKz0gU3RyaW5nKGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTm9kZS5hZGRTdHJpbmdUZXJtaW5hdG9yKHNyYywgcmFuZ2UuZW5kLCBzdHIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbmNsdWRlc1RyYWlsaW5nTGluZXNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLml0ZW1zLmxlbmd0aCA+IDA7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvbGxlY3Rpb247XG59KE5vZGUpO1xuXG52YXIgRGlyZWN0aXZlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTm9kZSkge1xuICBfaW5oZXJpdHMoRGlyZWN0aXZlLCBfTm9kZSk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihEaXJlY3RpdmUpO1xuXG4gIGZ1bmN0aW9uIERpcmVjdGl2ZSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGlyZWN0aXZlKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgVHlwZS5ESVJFQ1RJVkUpO1xuICAgIF90aGlzLm5hbWUgPSBudWxsO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhEaXJlY3RpdmUsIFt7XG4gICAga2V5OiBcInBhcnNlTmFtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZU5hbWUoc3RhcnQpIHtcbiAgICAgIHZhciBzcmMgPSB0aGlzLmNvbnRleHQuc3JjO1xuICAgICAgdmFyIG9mZnNldCA9IHN0YXJ0O1xuICAgICAgdmFyIGNoID0gc3JjW29mZnNldF07XG5cbiAgICAgIHdoaWxlIChjaCAmJiBjaCAhPT0gJ1xcbicgJiYgY2ggIT09ICdcXHQnICYmIGNoICE9PSAnICcpIHtcbiAgICAgICAgY2ggPSBzcmNbb2Zmc2V0ICs9IDFdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5hbWUgPSBzcmMuc2xpY2Uoc3RhcnQsIG9mZnNldCk7XG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXJzZVBhcmFtZXRlcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VQYXJhbWV0ZXJzKHN0YXJ0KSB7XG4gICAgICB2YXIgc3JjID0gdGhpcy5jb250ZXh0LnNyYztcbiAgICAgIHZhciBvZmZzZXQgPSBzdGFydDtcbiAgICAgIHZhciBjaCA9IHNyY1tvZmZzZXRdO1xuXG4gICAgICB3aGlsZSAoY2ggJiYgY2ggIT09ICdcXG4nICYmIGNoICE9PSAnIycpIHtcbiAgICAgICAgY2ggPSBzcmNbb2Zmc2V0ICs9IDFdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnZhbHVlUmFuZ2UgPSBuZXcgUmFuZ2Uoc3RhcnQsIG9mZnNldCk7XG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXJzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZShjb250ZXh0LCBzdGFydCkge1xuICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHZhciBvZmZzZXQgPSB0aGlzLnBhcnNlTmFtZShzdGFydCArIDEpO1xuICAgICAgb2Zmc2V0ID0gdGhpcy5wYXJzZVBhcmFtZXRlcnMob2Zmc2V0KTtcbiAgICAgIG9mZnNldCA9IHRoaXMucGFyc2VDb21tZW50KG9mZnNldCk7XG4gICAgICB0aGlzLnJhbmdlID0gbmV3IFJhbmdlKHN0YXJ0LCBvZmZzZXQpO1xuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFyYW1ldGVyc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdmFyIHJhdyA9IHRoaXMucmF3VmFsdWU7XG4gICAgICByZXR1cm4gcmF3ID8gcmF3LnRyaW0oKS5zcGxpdCgvWyBcXHRdKy8pIDogW107XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERpcmVjdGl2ZTtcbn0oTm9kZSk7XG5cbnZhciBEb2N1bWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX05vZGUpIHtcbiAgX2luaGVyaXRzKERvY3VtZW50LCBfTm9kZSk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihEb2N1bWVudCk7XG5cbiAgX2NyZWF0ZUNsYXNzKERvY3VtZW50LCBudWxsLCBbe1xuICAgIGtleTogXCJzdGFydENvbW1lbnRPckVuZEJsYW5rTGluZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydENvbW1lbnRPckVuZEJsYW5rTGluZShzcmMsIHN0YXJ0KSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gTm9kZS5lbmRPZldoaXRlU3BhY2Uoc3JjLCBzdGFydCk7XG4gICAgICB2YXIgY2ggPSBzcmNbb2Zmc2V0XTtcbiAgICAgIHJldHVybiBjaCA9PT0gJyMnIHx8IGNoID09PSAnXFxuJyA/IG9mZnNldCA6IHN0YXJ0O1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIERvY3VtZW50KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBEb2N1bWVudCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIFR5cGUuRE9DVU1FTlQpO1xuICAgIF90aGlzLmRpcmVjdGl2ZXMgPSBudWxsO1xuICAgIF90aGlzLmNvbnRlbnRzID0gbnVsbDtcbiAgICBfdGhpcy5kaXJlY3RpdmVzRW5kTWFya2VyID0gbnVsbDtcbiAgICBfdGhpcy5kb2N1bWVudEVuZE1hcmtlciA9IG51bGw7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKERvY3VtZW50LCBbe1xuICAgIGtleTogXCJwYXJzZURpcmVjdGl2ZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VEaXJlY3RpdmVzKHN0YXJ0KSB7XG4gICAgICB2YXIgc3JjID0gdGhpcy5jb250ZXh0LnNyYztcbiAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IFtdO1xuICAgICAgdmFyIGF0TGluZVN0YXJ0ID0gdHJ1ZTtcbiAgICAgIHZhciBoYXNEaXJlY3RpdmVzID0gZmFsc2U7XG4gICAgICB2YXIgb2Zmc2V0ID0gc3RhcnQ7XG5cbiAgICAgIHdoaWxlICghTm9kZS5hdERvY3VtZW50Qm91bmRhcnkoc3JjLCBvZmZzZXQsIENoYXIuRElSRUNUSVZFU19FTkQpKSB7XG4gICAgICAgIG9mZnNldCA9IERvY3VtZW50LnN0YXJ0Q29tbWVudE9yRW5kQmxhbmtMaW5lKHNyYywgb2Zmc2V0KTtcblxuICAgICAgICBzd2l0Y2ggKHNyY1tvZmZzZXRdKSB7XG4gICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgIGlmIChhdExpbmVTdGFydCkge1xuICAgICAgICAgICAgICB2YXIgYmxhbmtMaW5lID0gbmV3IEJsYW5rTGluZSgpO1xuICAgICAgICAgICAgICBvZmZzZXQgPSBibGFua0xpbmUucGFyc2Uoe1xuICAgICAgICAgICAgICAgIHNyYzogc3JjXG4gICAgICAgICAgICAgIH0sIG9mZnNldCk7XG5cbiAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IHNyYy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMucHVzaChibGFua0xpbmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgYXRMaW5lU3RhcnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgY29tbWVudCA9IG5ldyBDb21tZW50KCk7XG4gICAgICAgICAgICAgIG9mZnNldCA9IGNvbW1lbnQucGFyc2Uoe1xuICAgICAgICAgICAgICAgIHNyYzogc3JjXG4gICAgICAgICAgICAgIH0sIG9mZnNldCk7XG4gICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgICBhdExpbmVTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICclJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGRpcmVjdGl2ZSA9IG5ldyBEaXJlY3RpdmUoKTtcbiAgICAgICAgICAgICAgb2Zmc2V0ID0gZGlyZWN0aXZlLnBhcnNlKHtcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICAgICAgICAgICAgc3JjOiBzcmNcbiAgICAgICAgICAgICAgfSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLnB1c2goZGlyZWN0aXZlKTtcbiAgICAgICAgICAgICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7XG4gICAgICAgICAgICAgIGF0TGluZVN0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoaGFzRGlyZWN0aXZlcykge1xuICAgICAgICAgICAgICB0aGlzLmVycm9yID0gbmV3IFlBTUxTZW1hbnRpY0Vycm9yKHRoaXMsICdNaXNzaW5nIGRpcmVjdGl2ZXMtZW5kIGluZGljYXRvciBsaW5lJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGlyZWN0aXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudHMgPSB0aGlzLmRpcmVjdGl2ZXM7XG4gICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzcmNbb2Zmc2V0XSkge1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXNFbmRNYXJrZXIgPSBuZXcgUmFuZ2Uob2Zmc2V0LCBvZmZzZXQgKyAzKTtcbiAgICAgICAgcmV0dXJuIG9mZnNldCArIDM7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNEaXJlY3RpdmVzKSB7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBuZXcgWUFNTFNlbWFudGljRXJyb3IodGhpcywgJ01pc3NpbmcgZGlyZWN0aXZlcy1lbmQgaW5kaWNhdG9yIGxpbmUnKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXJlY3RpdmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5jb250ZW50cyA9IHRoaXMuZGlyZWN0aXZlcztcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhcnNlQ29udGVudHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VDb250ZW50cyhzdGFydCkge1xuICAgICAgdmFyIF90aGlzJGNvbnRleHQgPSB0aGlzLmNvbnRleHQsXG4gICAgICAgICAgcGFyc2VOb2RlID0gX3RoaXMkY29udGV4dC5wYXJzZU5vZGUsXG4gICAgICAgICAgc3JjID0gX3RoaXMkY29udGV4dC5zcmM7XG4gICAgICBpZiAoIXRoaXMuY29udGVudHMpIHRoaXMuY29udGVudHMgPSBbXTtcbiAgICAgIHZhciBsaW5lU3RhcnQgPSBzdGFydDtcblxuICAgICAgd2hpbGUgKHNyY1tsaW5lU3RhcnQgLSAxXSA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVTdGFydCAtPSAxO1xuICAgICAgfVxuXG4gICAgICB2YXIgb2Zmc2V0ID0gTm9kZS5lbmRPZldoaXRlU3BhY2Uoc3JjLCBzdGFydCk7XG4gICAgICB2YXIgYXRMaW5lU3RhcnQgPSBsaW5lU3RhcnQgPT09IHN0YXJ0O1xuICAgICAgdGhpcy52YWx1ZVJhbmdlID0gbmV3IFJhbmdlKG9mZnNldCk7XG5cbiAgICAgIHdoaWxlICghTm9kZS5hdERvY3VtZW50Qm91bmRhcnkoc3JjLCBvZmZzZXQsIENoYXIuRE9DVU1FTlRfRU5EKSkge1xuICAgICAgICBzd2l0Y2ggKHNyY1tvZmZzZXRdKSB7XG4gICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgIGlmIChhdExpbmVTdGFydCkge1xuICAgICAgICAgICAgICB2YXIgYmxhbmtMaW5lID0gbmV3IEJsYW5rTGluZSgpO1xuICAgICAgICAgICAgICBvZmZzZXQgPSBibGFua0xpbmUucGFyc2Uoe1xuICAgICAgICAgICAgICAgIHNyYzogc3JjXG4gICAgICAgICAgICAgIH0sIG9mZnNldCk7XG5cbiAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IHNyYy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRzLnB1c2goYmxhbmtMaW5lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgIGF0TGluZVN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGluZVN0YXJ0ID0gb2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICcjJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQ29tbWVudCgpO1xuICAgICAgICAgICAgICBvZmZzZXQgPSBjb21tZW50LnBhcnNlKHtcbiAgICAgICAgICAgICAgICBzcmM6IHNyY1xuICAgICAgICAgICAgICB9LCBvZmZzZXQpO1xuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRzLnB1c2goY29tbWVudCk7XG4gICAgICAgICAgICAgIGF0TGluZVN0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBpRW5kID0gTm9kZS5lbmRPZkluZGVudChzcmMsIG9mZnNldCk7XG4gICAgICAgICAgICAgIHZhciBjb250ZXh0ID0ge1xuICAgICAgICAgICAgICAgIGF0TGluZVN0YXJ0OiBhdExpbmVTdGFydCxcbiAgICAgICAgICAgICAgICBpbmRlbnQ6IC0xLFxuICAgICAgICAgICAgICAgIGluRmxvdzogZmFsc2UsXG4gICAgICAgICAgICAgICAgaW5Db2xsZWN0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXNcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgdmFyIG5vZGUgPSBwYXJzZU5vZGUoY29udGV4dCwgaUVuZCk7XG4gICAgICAgICAgICAgIGlmICghbm9kZSkgcmV0dXJuIHRoaXMudmFsdWVSYW5nZS5lbmQgPSBpRW5kOyAvLyBhdCBuZXh0IGRvY3VtZW50IHN0YXJ0XG5cbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50cy5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICBvZmZzZXQgPSBub2RlLnJhbmdlLmVuZDtcbiAgICAgICAgICAgICAgYXRMaW5lU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdmFyIGVjID0gZ3JhYkNvbGxlY3Rpb25FbmRDb21tZW50cyhub2RlKTtcbiAgICAgICAgICAgICAgaWYgKGVjKSBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLmNvbnRlbnRzLCBlYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvZmZzZXQgPSBEb2N1bWVudC5zdGFydENvbW1lbnRPckVuZEJsYW5rTGluZShzcmMsIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudmFsdWVSYW5nZS5lbmQgPSBvZmZzZXQ7XG5cbiAgICAgIGlmIChzcmNbb2Zmc2V0XSkge1xuICAgICAgICB0aGlzLmRvY3VtZW50RW5kTWFya2VyID0gbmV3IFJhbmdlKG9mZnNldCwgb2Zmc2V0ICsgMyk7XG4gICAgICAgIG9mZnNldCArPSAzO1xuXG4gICAgICAgIGlmIChzcmNbb2Zmc2V0XSkge1xuICAgICAgICAgIG9mZnNldCA9IE5vZGUuZW5kT2ZXaGl0ZVNwYWNlKHNyYywgb2Zmc2V0KTtcblxuICAgICAgICAgIGlmIChzcmNbb2Zmc2V0XSA9PT0gJyMnKSB7XG4gICAgICAgICAgICB2YXIgX2NvbW1lbnQgPSBuZXcgQ29tbWVudCgpO1xuXG4gICAgICAgICAgICBvZmZzZXQgPSBfY29tbWVudC5wYXJzZSh7XG4gICAgICAgICAgICAgIHNyYzogc3JjXG4gICAgICAgICAgICB9LCBvZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50cy5wdXNoKF9jb21tZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2l0Y2ggKHNyY1tvZmZzZXRdKSB7XG4gICAgICAgICAgICBjYXNlICdcXG4nOlxuICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IG5ldyBZQU1MU3ludGF4RXJyb3IodGhpcywgJ0RvY3VtZW50IGVuZCBtYXJrZXIgbGluZSBjYW5ub3QgaGF2ZSBhIG5vbi1jb21tZW50IHN1ZmZpeCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1BhcnNlQ29udGV4dH0gY29udGV4dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gSW5kZXggb2YgdGhlIGNoYXJhY3RlciBhZnRlciB0aGlzXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJwYXJzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZShjb250ZXh0LCBzdGFydCkge1xuICAgICAgY29udGV4dC5yb290ID0gdGhpcztcbiAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICB2YXIgc3JjID0gY29udGV4dC5zcmM7XG4gICAgICB2YXIgb2Zmc2V0ID0gc3JjLmNoYXJDb2RlQXQoc3RhcnQpID09PSAweGZlZmYgPyBzdGFydCArIDEgOiBzdGFydDsgLy8gc2tpcCBCT01cblxuICAgICAgb2Zmc2V0ID0gdGhpcy5wYXJzZURpcmVjdGl2ZXMob2Zmc2V0KTtcbiAgICAgIG9mZnNldCA9IHRoaXMucGFyc2VDb250ZW50cyhvZmZzZXQpO1xuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0T3JpZ1Jhbmdlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRPcmlnUmFuZ2VzKGNyLCBvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IF9nZXQoX2dldFByb3RvdHlwZU9mKERvY3VtZW50LnByb3RvdHlwZSksIFwic2V0T3JpZ1Jhbmdlc1wiLCB0aGlzKS5jYWxsKHRoaXMsIGNyLCBvZmZzZXQpO1xuICAgICAgdGhpcy5kaXJlY3RpdmVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgb2Zmc2V0ID0gbm9kZS5zZXRPcmlnUmFuZ2VzKGNyLCBvZmZzZXQpO1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5kaXJlY3RpdmVzRW5kTWFya2VyKSBvZmZzZXQgPSB0aGlzLmRpcmVjdGl2ZXNFbmRNYXJrZXIuc2V0T3JpZ1JhbmdlKGNyLCBvZmZzZXQpO1xuICAgICAgdGhpcy5jb250ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIG9mZnNldCA9IG5vZGUuc2V0T3JpZ1Jhbmdlcyhjciwgb2Zmc2V0KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuZG9jdW1lbnRFbmRNYXJrZXIpIG9mZnNldCA9IHRoaXMuZG9jdW1lbnRFbmRNYXJrZXIuc2V0T3JpZ1JhbmdlKGNyLCBvZmZzZXQpO1xuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgY29udGVudHMgPSB0aGlzLmNvbnRlbnRzLFxuICAgICAgICAgIGRpcmVjdGl2ZXMgPSB0aGlzLmRpcmVjdGl2ZXMsXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHJldHVybiB2YWx1ZTtcbiAgICAgIHZhciBzdHIgPSBkaXJlY3RpdmVzLmpvaW4oJycpO1xuXG4gICAgICBpZiAoY29udGVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoZGlyZWN0aXZlcy5sZW5ndGggPiAwIHx8IGNvbnRlbnRzWzBdLnR5cGUgPT09IFR5cGUuQ09NTUVOVCkgc3RyICs9ICctLS1cXG4nO1xuICAgICAgICBzdHIgKz0gY29udGVudHMuam9pbignJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJbc3RyLmxlbmd0aCAtIDFdICE9PSAnXFxuJykgc3RyICs9ICdcXG4nO1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRG9jdW1lbnQ7XG59KE5vZGUpO1xuXG52YXIgQWxpYXMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhBbGlhcywgX05vZGUpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoQWxpYXMpO1xuXG4gIGZ1bmN0aW9uIEFsaWFzKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbGlhcyk7XG5cbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQWxpYXMsIFt7XG4gICAga2V5OiBcInBhcnNlXCIsXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYW4gKmFsaWFzIGZyb20gdGhlIHNvdXJjZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtQYXJzZUNvbnRleHR9IGNvbnRleHRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBJbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSAtIEluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhpcyBzY2FsYXJcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2UoY29udGV4dCwgc3RhcnQpIHtcbiAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICB2YXIgc3JjID0gY29udGV4dC5zcmM7XG4gICAgICB2YXIgb2Zmc2V0ID0gTm9kZS5lbmRPZklkZW50aWZpZXIoc3JjLCBzdGFydCArIDEpO1xuICAgICAgdGhpcy52YWx1ZVJhbmdlID0gbmV3IFJhbmdlKHN0YXJ0ICsgMSwgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCA9IE5vZGUuZW5kT2ZXaGl0ZVNwYWNlKHNyYywgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCA9IHRoaXMucGFyc2VDb21tZW50KG9mZnNldCk7XG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBbGlhcztcbn0oTm9kZSk7XG5cbnZhciBDaG9tcCA9IHtcbiAgQ0xJUDogJ0NMSVAnLFxuICBLRUVQOiAnS0VFUCcsXG4gIFNUUklQOiAnU1RSSVAnXG59O1xudmFyIEJsb2NrVmFsdWUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhCbG9ja1ZhbHVlLCBfTm9kZSk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihCbG9ja1ZhbHVlKTtcblxuICBmdW5jdGlvbiBCbG9ja1ZhbHVlKHR5cGUsIHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJsb2NrVmFsdWUpO1xuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB0eXBlLCBwcm9wcyk7XG4gICAgX3RoaXMuYmxvY2tJbmRlbnQgPSBudWxsO1xuICAgIF90aGlzLmNob21waW5nID0gQ2hvbXAuQ0xJUDtcbiAgICBfdGhpcy5oZWFkZXIgPSBudWxsO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhCbG9ja1ZhbHVlLCBbe1xuICAgIGtleTogXCJwYXJzZUJsb2NrSGVhZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlQmxvY2tIZWFkZXIoc3RhcnQpIHtcbiAgICAgIHZhciBzcmMgPSB0aGlzLmNvbnRleHQuc3JjO1xuICAgICAgdmFyIG9mZnNldCA9IHN0YXJ0ICsgMTtcbiAgICAgIHZhciBiaSA9ICcnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgY2ggPSBzcmNbb2Zmc2V0XTtcblxuICAgICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICB0aGlzLmNob21waW5nID0gQ2hvbXAuU1RSSVA7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgICAgdGhpcy5jaG9tcGluZyA9IENob21wLktFRVA7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJzAnOlxuICAgICAgICAgIGNhc2UgJzEnOlxuICAgICAgICAgIGNhc2UgJzInOlxuICAgICAgICAgIGNhc2UgJzMnOlxuICAgICAgICAgIGNhc2UgJzQnOlxuICAgICAgICAgIGNhc2UgJzUnOlxuICAgICAgICAgIGNhc2UgJzYnOlxuICAgICAgICAgIGNhc2UgJzcnOlxuICAgICAgICAgIGNhc2UgJzgnOlxuICAgICAgICAgIGNhc2UgJzknOlxuICAgICAgICAgICAgYmkgKz0gY2g7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aGlzLmJsb2NrSW5kZW50ID0gTnVtYmVyKGJpKSB8fCBudWxsO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXIgPSBuZXcgUmFuZ2Uoc3RhcnQsIG9mZnNldCk7XG4gICAgICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhcnNlQmxvY2tWYWx1ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUJsb2NrVmFsdWUoc3RhcnQpIHtcbiAgICAgIHZhciBfdGhpcyRjb250ZXh0ID0gdGhpcy5jb250ZXh0LFxuICAgICAgICAgIGluZGVudCA9IF90aGlzJGNvbnRleHQuaW5kZW50LFxuICAgICAgICAgIHNyYyA9IF90aGlzJGNvbnRleHQuc3JjO1xuICAgICAgdmFyIGV4cGxpY2l0ID0gISF0aGlzLmJsb2NrSW5kZW50O1xuICAgICAgdmFyIG9mZnNldCA9IHN0YXJ0O1xuICAgICAgdmFyIHZhbHVlRW5kID0gc3RhcnQ7XG4gICAgICB2YXIgbWluQmxvY2tJbmRlbnQgPSAxO1xuXG4gICAgICBmb3IgKHZhciBjaCA9IHNyY1tvZmZzZXRdOyBjaCA9PT0gJ1xcbic7IGNoID0gc3JjW29mZnNldF0pIHtcbiAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgIGlmIChOb2RlLmF0RG9jdW1lbnRCb3VuZGFyeShzcmMsIG9mZnNldCkpIGJyZWFrO1xuICAgICAgICB2YXIgZW5kID0gTm9kZS5lbmRPZkJsb2NrSW5kZW50KHNyYywgaW5kZW50LCBvZmZzZXQpOyAvLyBzaG91bGQgbm90IGluY2x1ZGUgdGFiP1xuXG4gICAgICAgIGlmIChlbmQgPT09IG51bGwpIGJyZWFrO1xuICAgICAgICB2YXIgX2NoID0gc3JjW2VuZF07XG4gICAgICAgIHZhciBsaW5lSW5kZW50ID0gZW5kIC0gKG9mZnNldCArIGluZGVudCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmJsb2NrSW5kZW50KSB7XG4gICAgICAgICAgLy8gbm8gZXhwbGljaXQgYmxvY2sgaW5kZW50LCBub25lIHlldCBkZXRlY3RlZFxuICAgICAgICAgIGlmIChzcmNbZW5kXSAhPT0gJ1xcbicpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IGxpbmUgd2l0aCBub24td2hpdGVzcGFjZSBjb250ZW50XG4gICAgICAgICAgICBpZiAobGluZUluZGVudCA8IG1pbkJsb2NrSW5kZW50KSB7XG4gICAgICAgICAgICAgIHZhciBtc2cgPSAnQmxvY2sgc2NhbGFycyB3aXRoIG1vcmUtaW5kZW50ZWQgbGVhZGluZyBlbXB0eSBsaW5lcyBtdXN0IHVzZSBhbiBleHBsaWNpdCBpbmRlbnRhdGlvbiBpbmRpY2F0b3InO1xuICAgICAgICAgICAgICB0aGlzLmVycm9yID0gbmV3IFlBTUxTZW1hbnRpY0Vycm9yKHRoaXMsIG1zZyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYmxvY2tJbmRlbnQgPSBsaW5lSW5kZW50O1xuICAgICAgICAgIH0gZWxzZSBpZiAobGluZUluZGVudCA+IG1pbkJsb2NrSW5kZW50KSB7XG4gICAgICAgICAgICAvLyBlbXB0eSBsaW5lIHdpdGggbW9yZSB3aGl0ZXNwYWNlXG4gICAgICAgICAgICBtaW5CbG9ja0luZGVudCA9IGxpbmVJbmRlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKF9jaCAmJiBfY2ggIT09ICdcXG4nICYmIGxpbmVJbmRlbnQgPCB0aGlzLmJsb2NrSW5kZW50KSB7XG4gICAgICAgICAgaWYgKHNyY1tlbmRdID09PSAnIycpIGJyZWFrO1xuXG4gICAgICAgICAgaWYgKCF0aGlzLmVycm9yKSB7XG4gICAgICAgICAgICB2YXIgX3NyYyA9IGV4cGxpY2l0ID8gJ2V4cGxpY2l0IGluZGVudGF0aW9uIGluZGljYXRvcicgOiAnZmlyc3QgbGluZSc7XG5cbiAgICAgICAgICAgIHZhciBfbXNnID0gXCJCbG9jayBzY2FsYXJzIG11c3Qgbm90IGJlIGxlc3MgaW5kZW50ZWQgdGhhbiB0aGVpciBcIi5jb25jYXQoX3NyYyk7XG5cbiAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBuZXcgWUFNTFNlbWFudGljRXJyb3IodGhpcywgX21zZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNyY1tlbmRdID09PSAnXFxuJykge1xuICAgICAgICAgIG9mZnNldCA9IGVuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQgPSB2YWx1ZUVuZCA9IE5vZGUuZW5kT2ZMaW5lKHNyYywgZW5kKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jaG9tcGluZyAhPT0gQ2hvbXAuS0VFUCkge1xuICAgICAgICBvZmZzZXQgPSBzcmNbdmFsdWVFbmRdID8gdmFsdWVFbmQgKyAxIDogdmFsdWVFbmQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudmFsdWVSYW5nZSA9IG5ldyBSYW5nZShzdGFydCArIDEsIG9mZnNldCk7XG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBibG9jayB2YWx1ZSBmcm9tIHRoZSBzb3VyY2VcbiAgICAgKlxuICAgICAqIEFjY2VwdGVkIGZvcm1zIGFyZTpcbiAgICAgKiBgYGBcbiAgICAgKiBCU1xuICAgICAqIGJsb2NrXG4gICAgICogbGluZXNcbiAgICAgKlxuICAgICAqIEJTICNjb21tZW50XG4gICAgICogYmxvY2tcbiAgICAgKiBsaW5lc1xuICAgICAqIGBgYFxuICAgICAqIHdoZXJlIHRoZSBibG9jayBzdHlsZSBCUyBtYXRjaGVzIHRoZSByZWdleHAgYFt8Pl1bLSsxLTldKmAgYW5kIGJsb2NrIGxpbmVzXG4gICAgICogYXJlIGVtcHR5IG9yIGhhdmUgYW4gaW5kZW50IGxldmVsIGdyZWF0ZXIgdGhhbiBgaW5kZW50YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UGFyc2VDb250ZXh0fSBjb250ZXh0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBJbmRleCBvZiB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoaXMgYmxvY2tcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInBhcnNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlKGNvbnRleHQsIHN0YXJ0KSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdmFyIHNyYyA9IGNvbnRleHQuc3JjO1xuICAgICAgdmFyIG9mZnNldCA9IHRoaXMucGFyc2VCbG9ja0hlYWRlcihzdGFydCk7XG4gICAgICBvZmZzZXQgPSBOb2RlLmVuZE9mV2hpdGVTcGFjZShzcmMsIG9mZnNldCk7XG4gICAgICBvZmZzZXQgPSB0aGlzLnBhcnNlQ29tbWVudChvZmZzZXQpO1xuICAgICAgb2Zmc2V0ID0gdGhpcy5wYXJzZUJsb2NrVmFsdWUob2Zmc2V0KTtcbiAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldE9yaWdSYW5nZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0T3JpZ1Jhbmdlcyhjciwgb2Zmc2V0KSB7XG4gICAgICBvZmZzZXQgPSBfZ2V0KF9nZXRQcm90b3R5cGVPZihCbG9ja1ZhbHVlLnByb3RvdHlwZSksIFwic2V0T3JpZ1Jhbmdlc1wiLCB0aGlzKS5jYWxsKHRoaXMsIGNyLCBvZmZzZXQpO1xuICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyID8gdGhpcy5oZWFkZXIuc2V0T3JpZ1JhbmdlKGNyLCBvZmZzZXQpIDogb2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbmNsdWRlc1RyYWlsaW5nTGluZXNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNob21waW5nID09PSBDaG9tcC5LRUVQO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdHJWYWx1ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlUmFuZ2UgfHwgIXRoaXMuY29udGV4dCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgX3RoaXMkdmFsdWVSYW5nZSA9IHRoaXMudmFsdWVSYW5nZSxcbiAgICAgICAgICBzdGFydCA9IF90aGlzJHZhbHVlUmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgZW5kID0gX3RoaXMkdmFsdWVSYW5nZS5lbmQ7XG4gICAgICB2YXIgX3RoaXMkY29udGV4dDIgPSB0aGlzLmNvbnRleHQsXG4gICAgICAgICAgaW5kZW50ID0gX3RoaXMkY29udGV4dDIuaW5kZW50LFxuICAgICAgICAgIHNyYyA9IF90aGlzJGNvbnRleHQyLnNyYztcbiAgICAgIGlmICh0aGlzLnZhbHVlUmFuZ2UuaXNFbXB0eSgpKSByZXR1cm4gJyc7XG4gICAgICB2YXIgbGFzdE5ld0xpbmUgPSBudWxsO1xuICAgICAgdmFyIGNoID0gc3JjW2VuZCAtIDFdO1xuXG4gICAgICB3aGlsZSAoY2ggPT09ICdcXG4nIHx8IGNoID09PSAnXFx0JyB8fCBjaCA9PT0gJyAnKSB7XG4gICAgICAgIGVuZCAtPSAxO1xuXG4gICAgICAgIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICAgICAgICBpZiAodGhpcy5jaG9tcGluZyA9PT0gQ2hvbXAuS0VFUCkgYnJlYWs7ZWxzZSByZXR1cm4gJyc7IC8vIHByb2JhYmx5IG5ldmVyIGhhcHBlbnNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpIGxhc3ROZXdMaW5lID0gZW5kO1xuICAgICAgICBjaCA9IHNyY1tlbmQgLSAxXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGtlZXBTdGFydCA9IGVuZCArIDE7XG5cbiAgICAgIGlmIChsYXN0TmV3TGluZSkge1xuICAgICAgICBpZiAodGhpcy5jaG9tcGluZyA9PT0gQ2hvbXAuS0VFUCkge1xuICAgICAgICAgIGtlZXBTdGFydCA9IGxhc3ROZXdMaW5lO1xuICAgICAgICAgIGVuZCA9IHRoaXMudmFsdWVSYW5nZS5lbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW5kID0gbGFzdE5ld0xpbmU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGJpID0gaW5kZW50ICsgdGhpcy5ibG9ja0luZGVudDtcbiAgICAgIHZhciBmb2xkZWQgPSB0aGlzLnR5cGUgPT09IFR5cGUuQkxPQ0tfRk9MREVEO1xuICAgICAgdmFyIGF0U3RhcnQgPSB0cnVlO1xuICAgICAgdmFyIHN0ciA9ICcnO1xuICAgICAgdmFyIHNlcCA9ICcnO1xuICAgICAgdmFyIHByZXZNb3JlSW5kZW50ZWQgPSBmYWxzZTtcblxuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBiaTsgKytqKSB7XG4gICAgICAgICAgaWYgKHNyY1tpXSAhPT0gJyAnKSBicmVhaztcbiAgICAgICAgICBpICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX2NoMiA9IHNyY1tpXTtcblxuICAgICAgICBpZiAoX2NoMiA9PT0gJ1xcbicpIHtcbiAgICAgICAgICBpZiAoc2VwID09PSAnXFxuJykgc3RyICs9ICdcXG4nO2Vsc2Ugc2VwID0gJ1xcbic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGxpbmVFbmQgPSBOb2RlLmVuZE9mTGluZShzcmMsIGkpO1xuICAgICAgICAgIHZhciBsaW5lID0gc3JjLnNsaWNlKGksIGxpbmVFbmQpO1xuICAgICAgICAgIGkgPSBsaW5lRW5kO1xuXG4gICAgICAgICAgaWYgKGZvbGRlZCAmJiAoX2NoMiA9PT0gJyAnIHx8IF9jaDIgPT09ICdcXHQnKSAmJiBpIDwga2VlcFN0YXJ0KSB7XG4gICAgICAgICAgICBpZiAoc2VwID09PSAnICcpIHNlcCA9ICdcXG4nO2Vsc2UgaWYgKCFwcmV2TW9yZUluZGVudGVkICYmICFhdFN0YXJ0ICYmIHNlcCA9PT0gJ1xcbicpIHNlcCA9ICdcXG5cXG4nO1xuICAgICAgICAgICAgc3RyICs9IHNlcCArIGxpbmU7IC8vKyAoKGxpbmVFbmQgPCBlbmQgJiYgc3JjW2xpbmVFbmRdKSB8fCAnJylcblxuICAgICAgICAgICAgc2VwID0gbGluZUVuZCA8IGVuZCAmJiBzcmNbbGluZUVuZF0gfHwgJyc7XG4gICAgICAgICAgICBwcmV2TW9yZUluZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyICs9IHNlcCArIGxpbmU7XG4gICAgICAgICAgICBzZXAgPSBmb2xkZWQgJiYgaSA8IGtlZXBTdGFydCA/ICcgJyA6ICdcXG4nO1xuICAgICAgICAgICAgcHJldk1vcmVJbmRlbnRlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhdFN0YXJ0ICYmIGxpbmUgIT09ICcnKSBhdFN0YXJ0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY2hvbXBpbmcgPT09IENob21wLlNUUklQID8gc3RyIDogc3RyICsgJ1xcbic7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEJsb2NrVmFsdWU7XG59KE5vZGUpO1xuXG52YXIgRmxvd0NvbGxlY3Rpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhGbG93Q29sbGVjdGlvbiwgX05vZGUpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoRmxvd0NvbGxlY3Rpb24pO1xuXG4gIGZ1bmN0aW9uIEZsb3dDb2xsZWN0aW9uKHR5cGUsIHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZsb3dDb2xsZWN0aW9uKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdHlwZSwgcHJvcHMpO1xuICAgIF90aGlzLml0ZW1zID0gbnVsbDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRmxvd0NvbGxlY3Rpb24sIFt7XG4gICAga2V5OiBcInByZXZOb2RlSXNKc29uTGlrZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcmV2Tm9kZUlzSnNvbkxpa2UoKSB7XG4gICAgICB2YXIgaWR4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICAgIHZhciBub2RlID0gdGhpcy5pdGVtc1tpZHggLSAxXTtcbiAgICAgIHJldHVybiAhIW5vZGUgJiYgKG5vZGUuanNvbkxpa2UgfHwgbm9kZS50eXBlID09PSBUeXBlLkNPTU1FTlQgJiYgdGhpcy5wcmV2Tm9kZUlzSnNvbkxpa2UoaWR4IC0gMSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge1BhcnNlQ29udGV4dH0gY29udGV4dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIEluZGV4IG9mIGZpcnN0IGNoYXJhY3RlclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gSW5kZXggb2YgdGhlIGNoYXJhY3RlciBhZnRlciB0aGlzXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJwYXJzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZShjb250ZXh0LCBzdGFydCkge1xuICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHZhciBwYXJzZU5vZGUgPSBjb250ZXh0LnBhcnNlTm9kZSxcbiAgICAgICAgICBzcmMgPSBjb250ZXh0LnNyYztcbiAgICAgIHZhciBpbmRlbnQgPSBjb250ZXh0LmluZGVudCxcbiAgICAgICAgICBsaW5lU3RhcnQgPSBjb250ZXh0LmxpbmVTdGFydDtcbiAgICAgIHZhciBjaGFyID0gc3JjW3N0YXJ0XTsgLy8geyBvciBbXG5cbiAgICAgIHRoaXMuaXRlbXMgPSBbe1xuICAgICAgICBjaGFyOiBjaGFyLFxuICAgICAgICBvZmZzZXQ6IHN0YXJ0XG4gICAgICB9XTtcbiAgICAgIHZhciBvZmZzZXQgPSBOb2RlLmVuZE9mV2hpdGVTcGFjZShzcmMsIHN0YXJ0ICsgMSk7XG4gICAgICBjaGFyID0gc3JjW29mZnNldF07XG5cbiAgICAgIHdoaWxlIChjaGFyICYmIGNoYXIgIT09ICddJyAmJiBjaGFyICE9PSAnfScpIHtcbiAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbGluZVN0YXJ0ID0gb2Zmc2V0ICsgMTtcbiAgICAgICAgICAgICAgdmFyIHdzRW5kID0gTm9kZS5lbmRPZldoaXRlU3BhY2Uoc3JjLCBsaW5lU3RhcnQpO1xuXG4gICAgICAgICAgICAgIGlmIChzcmNbd3NFbmRdID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgIHZhciBibGFua0xpbmUgPSBuZXcgQmxhbmtMaW5lKCk7XG4gICAgICAgICAgICAgICAgbGluZVN0YXJ0ID0gYmxhbmtMaW5lLnBhcnNlKHtcbiAgICAgICAgICAgICAgICAgIHNyYzogc3JjXG4gICAgICAgICAgICAgICAgfSwgbGluZVN0YXJ0KTtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goYmxhbmtMaW5lKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIG9mZnNldCA9IE5vZGUuZW5kT2ZJbmRlbnQoc3JjLCBsaW5lU3RhcnQpO1xuXG4gICAgICAgICAgICAgIGlmIChvZmZzZXQgPD0gbGluZVN0YXJ0ICsgaW5kZW50KSB7XG4gICAgICAgICAgICAgICAgY2hhciA9IHNyY1tvZmZzZXRdO1xuXG4gICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8IGxpbmVTdGFydCArIGluZGVudCB8fCBjaGFyICE9PSAnXScgJiYgY2hhciAhPT0gJ30nKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbXNnID0gJ0luc3VmZmljaWVudCBpbmRlbnRhdGlvbiBpbiBmbG93IGNvbGxlY3Rpb24nO1xuICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IG5ldyBZQU1MU2VtYW50aWNFcnJvcih0aGlzLCBtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICcsJzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBjaGFyOiBjaGFyLFxuICAgICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnIyc6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBjb21tZW50ID0gbmV3IENvbW1lbnQoKTtcbiAgICAgICAgICAgICAgb2Zmc2V0ID0gY29tbWVudC5wYXJzZSh7XG4gICAgICAgICAgICAgICAgc3JjOiBzcmNcbiAgICAgICAgICAgICAgfSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKGNvbW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICc/JzpcbiAgICAgICAgICBjYXNlICc6JzpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIG5leHQgPSBzcmNbb2Zmc2V0ICsgMV07XG5cbiAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICdcXG4nIHx8IG5leHQgPT09ICdcXHQnIHx8IG5leHQgPT09ICcgJyB8fCBuZXh0ID09PSAnLCcgfHwgLy8gaW4tZmxvdyA6IGFmdGVyIEpTT04tbGlrZSBrZXkgZG9lcyBub3QgbmVlZCB0byBiZSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgIGNoYXIgPT09ICc6JyAmJiB0aGlzLnByZXZOb2RlSXNKc29uTGlrZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGNoYXI6IGNoYXIsXG4gICAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLy8gZmFsbHRocm91Z2hcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhciBub2RlID0gcGFyc2VOb2RlKHtcbiAgICAgICAgICAgICAgICBhdExpbmVTdGFydDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaW5Db2xsZWN0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbkZsb3c6IHRydWUsXG4gICAgICAgICAgICAgICAgaW5kZW50OiAtMSxcbiAgICAgICAgICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXNcbiAgICAgICAgICAgICAgfSwgb2Zmc2V0KTtcblxuICAgICAgICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBhdCBuZXh0IGRvY3VtZW50IHN0YXJ0XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZVJhbmdlID0gbmV3IFJhbmdlKHN0YXJ0LCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgIG9mZnNldCA9IE5vZGUubm9ybWFsaXplT2Zmc2V0KHNyYywgbm9kZS5yYW5nZS5lbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0ID0gTm9kZS5lbmRPZldoaXRlU3BhY2Uoc3JjLCBvZmZzZXQpO1xuICAgICAgICBjaGFyID0gc3JjW29mZnNldF07XG4gICAgICB9XG5cbiAgICAgIHRoaXMudmFsdWVSYW5nZSA9IG5ldyBSYW5nZShzdGFydCwgb2Zmc2V0ICsgMSk7XG5cbiAgICAgIGlmIChjaGFyKSB7XG4gICAgICAgIHRoaXMuaXRlbXMucHVzaCh7XG4gICAgICAgICAgY2hhcjogY2hhcixcbiAgICAgICAgICBvZmZzZXQ6IG9mZnNldFxuICAgICAgICB9KTtcbiAgICAgICAgb2Zmc2V0ID0gTm9kZS5lbmRPZldoaXRlU3BhY2Uoc3JjLCBvZmZzZXQgKyAxKTtcbiAgICAgICAgb2Zmc2V0ID0gdGhpcy5wYXJzZUNvbW1lbnQob2Zmc2V0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0T3JpZ1Jhbmdlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRPcmlnUmFuZ2VzKGNyLCBvZmZzZXQpIHtcbiAgICAgIG9mZnNldCA9IF9nZXQoX2dldFByb3RvdHlwZU9mKEZsb3dDb2xsZWN0aW9uLnByb3RvdHlwZSksIFwic2V0T3JpZ1Jhbmdlc1wiLCB0aGlzKS5jYWxsKHRoaXMsIGNyLCBvZmZzZXQpO1xuICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgIG9mZnNldCA9IG5vZGUuc2V0T3JpZ1Jhbmdlcyhjciwgb2Zmc2V0KTtcbiAgICAgICAgfSBlbHNlIGlmIChjci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBub2RlLm9yaWdPZmZzZXQgPSBub2RlLm9mZnNldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgaSA9IG9mZnNldDtcblxuICAgICAgICAgIHdoaWxlIChpIDwgY3IubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoY3JbaV0gPiBub2RlLm9mZnNldCkgYnJlYWs7ZWxzZSArK2k7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbm9kZS5vcmlnT2Zmc2V0ID0gbm9kZS5vZmZzZXQgKyBpO1xuICAgICAgICAgIG9mZnNldCA9IGk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgc3JjID0gdGhpcy5jb250ZXh0LnNyYyxcbiAgICAgICAgICBpdGVtcyA9IHRoaXMuaXRlbXMsXG4gICAgICAgICAgcmFuZ2UgPSB0aGlzLnJhbmdlLFxuICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSByZXR1cm4gdmFsdWU7XG4gICAgICB2YXIgbm9kZXMgPSBpdGVtcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gaW5zdGFuY2VvZiBOb2RlO1xuICAgICAgfSk7XG4gICAgICB2YXIgc3RyID0gJyc7XG4gICAgICB2YXIgcHJldkVuZCA9IHJhbmdlLnN0YXJ0O1xuICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgcHJlZml4ID0gc3JjLnNsaWNlKHByZXZFbmQsIG5vZGUucmFuZ2Uuc3RhcnQpO1xuICAgICAgICBwcmV2RW5kID0gbm9kZS5yYW5nZS5lbmQ7XG4gICAgICAgIHN0ciArPSBwcmVmaXggKyBTdHJpbmcobm9kZSk7XG5cbiAgICAgICAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICdcXG4nICYmIHNyY1twcmV2RW5kIC0gMV0gIT09ICdcXG4nICYmIHNyY1twcmV2RW5kXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAvLyBDb21tZW50IHJhbmdlIGRvZXMgbm90IGluY2x1ZGUgdGhlIHRlcm1pbmFsIG5ld2xpbmUsIGJ1dCBpdHNcbiAgICAgICAgICAvLyBzdHJpbmdpZmllZCB2YWx1ZSBkb2VzLiBXaXRob3V0IHRoaXMgZml4LCBuZXdsaW5lcyBhdCBjb21tZW50IGVuZHNcbiAgICAgICAgICAvLyBnZXQgZHVwbGljYXRlZC5cbiAgICAgICAgICBwcmV2RW5kICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgc3RyICs9IHNyYy5zbGljZShwcmV2RW5kLCByYW5nZS5lbmQpO1xuICAgICAgcmV0dXJuIE5vZGUuYWRkU3RyaW5nVGVybWluYXRvcihzcmMsIHJhbmdlLmVuZCwgc3RyKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRmxvd0NvbGxlY3Rpb247XG59KE5vZGUpO1xuXG52YXIgUXVvdGVEb3VibGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhRdW90ZURvdWJsZSwgX05vZGUpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoUXVvdGVEb3VibGUpO1xuXG4gIGZ1bmN0aW9uIFF1b3RlRG91YmxlKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBRdW90ZURvdWJsZSk7XG5cbiAgICByZXR1cm4gX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUXVvdGVEb3VibGUsIFt7XG4gICAga2V5OiBcInBhcnNlQ2hhckNvZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2VDaGFyQ29kZShvZmZzZXQsIGxlbmd0aCwgZXJyb3JzKSB7XG4gICAgICB2YXIgc3JjID0gdGhpcy5jb250ZXh0LnNyYztcbiAgICAgIHZhciBjYyA9IHNyYy5zdWJzdHIob2Zmc2V0LCBsZW5ndGgpO1xuICAgICAgdmFyIG9rID0gY2MubGVuZ3RoID09PSBsZW5ndGggJiYgL15bMC05YS1mQS1GXSskLy50ZXN0KGNjKTtcbiAgICAgIHZhciBjb2RlID0gb2sgPyBwYXJzZUludChjYywgMTYpIDogTmFOO1xuXG4gICAgICBpZiAoaXNOYU4oY29kZSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2gobmV3IFlBTUxTeW50YXhFcnJvcih0aGlzLCBcIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlIFwiLmNvbmNhdChzcmMuc3Vic3RyKG9mZnNldCAtIDIsIGxlbmd0aCArIDIpKSkpO1xuICAgICAgICByZXR1cm4gc3JjLnN1YnN0cihvZmZzZXQgLSAyLCBsZW5ndGggKyAyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSBcImRvdWJsZSBxdW90ZWRcIiB2YWx1ZSBmcm9tIHRoZSBzb3VyY2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UGFyc2VDb250ZXh0fSBjb250ZXh0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBJbmRleCBvZiB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoaXMgc2NhbGFyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJwYXJzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZShjb250ZXh0LCBzdGFydCkge1xuICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHZhciBzcmMgPSBjb250ZXh0LnNyYztcbiAgICAgIHZhciBvZmZzZXQgPSBRdW90ZURvdWJsZS5lbmRPZlF1b3RlKHNyYywgc3RhcnQgKyAxKTtcbiAgICAgIHRoaXMudmFsdWVSYW5nZSA9IG5ldyBSYW5nZShzdGFydCwgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCA9IE5vZGUuZW5kT2ZXaGl0ZVNwYWNlKHNyYywgb2Zmc2V0KTtcbiAgICAgIG9mZnNldCA9IHRoaXMucGFyc2VDb21tZW50KG9mZnNldCk7XG4gICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdHJWYWx1ZVwiLFxuXG4gICAgLyoqXG4gICAgICogQHJldHVybnMge3N0cmluZyB8IHsgc3RyOiBzdHJpbmcsIGVycm9yczogWUFNTFN5bnRheEVycm9yW10gfX1cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICghdGhpcy52YWx1ZVJhbmdlIHx8ICF0aGlzLmNvbnRleHQpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgdmFyIF90aGlzJHZhbHVlUmFuZ2UgPSB0aGlzLnZhbHVlUmFuZ2UsXG4gICAgICAgICAgc3RhcnQgPSBfdGhpcyR2YWx1ZVJhbmdlLnN0YXJ0LFxuICAgICAgICAgIGVuZCA9IF90aGlzJHZhbHVlUmFuZ2UuZW5kO1xuICAgICAgdmFyIF90aGlzJGNvbnRleHQgPSB0aGlzLmNvbnRleHQsXG4gICAgICAgICAgaW5kZW50ID0gX3RoaXMkY29udGV4dC5pbmRlbnQsXG4gICAgICAgICAgc3JjID0gX3RoaXMkY29udGV4dC5zcmM7XG4gICAgICBpZiAoc3JjW2VuZCAtIDFdICE9PSAnXCInKSBlcnJvcnMucHVzaChuZXcgWUFNTFN5bnRheEVycm9yKHRoaXMsICdNaXNzaW5nIGNsb3NpbmcgXCJxdW90ZScpKTsgLy8gVXNpbmcgU3RyaW5nI3JlcGxhY2UgaXMgdG9vIHBhaW5mdWwgd2l0aCBlc2NhcGVkIG5ld2xpbmVzIHByZWNlZGVkIGJ5XG4gICAgICAvLyBlc2NhcGVkIGJhY2tzbGFzaGVzOyBhbHNvLCB0aGlzIHNob3VsZCBiZSBmYXN0ZXIuXG5cbiAgICAgIHZhciBzdHIgPSAnJztcblxuICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0ICsgMTsgaSA8IGVuZCAtIDE7ICsraSkge1xuICAgICAgICB2YXIgY2ggPSBzcmNbaV07XG5cbiAgICAgICAgaWYgKGNoID09PSAnXFxuJykge1xuICAgICAgICAgIGlmIChOb2RlLmF0RG9jdW1lbnRCb3VuZGFyeShzcmMsIGkgKyAxKSkgZXJyb3JzLnB1c2gobmV3IFlBTUxTZW1hbnRpY0Vycm9yKHRoaXMsICdEb2N1bWVudCBib3VuZGFyeSBpbmRpY2F0b3JzIGFyZSBub3QgYWxsb3dlZCB3aXRoaW4gc3RyaW5nIHZhbHVlcycpKTtcblxuICAgICAgICAgIHZhciBfTm9kZSRmb2xkTmV3bGluZSA9IE5vZGUuZm9sZE5ld2xpbmUoc3JjLCBpLCBpbmRlbnQpLFxuICAgICAgICAgICAgICBmb2xkID0gX05vZGUkZm9sZE5ld2xpbmUuZm9sZCxcbiAgICAgICAgICAgICAgb2Zmc2V0ID0gX05vZGUkZm9sZE5ld2xpbmUub2Zmc2V0LFxuICAgICAgICAgICAgICBlcnJvciA9IF9Ob2RlJGZvbGROZXdsaW5lLmVycm9yO1xuXG4gICAgICAgICAgc3RyICs9IGZvbGQ7XG4gICAgICAgICAgaSA9IG9mZnNldDtcbiAgICAgICAgICBpZiAoZXJyb3IpIGVycm9ycy5wdXNoKG5ldyBZQU1MU2VtYW50aWNFcnJvcih0aGlzLCAnTXVsdGktbGluZSBkb3VibGUtcXVvdGVkIHN0cmluZyBuZWVkcyB0byBiZSBzdWZmaWNpZW50bHkgaW5kZW50ZWQnKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcXFxcJykge1xuICAgICAgICAgIGkgKz0gMTtcblxuICAgICAgICAgIHN3aXRjaCAoc3JjW2ldKSB7XG4gICAgICAgICAgICBjYXNlICcwJzpcbiAgICAgICAgICAgICAgc3RyICs9ICdcXDAnO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIG51bGwgY2hhcmFjdGVyXG5cbiAgICAgICAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAgICAgICBzdHIgKz0gJ1xceDA3JztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyBiZWxsIGNoYXJhY3RlclxuXG4gICAgICAgICAgICBjYXNlICdiJzpcbiAgICAgICAgICAgICAgc3RyICs9ICdcXGInO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIGJhY2tzcGFjZVxuXG4gICAgICAgICAgICBjYXNlICdlJzpcbiAgICAgICAgICAgICAgc3RyICs9ICdcXHgxYic7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gZXNjYXBlIGNoYXJhY3RlclxuXG4gICAgICAgICAgICBjYXNlICdmJzpcbiAgICAgICAgICAgICAgc3RyICs9ICdcXGYnO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIGZvcm0gZmVlZFxuXG4gICAgICAgICAgICBjYXNlICduJzpcbiAgICAgICAgICAgICAgc3RyICs9ICdcXG4nO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIGxpbmUgZmVlZFxuXG4gICAgICAgICAgICBjYXNlICdyJzpcbiAgICAgICAgICAgICAgc3RyICs9ICdcXHInO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIGNhcnJpYWdlIHJldHVyblxuXG4gICAgICAgICAgICBjYXNlICd0JzpcbiAgICAgICAgICAgICAgc3RyICs9ICdcXHQnO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIGhvcml6b250YWwgdGFiXG5cbiAgICAgICAgICAgIGNhc2UgJ3YnOlxuICAgICAgICAgICAgICBzdHIgKz0gJ1xcdic7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gdmVydGljYWwgdGFiXG5cbiAgICAgICAgICAgIGNhc2UgJ04nOlxuICAgICAgICAgICAgICBzdHIgKz0gXCJcXHg4NVwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIFVuaWNvZGUgbmV4dCBsaW5lXG5cbiAgICAgICAgICAgIGNhc2UgJ18nOlxuICAgICAgICAgICAgICBzdHIgKz0gXCJcXHhBMFwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIFVuaWNvZGUgbm9uLWJyZWFraW5nIHNwYWNlXG5cbiAgICAgICAgICAgIGNhc2UgJ0wnOlxuICAgICAgICAgICAgICBzdHIgKz0gXCJcXHUyMDI4XCI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gVW5pY29kZSBsaW5lIHNlcGFyYXRvclxuXG4gICAgICAgICAgICBjYXNlICdQJzpcbiAgICAgICAgICAgICAgc3RyICs9IFwiXFx1MjAyOVwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIFVuaWNvZGUgcGFyYWdyYXBoIHNlcGFyYXRvclxuXG4gICAgICAgICAgICBjYXNlICcgJzpcbiAgICAgICAgICAgICAgc3RyICs9ICcgJztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgICAgc3RyICs9ICdcIic7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICcvJzpcbiAgICAgICAgICAgICAgc3RyICs9ICcvJztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ1xcXFwnOlxuICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnXFx0JzpcbiAgICAgICAgICAgICAgc3RyICs9ICdcXHQnO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgIHN0ciArPSB0aGlzLnBhcnNlQ2hhckNvZGUoaSArIDEsIDIsIGVycm9ycyk7XG4gICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ3UnOlxuICAgICAgICAgICAgICBzdHIgKz0gdGhpcy5wYXJzZUNoYXJDb2RlKGkgKyAxLCA0LCBlcnJvcnMpO1xuICAgICAgICAgICAgICBpICs9IDQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdVJzpcbiAgICAgICAgICAgICAgc3RyICs9IHRoaXMucGFyc2VDaGFyQ29kZShpICsgMSwgOCwgZXJyb3JzKTtcbiAgICAgICAgICAgICAgaSArPSA4O1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgICAgLy8gc2tpcCBlc2NhcGVkIG5ld2xpbmVzLCBidXQgc3RpbGwgdHJpbSB0aGUgZm9sbG93aW5nIGxpbmVcbiAgICAgICAgICAgICAgd2hpbGUgKHNyY1tpICsgMV0gPT09ICcgJyB8fCBzcmNbaSArIDFdID09PSAnXFx0Jykge1xuICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBlcnJvcnMucHVzaChuZXcgWUFNTFN5bnRheEVycm9yKHRoaXMsIFwiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgXCIuY29uY2F0KHNyYy5zdWJzdHIoaSAtIDEsIDIpKSkpO1xuICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFwnICsgc3JjW2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0Jykge1xuICAgICAgICAgIC8vIHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgIHZhciB3c1N0YXJ0ID0gaTtcbiAgICAgICAgICB2YXIgbmV4dCA9IHNyY1tpICsgMV07XG5cbiAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKSB7XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICBuZXh0ID0gc3JjW2kgKyAxXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobmV4dCAhPT0gJ1xcbicpIHN0ciArPSBpID4gd3NTdGFydCA/IHNyYy5zbGljZSh3c1N0YXJ0LCBpICsgMSkgOiBjaDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgKz0gY2g7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVycm9ycy5sZW5ndGggPiAwID8ge1xuICAgICAgICBlcnJvcnM6IGVycm9ycyxcbiAgICAgICAgc3RyOiBzdHJcbiAgICAgIH0gOiBzdHI7XG4gICAgfVxuICB9XSwgW3tcbiAgICBrZXk6IFwiZW5kT2ZRdW90ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbmRPZlF1b3RlKHNyYywgb2Zmc2V0KSB7XG4gICAgICB2YXIgY2ggPSBzcmNbb2Zmc2V0XTtcblxuICAgICAgd2hpbGUgKGNoICYmIGNoICE9PSAnXCInKSB7XG4gICAgICAgIG9mZnNldCArPSBjaCA9PT0gJ1xcXFwnID8gMiA6IDE7XG4gICAgICAgIGNoID0gc3JjW29mZnNldF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvZmZzZXQgKyAxO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBRdW90ZURvdWJsZTtcbn0oTm9kZSk7XG5cbnZhciBRdW90ZVNpbmdsZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX05vZGUpIHtcbiAgX2luaGVyaXRzKFF1b3RlU2luZ2xlLCBfTm9kZSk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihRdW90ZVNpbmdsZSk7XG5cbiAgZnVuY3Rpb24gUXVvdGVTaW5nbGUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFF1b3RlU2luZ2xlKTtcblxuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhRdW90ZVNpbmdsZSwgW3tcbiAgICBrZXk6IFwicGFyc2VcIixcblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhICdzaW5nbGUgcXVvdGVkJyB2YWx1ZSBmcm9tIHRoZSBzb3VyY2VcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UGFyc2VDb250ZXh0fSBjb250ZXh0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IC0gSW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyXG4gICAgICogQHJldHVybnMge251bWJlcn0gLSBJbmRleCBvZiB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoaXMgc2NhbGFyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlKGNvbnRleHQsIHN0YXJ0KSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdmFyIHNyYyA9IGNvbnRleHQuc3JjO1xuICAgICAgdmFyIG9mZnNldCA9IFF1b3RlU2luZ2xlLmVuZE9mUXVvdGUoc3JjLCBzdGFydCArIDEpO1xuICAgICAgdGhpcy52YWx1ZVJhbmdlID0gbmV3IFJhbmdlKHN0YXJ0LCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ID0gTm9kZS5lbmRPZldoaXRlU3BhY2Uoc3JjLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ID0gdGhpcy5wYXJzZUNvbW1lbnQob2Zmc2V0KTtcbiAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0clZhbHVlXCIsXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgeyBzdHI6IHN0cmluZywgZXJyb3JzOiBZQU1MU3ludGF4RXJyb3JbXSB9fVxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKCF0aGlzLnZhbHVlUmFuZ2UgfHwgIXRoaXMuY29udGV4dCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgZXJyb3JzID0gW107XG4gICAgICB2YXIgX3RoaXMkdmFsdWVSYW5nZSA9IHRoaXMudmFsdWVSYW5nZSxcbiAgICAgICAgICBzdGFydCA9IF90aGlzJHZhbHVlUmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgZW5kID0gX3RoaXMkdmFsdWVSYW5nZS5lbmQ7XG4gICAgICB2YXIgX3RoaXMkY29udGV4dCA9IHRoaXMuY29udGV4dCxcbiAgICAgICAgICBpbmRlbnQgPSBfdGhpcyRjb250ZXh0LmluZGVudCxcbiAgICAgICAgICBzcmMgPSBfdGhpcyRjb250ZXh0LnNyYztcbiAgICAgIGlmIChzcmNbZW5kIC0gMV0gIT09IFwiJ1wiKSBlcnJvcnMucHVzaChuZXcgWUFNTFN5bnRheEVycm9yKHRoaXMsIFwiTWlzc2luZyBjbG9zaW5nICdxdW90ZVwiKSk7XG4gICAgICB2YXIgc3RyID0gJyc7XG5cbiAgICAgIGZvciAodmFyIGkgPSBzdGFydCArIDE7IGkgPCBlbmQgLSAxOyArK2kpIHtcbiAgICAgICAgdmFyIGNoID0gc3JjW2ldO1xuXG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpIHtcbiAgICAgICAgICBpZiAoTm9kZS5hdERvY3VtZW50Qm91bmRhcnkoc3JjLCBpICsgMSkpIGVycm9ycy5wdXNoKG5ldyBZQU1MU2VtYW50aWNFcnJvcih0aGlzLCAnRG9jdW1lbnQgYm91bmRhcnkgaW5kaWNhdG9ycyBhcmUgbm90IGFsbG93ZWQgd2l0aGluIHN0cmluZyB2YWx1ZXMnKSk7XG5cbiAgICAgICAgICB2YXIgX05vZGUkZm9sZE5ld2xpbmUgPSBOb2RlLmZvbGROZXdsaW5lKHNyYywgaSwgaW5kZW50KSxcbiAgICAgICAgICAgICAgZm9sZCA9IF9Ob2RlJGZvbGROZXdsaW5lLmZvbGQsXG4gICAgICAgICAgICAgIG9mZnNldCA9IF9Ob2RlJGZvbGROZXdsaW5lLm9mZnNldCxcbiAgICAgICAgICAgICAgZXJyb3IgPSBfTm9kZSRmb2xkTmV3bGluZS5lcnJvcjtcblxuICAgICAgICAgIHN0ciArPSBmb2xkO1xuICAgICAgICAgIGkgPSBvZmZzZXQ7XG4gICAgICAgICAgaWYgKGVycm9yKSBlcnJvcnMucHVzaChuZXcgWUFNTFNlbWFudGljRXJyb3IodGhpcywgJ011bHRpLWxpbmUgc2luZ2xlLXF1b3RlZCBzdHJpbmcgbmVlZHMgdG8gYmUgc3VmZmljaWVudGx5IGluZGVudGVkJykpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoID09PSBcIidcIikge1xuICAgICAgICAgIHN0ciArPSBjaDtcbiAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgaWYgKHNyY1tpXSAhPT0gXCInXCIpIGVycm9ycy5wdXNoKG5ldyBZQU1MU3ludGF4RXJyb3IodGhpcywgJ1VuZXNjYXBlZCBzaW5nbGUgcXVvdGU/IFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uJykpO1xuICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnICcgfHwgY2ggPT09ICdcXHQnKSB7XG4gICAgICAgICAgLy8gdHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlXG4gICAgICAgICAgdmFyIHdzU3RhcnQgPSBpO1xuICAgICAgICAgIHZhciBuZXh0ID0gc3JjW2kgKyAxXTtcblxuICAgICAgICAgIHdoaWxlIChuZXh0ID09PSAnICcgfHwgbmV4dCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIG5leHQgPSBzcmNbaSArIDFdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZXh0ICE9PSAnXFxuJykgc3RyICs9IGkgPiB3c1N0YXJ0ID8gc3JjLnNsaWNlKHdzU3RhcnQsIGkgKyAxKSA6IGNoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciArPSBjaDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXJyb3JzLmxlbmd0aCA+IDAgPyB7XG4gICAgICAgIGVycm9yczogZXJyb3JzLFxuICAgICAgICBzdHI6IHN0clxuICAgICAgfSA6IHN0cjtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJlbmRPZlF1b3RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuZE9mUXVvdGUoc3JjLCBvZmZzZXQpIHtcbiAgICAgIHZhciBjaCA9IHNyY1tvZmZzZXRdO1xuXG4gICAgICB3aGlsZSAoY2gpIHtcbiAgICAgICAgaWYgKGNoID09PSBcIidcIikge1xuICAgICAgICAgIGlmIChzcmNbb2Zmc2V0ICsgMV0gIT09IFwiJ1wiKSBicmVhaztcbiAgICAgICAgICBjaCA9IHNyY1tvZmZzZXQgKz0gMl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2ggPSBzcmNbb2Zmc2V0ICs9IDFdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvZmZzZXQgKyAxO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBRdW90ZVNpbmdsZTtcbn0oTm9kZSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZU5ld05vZGUodHlwZSwgcHJvcHMpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBUeXBlLkFMSUFTOlxuICAgICAgcmV0dXJuIG5ldyBBbGlhcyh0eXBlLCBwcm9wcyk7XG5cbiAgICBjYXNlIFR5cGUuQkxPQ0tfRk9MREVEOlxuICAgIGNhc2UgVHlwZS5CTE9DS19MSVRFUkFMOlxuICAgICAgcmV0dXJuIG5ldyBCbG9ja1ZhbHVlKHR5cGUsIHByb3BzKTtcblxuICAgIGNhc2UgVHlwZS5GTE9XX01BUDpcbiAgICBjYXNlIFR5cGUuRkxPV19TRVE6XG4gICAgICByZXR1cm4gbmV3IEZsb3dDb2xsZWN0aW9uKHR5cGUsIHByb3BzKTtcblxuICAgIGNhc2UgVHlwZS5NQVBfS0VZOlxuICAgIGNhc2UgVHlwZS5NQVBfVkFMVUU6XG4gICAgY2FzZSBUeXBlLlNFUV9JVEVNOlxuICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uSXRlbSh0eXBlLCBwcm9wcyk7XG5cbiAgICBjYXNlIFR5cGUuQ09NTUVOVDpcbiAgICBjYXNlIFR5cGUuUExBSU46XG4gICAgICByZXR1cm4gbmV3IFBsYWluVmFsdWUodHlwZSwgcHJvcHMpO1xuXG4gICAgY2FzZSBUeXBlLlFVT1RFX0RPVUJMRTpcbiAgICAgIHJldHVybiBuZXcgUXVvdGVEb3VibGUodHlwZSwgcHJvcHMpO1xuXG4gICAgY2FzZSBUeXBlLlFVT1RFX1NJTkdMRTpcbiAgICAgIHJldHVybiBuZXcgUXVvdGVTaW5nbGUodHlwZSwgcHJvcHMpO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuXG4gIH1cbn1cbi8qKlxuICogQHBhcmFtIHtib29sZWFufSBhdExpbmVTdGFydCAtIE5vZGUgc3RhcnRzIGF0IGJlZ2lubmluZyBvZiBsaW5lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluRmxvdyAtIHRydWUgaWYgY3VycmVudGx5IGluIGEgZmxvdyBjb250ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGluQ29sbGVjdGlvbiAtIHRydWUgaWYgY3VycmVudGx5IGluIGEgY29sbGVjdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZW50IC0gQ3VycmVudCBsZXZlbCBvZiBpbmRlbnRhdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxpbmVTdGFydCAtIFN0YXJ0IG9mIHRoZSBjdXJyZW50IGxpbmVcbiAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50IC0gVGhlIHBhcmVudCBvZiB0aGUgbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IHNyYyAtIFNvdXJjZSBvZiB0aGUgWUFNTCBkb2N1bWVudFxuICovXG5cblxudmFyIFBhcnNlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIF9jcmVhdGVDbGFzcyhQYXJzZUNvbnRleHQsIG51bGwsIFt7XG4gICAga2V5OiBcInBhcnNlVHlwZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZVR5cGUoc3JjLCBvZmZzZXQsIGluRmxvdykge1xuICAgICAgc3dpdGNoIChzcmNbb2Zmc2V0XSkge1xuICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICByZXR1cm4gVHlwZS5BTElBUztcblxuICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICByZXR1cm4gVHlwZS5CTE9DS19GT0xERUQ7XG5cbiAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgICAgcmV0dXJuIFR5cGUuQkxPQ0tfTElURVJBTDtcblxuICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICByZXR1cm4gVHlwZS5GTE9XX01BUDtcblxuICAgICAgICBjYXNlICdbJzpcbiAgICAgICAgICByZXR1cm4gVHlwZS5GTE9XX1NFUTtcblxuICAgICAgICBjYXNlICc/JzpcbiAgICAgICAgICByZXR1cm4gIWluRmxvdyAmJiBOb2RlLmF0Qmxhbmsoc3JjLCBvZmZzZXQgKyAxLCB0cnVlKSA/IFR5cGUuTUFQX0tFWSA6IFR5cGUuUExBSU47XG5cbiAgICAgICAgY2FzZSAnOic6XG4gICAgICAgICAgcmV0dXJuICFpbkZsb3cgJiYgTm9kZS5hdEJsYW5rKHNyYywgb2Zmc2V0ICsgMSwgdHJ1ZSkgPyBUeXBlLk1BUF9WQUxVRSA6IFR5cGUuUExBSU47XG5cbiAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgcmV0dXJuICFpbkZsb3cgJiYgTm9kZS5hdEJsYW5rKHNyYywgb2Zmc2V0ICsgMSwgdHJ1ZSkgPyBUeXBlLlNFUV9JVEVNIDogVHlwZS5QTEFJTjtcblxuICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgcmV0dXJuIFR5cGUuUVVPVEVfRE9VQkxFO1xuXG4gICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgcmV0dXJuIFR5cGUuUVVPVEVfU0lOR0xFO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIFR5cGUuUExBSU47XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gUGFyc2VDb250ZXh0KCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgb3JpZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICAgIGF0TGluZVN0YXJ0ID0gX3JlZi5hdExpbmVTdGFydCxcbiAgICAgICAgaW5Db2xsZWN0aW9uID0gX3JlZi5pbkNvbGxlY3Rpb24sXG4gICAgICAgIGluRmxvdyA9IF9yZWYuaW5GbG93LFxuICAgICAgICBpbmRlbnQgPSBfcmVmLmluZGVudCxcbiAgICAgICAgbGluZVN0YXJ0ID0gX3JlZi5saW5lU3RhcnQsXG4gICAgICAgIHBhcmVudCA9IF9yZWYucGFyZW50O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBhcnNlQ29udGV4dCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJwYXJzZU5vZGVcIiwgZnVuY3Rpb24gKG92ZXJsYXksIHN0YXJ0KSB7XG4gICAgICBpZiAoTm9kZS5hdERvY3VtZW50Qm91bmRhcnkoX3RoaXMuc3JjLCBzdGFydCkpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGNvbnRleHQgPSBuZXcgUGFyc2VDb250ZXh0KF90aGlzLCBvdmVybGF5KTtcblxuICAgICAgdmFyIF9jb250ZXh0JHBhcnNlUHJvcHMgPSBjb250ZXh0LnBhcnNlUHJvcHMoc3RhcnQpLFxuICAgICAgICAgIHByb3BzID0gX2NvbnRleHQkcGFyc2VQcm9wcy5wcm9wcyxcbiAgICAgICAgICB0eXBlID0gX2NvbnRleHQkcGFyc2VQcm9wcy50eXBlLFxuICAgICAgICAgIHZhbHVlU3RhcnQgPSBfY29udGV4dCRwYXJzZVByb3BzLnZhbHVlU3RhcnQ7XG5cbiAgICAgIHZhciBub2RlID0gY3JlYXRlTmV3Tm9kZSh0eXBlLCBwcm9wcyk7XG4gICAgICB2YXIgb2Zmc2V0ID0gbm9kZS5wYXJzZShjb250ZXh0LCB2YWx1ZVN0YXJ0KTtcbiAgICAgIG5vZGUucmFuZ2UgPSBuZXcgUmFuZ2Uoc3RhcnQsIG9mZnNldCk7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cblxuICAgICAgaWYgKG9mZnNldCA8PSBzdGFydCkge1xuICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBpZiBpdCBkb2VzLCBsZXQncyBtYWtlIHN1cmUgdG8gYXQgbGVhc3RcbiAgICAgICAgLy8gc3RlcCBvbmUgY2hhcmFjdGVyIGZvcndhcmQgdG8gYXZvaWQgYSBidXN5IGxvb3AuXG4gICAgICAgIG5vZGUuZXJyb3IgPSBuZXcgRXJyb3IoXCJOb2RlI3BhcnNlIGNvbnN1bWVkIG5vIGNoYXJhY3RlcnNcIik7XG4gICAgICAgIG5vZGUuZXJyb3IucGFyc2VFbmQgPSBvZmZzZXQ7XG4gICAgICAgIG5vZGUuZXJyb3Iuc291cmNlID0gbm9kZTtcbiAgICAgICAgbm9kZS5yYW5nZS5lbmQgPSBzdGFydCArIDE7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb250ZXh0Lm5vZGVTdGFydHNDb2xsZWN0aW9uKG5vZGUpKSB7XG4gICAgICAgIGlmICghbm9kZS5lcnJvciAmJiAhY29udGV4dC5hdExpbmVTdGFydCAmJiBjb250ZXh0LnBhcmVudC50eXBlID09PSBUeXBlLkRPQ1VNRU5UKSB7XG4gICAgICAgICAgbm9kZS5lcnJvciA9IG5ldyBZQU1MU3ludGF4RXJyb3Iobm9kZSwgJ0Jsb2NrIGNvbGxlY3Rpb24gbXVzdCBub3QgaGF2ZSBwcmVjZWRpbmcgY29udGVudCBoZXJlIChlLmcuIGRpcmVjdGl2ZXMtZW5kIGluZGljYXRvciknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjb2xsZWN0aW9uID0gbmV3IENvbGxlY3Rpb24obm9kZSk7XG4gICAgICAgIG9mZnNldCA9IGNvbGxlY3Rpb24ucGFyc2UobmV3IFBhcnNlQ29udGV4dChjb250ZXh0KSwgb2Zmc2V0KTtcbiAgICAgICAgY29sbGVjdGlvbi5yYW5nZSA9IG5ldyBSYW5nZShzdGFydCwgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hdExpbmVTdGFydCA9IGF0TGluZVN0YXJ0ICE9IG51bGwgPyBhdExpbmVTdGFydCA6IG9yaWcuYXRMaW5lU3RhcnQgfHwgZmFsc2U7XG4gICAgdGhpcy5pbkNvbGxlY3Rpb24gPSBpbkNvbGxlY3Rpb24gIT0gbnVsbCA/IGluQ29sbGVjdGlvbiA6IG9yaWcuaW5Db2xsZWN0aW9uIHx8IGZhbHNlO1xuICAgIHRoaXMuaW5GbG93ID0gaW5GbG93ICE9IG51bGwgPyBpbkZsb3cgOiBvcmlnLmluRmxvdyB8fCBmYWxzZTtcbiAgICB0aGlzLmluZGVudCA9IGluZGVudCAhPSBudWxsID8gaW5kZW50IDogb3JpZy5pbmRlbnQ7XG4gICAgdGhpcy5saW5lU3RhcnQgPSBsaW5lU3RhcnQgIT0gbnVsbCA/IGxpbmVTdGFydCA6IG9yaWcubGluZVN0YXJ0O1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50ICE9IG51bGwgPyBwYXJlbnQgOiBvcmlnLnBhcmVudCB8fCB7fTtcbiAgICB0aGlzLnJvb3QgPSBvcmlnLnJvb3Q7XG4gICAgdGhpcy5zcmMgPSBvcmlnLnNyYztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQYXJzZUNvbnRleHQsIFt7XG4gICAga2V5OiBcIm5vZGVTdGFydHNDb2xsZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5vZGVTdGFydHNDb2xsZWN0aW9uKG5vZGUpIHtcbiAgICAgIHZhciBpbkNvbGxlY3Rpb24gPSB0aGlzLmluQ29sbGVjdGlvbixcbiAgICAgICAgICBpbkZsb3cgPSB0aGlzLmluRmxvdyxcbiAgICAgICAgICBzcmMgPSB0aGlzLnNyYztcbiAgICAgIGlmIChpbkNvbGxlY3Rpb24gfHwgaW5GbG93KSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENvbGxlY3Rpb25JdGVtKSByZXR1cm4gdHJ1ZTsgLy8gY2hlY2sgZm9yIGltcGxpY2l0IGtleVxuXG4gICAgICB2YXIgb2Zmc2V0ID0gbm9kZS5yYW5nZS5lbmQ7XG4gICAgICBpZiAoc3JjW29mZnNldF0gPT09ICdcXG4nIHx8IHNyY1tvZmZzZXQgLSAxXSA9PT0gJ1xcbicpIHJldHVybiBmYWxzZTtcbiAgICAgIG9mZnNldCA9IE5vZGUuZW5kT2ZXaGl0ZVNwYWNlKHNyYywgb2Zmc2V0KTtcbiAgICAgIHJldHVybiBzcmNbb2Zmc2V0XSA9PT0gJzonO1xuICAgIH0gLy8gQW5jaG9yIGFuZCB0YWcgYXJlIGJlZm9yZSB0eXBlLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBub2RlIGltcGxlbWVudGF0aW9uXG4gICAgLy8gY2xhc3M7IGhlbmNlIHRoaXMgaW50ZXJtZWRpYXRlIHN0ZXAuXG5cbiAgfSwge1xuICAgIGtleTogXCJwYXJzZVByb3BzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhcnNlUHJvcHMob2Zmc2V0KSB7XG4gICAgICB2YXIgaW5GbG93ID0gdGhpcy5pbkZsb3csXG4gICAgICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnQsXG4gICAgICAgICAgc3JjID0gdGhpcy5zcmM7XG4gICAgICB2YXIgcHJvcHMgPSBbXTtcbiAgICAgIHZhciBsaW5lSGFzUHJvcHMgPSBmYWxzZTtcbiAgICAgIG9mZnNldCA9IHRoaXMuYXRMaW5lU3RhcnQgPyBOb2RlLmVuZE9mSW5kZW50KHNyYywgb2Zmc2V0KSA6IE5vZGUuZW5kT2ZXaGl0ZVNwYWNlKHNyYywgb2Zmc2V0KTtcbiAgICAgIHZhciBjaCA9IHNyY1tvZmZzZXRdO1xuXG4gICAgICB3aGlsZSAoY2ggPT09IENoYXIuQU5DSE9SIHx8IGNoID09PSBDaGFyLkNPTU1FTlQgfHwgY2ggPT09IENoYXIuVEFHIHx8IGNoID09PSAnXFxuJykge1xuICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgdmFyIGxpbmVTdGFydCA9IG9mZnNldCArIDE7XG4gICAgICAgICAgdmFyIGluRW5kID0gTm9kZS5lbmRPZkluZGVudChzcmMsIGxpbmVTdGFydCk7XG4gICAgICAgICAgdmFyIGluZGVudERpZmYgPSBpbkVuZCAtIChsaW5lU3RhcnQgKyB0aGlzLmluZGVudCk7XG4gICAgICAgICAgdmFyIG5vSW5kaWNhdG9yQXNJbmRlbnQgPSBwYXJlbnQudHlwZSA9PT0gVHlwZS5TRVFfSVRFTSAmJiBwYXJlbnQuY29udGV4dC5hdExpbmVTdGFydDtcbiAgICAgICAgICBpZiAoIU5vZGUubmV4dE5vZGVJc0luZGVudGVkKHNyY1tpbkVuZF0sIGluZGVudERpZmYsICFub0luZGljYXRvckFzSW5kZW50KSkgYnJlYWs7XG4gICAgICAgICAgdGhpcy5hdExpbmVTdGFydCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7XG4gICAgICAgICAgbGluZUhhc1Byb3BzID0gZmFsc2U7XG4gICAgICAgICAgb2Zmc2V0ID0gaW5FbmQ7XG4gICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IENoYXIuQ09NTUVOVCkge1xuICAgICAgICAgIHZhciBlbmQgPSBOb2RlLmVuZE9mTGluZShzcmMsIG9mZnNldCArIDEpO1xuICAgICAgICAgIHByb3BzLnB1c2gobmV3IFJhbmdlKG9mZnNldCwgZW5kKSk7XG4gICAgICAgICAgb2Zmc2V0ID0gZW5kO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBfZW5kID0gTm9kZS5lbmRPZklkZW50aWZpZXIoc3JjLCBvZmZzZXQgKyAxKTtcblxuICAgICAgICAgIGlmIChjaCA9PT0gQ2hhci5UQUcgJiYgc3JjW19lbmRdID09PSAnLCcgJiYgL15bYS16QS1aMC05LV0rXFwuW2EtekEtWjAtOS1dKyxcXGRcXGRcXGRcXGQoLVxcZFxcZCl7MCwyfVxcL1xcUy8udGVzdChzcmMuc2xpY2Uob2Zmc2V0ICsgMSwgX2VuZCArIDEzKSkpIHtcbiAgICAgICAgICAgIC8vIExldCdzIHByZXN1bWUgd2UncmUgZGVhbGluZyB3aXRoIGEgWUFNTCAxLjAgZG9tYWluIHRhZyBoZXJlLCByYXRoZXJcbiAgICAgICAgICAgIC8vIHRoYW4gYW4gZW1wdHkgYnV0ICdmb28uYmFyJyBwcml2YXRlLXRhZ2dlZCBub2RlIGluIGEgZmxvdyBjb2xsZWN0aW9uXG4gICAgICAgICAgICAvLyBmb2xsb3dlZCB3aXRob3V0IHdoaXRlc3BhY2UgYnkgYSBwbGFpbiBzdHJpbmcgc3RhcnRpbmcgd2l0aCBhIHllYXJcbiAgICAgICAgICAgIC8vIG9yIGRhdGUgZGl2aWRlZCBieSBzb21ldGhpbmcuXG4gICAgICAgICAgICBfZW5kID0gTm9kZS5lbmRPZklkZW50aWZpZXIoc3JjLCBfZW5kICsgNSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHJvcHMucHVzaChuZXcgUmFuZ2Uob2Zmc2V0LCBfZW5kKSk7XG4gICAgICAgICAgbGluZUhhc1Byb3BzID0gdHJ1ZTtcbiAgICAgICAgICBvZmZzZXQgPSBOb2RlLmVuZE9mV2hpdGVTcGFjZShzcmMsIF9lbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2ggPSBzcmNbb2Zmc2V0XTtcbiAgICAgIH0gLy8gJy0gJmEgOiBiJyBoYXMgYW4gYW5jaG9yIG9uIGFuIGVtcHR5IG5vZGVcblxuXG4gICAgICBpZiAobGluZUhhc1Byb3BzICYmIGNoID09PSAnOicgJiYgTm9kZS5hdEJsYW5rKHNyYywgb2Zmc2V0ICsgMSwgdHJ1ZSkpIG9mZnNldCAtPSAxO1xuICAgICAgdmFyIHR5cGUgPSBQYXJzZUNvbnRleHQucGFyc2VUeXBlKHNyYywgb2Zmc2V0LCBpbkZsb3cpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB2YWx1ZVN0YXJ0OiBvZmZzZXRcbiAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlcyBhIG5vZGUgZnJvbSB0aGUgc291cmNlXG4gICAgICogQHBhcmFtIHtQYXJzZUNvbnRleHR9IG92ZXJsYXlcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBJbmRleCBvZiBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgZm9yIHRoZSBub2RlXG4gICAgICogQHJldHVybnMgez9Ob2RlfSAtIG51bGwgaWYgYXQgYSBkb2N1bWVudCBib3VuZGFyeVxuICAgICAqL1xuXG4gIH1dKTtcblxuICByZXR1cm4gUGFyc2VDb250ZXh0O1xufSgpO1xuXG4vLyBQdWJsaXNoZWQgYXMgJ3lhbWwvcGFyc2UtY3N0J1xuZnVuY3Rpb24gcGFyc2Uoc3JjKSB7XG4gIHZhciBjciA9IFtdO1xuXG4gIGlmIChzcmMuaW5kZXhPZignXFxyJykgIT09IC0xKSB7XG4gICAgc3JjID0gc3JjLnJlcGxhY2UoL1xcclxcbj8vZywgZnVuY3Rpb24gKG1hdGNoLCBvZmZzZXQpIHtcbiAgICAgIGlmIChtYXRjaC5sZW5ndGggPiAxKSBjci5wdXNoKG9mZnNldCk7XG4gICAgICByZXR1cm4gJ1xcbic7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgZG9jdW1lbnRzID0gW107XG4gIHZhciBvZmZzZXQgPSAwO1xuXG4gIGRvIHtcbiAgICB2YXIgZG9jID0gbmV3IERvY3VtZW50KCk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgUGFyc2VDb250ZXh0KHtcbiAgICAgIHNyYzogc3JjXG4gICAgfSk7XG4gICAgb2Zmc2V0ID0gZG9jLnBhcnNlKGNvbnRleHQsIG9mZnNldCk7XG4gICAgZG9jdW1lbnRzLnB1c2goZG9jKTtcbiAgfSB3aGlsZSAob2Zmc2V0IDwgc3JjLmxlbmd0aCk7XG5cbiAgZG9jdW1lbnRzLnNldE9yaWdSYW5nZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBjci5sZW5ndGg7ICsraSkge1xuICAgICAgY3JbaV0gLT0gaTtcbiAgICB9XG5cbiAgICB2YXIgY3JPZmZzZXQgPSAwO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRvY3VtZW50cy5sZW5ndGg7ICsrX2kpIHtcbiAgICAgIGNyT2Zmc2V0ID0gZG9jdW1lbnRzW19pXS5zZXRPcmlnUmFuZ2VzKGNyLCBjck9mZnNldCk7XG4gICAgfVxuXG4gICAgY3Iuc3BsaWNlKDAsIGNyLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgZG9jdW1lbnRzLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBkb2N1bWVudHMuam9pbignLi4uXFxuJyk7XG4gIH07XG5cbiAgcmV0dXJuIGRvY3VtZW50cztcbn1cblxuZXhwb3J0IHsgcGFyc2UgfTtcbiIsImltcG9ydCB7IGMgYXMgX2NsYXNzQ2FsbENoZWNrLCBqIGFzIF9pbmhlcml0cywgayBhcyBfY3JlYXRlU3VwZXIsIGIgYXMgX2NyZWF0ZUNsYXNzLCBlIGFzIF9kZWZpbmVQcm9wZXJ0eSwgcCBhcyBfYXNzZXJ0VGhpc0luaXRpYWxpemVkLCBhIGFzIF90eXBlb2YsIHEgYXMgX3RvQXJyYXksIFQgYXMgVHlwZSwgXyBhcyBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciwgbCBhcyBfZ2V0LCBtIGFzIF9nZXRQcm90b3R5cGVPZiwgbyBhcyBZQU1MUmVmZXJlbmNlRXJyb3IsIHIgYXMgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4sIGggYXMgX3NsaWNlZFRvQXJyYXksIGcgYXMgWUFNTFNlbWFudGljRXJyb3IsIG4gYXMgZGVmYXVsdFRhZ3MsIGYgYXMgWUFNTFdhcm5pbmcsIEMgYXMgQ2hhciwgWSBhcyBZQU1MU3ludGF4RXJyb3IsIFAgYXMgUGxhaW5WYWx1ZSB9IGZyb20gJy4vUGxhaW5WYWx1ZS1mZjUxNDdjNi5qcyc7XG5cbmZ1bmN0aW9uIGFkZENvbW1lbnRCZWZvcmUoc3RyLCBpbmRlbnQsIGNvbW1lbnQpIHtcbiAgaWYgKCFjb21tZW50KSByZXR1cm4gc3RyO1xuICB2YXIgY2MgPSBjb21tZW50LnJlcGxhY2UoL1tcXHNcXFNdXi9nbSwgXCIkJlwiLmNvbmNhdChpbmRlbnQsIFwiI1wiKSk7XG4gIHJldHVybiBcIiNcIi5jb25jYXQoY2MsIFwiXFxuXCIpLmNvbmNhdChpbmRlbnQpLmNvbmNhdChzdHIpO1xufVxuZnVuY3Rpb24gYWRkQ29tbWVudChzdHIsIGluZGVudCwgY29tbWVudCkge1xuICByZXR1cm4gIWNvbW1lbnQgPyBzdHIgOiBjb21tZW50LmluZGV4T2YoJ1xcbicpID09PSAtMSA/IFwiXCIuY29uY2F0KHN0ciwgXCIgI1wiKS5jb25jYXQoY29tbWVudCkgOiBcIlwiLmNvbmNhdChzdHIsIFwiXFxuXCIpICsgY29tbWVudC5yZXBsYWNlKC9eL2dtLCBcIlwiLmNvbmNhdChpbmRlbnQgfHwgJycsIFwiI1wiKSk7XG59XG5cbnZhciBOb2RlID0gZnVuY3Rpb24gTm9kZSgpIHtcbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE5vZGUpO1xufTtcblxuZnVuY3Rpb24gdG9KU09OKHZhbHVlLCBhcmcsIGN0eCkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoZnVuY3Rpb24gKHYsIGkpIHtcbiAgICByZXR1cm4gdG9KU09OKHYsIFN0cmluZyhpKSwgY3R4KTtcbiAgfSk7XG5cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgYW5jaG9yID0gY3R4ICYmIGN0eC5hbmNob3JzICYmIGN0eC5hbmNob3JzLmdldCh2YWx1ZSk7XG4gICAgaWYgKGFuY2hvcikgY3R4Lm9uQ3JlYXRlID0gZnVuY3Rpb24gKHJlcykge1xuICAgICAgYW5jaG9yLnJlcyA9IHJlcztcbiAgICAgIGRlbGV0ZSBjdHgub25DcmVhdGU7XG4gICAgfTtcbiAgICB2YXIgcmVzID0gdmFsdWUudG9KU09OKGFyZywgY3R4KTtcbiAgICBpZiAoYW5jaG9yICYmIGN0eC5vbkNyZWF0ZSkgY3R4Lm9uQ3JlYXRlKHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGlmICgoIWN0eCB8fCAhY3R4LmtlZXApICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBTY2FsYXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhTY2FsYXIsIF9Ob2RlKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFNjYWxhcik7XG5cbiAgZnVuY3Rpb24gU2NhbGFyKHZhbHVlKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFNjYWxhcik7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuICAgIF90aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFNjYWxhciwgW3tcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTiQxKGFyZywgY3R4KSB7XG4gICAgICByZXR1cm4gY3R4ICYmIGN0eC5rZWVwID8gdGhpcy52YWx1ZSA6IHRvSlNPTih0aGlzLnZhbHVlLCBhcmcsIGN0eCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIFN0cmluZyh0aGlzLnZhbHVlKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2NhbGFyO1xufShOb2RlKTtcblxuZnVuY3Rpb24gY29sbGVjdGlvbkZyb21QYXRoKHNjaGVtYSwgcGF0aCwgdmFsdWUpIHtcbiAgdmFyIHYgPSB2YWx1ZTtcblxuICBmb3IgKHZhciBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgIHZhciBrID0gcGF0aFtpXTtcbiAgICB2YXIgbyA9IE51bWJlci5pc0ludGVnZXIoaykgJiYgayA+PSAwID8gW10gOiB7fTtcbiAgICBvW2tdID0gdjtcbiAgICB2ID0gbztcbiAgfVxuXG4gIHJldHVybiBzY2hlbWEuY3JlYXRlTm9kZSh2LCBmYWxzZSk7XG59IC8vIG51bGwsIHVuZGVmaW5lZCwgb3IgYW4gZW1wdHkgbm9uLXN0cmluZyBpdGVyYWJsZSAoZS5nLiBbXSlcblxuXG52YXIgaXNFbXB0eVBhdGggPSBmdW5jdGlvbiBpc0VtcHR5UGF0aChwYXRoKSB7XG4gIHJldHVybiBwYXRoID09IG51bGwgfHwgX3R5cGVvZihwYXRoKSA9PT0gJ29iamVjdCcgJiYgcGF0aFtTeW1ib2wuaXRlcmF0b3JdKCkubmV4dCgpLmRvbmU7XG59O1xudmFyIENvbGxlY3Rpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Ob2RlKSB7XG4gIF9pbmhlcml0cyhDb2xsZWN0aW9uLCBfTm9kZSk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihDb2xsZWN0aW9uKTtcblxuICBmdW5jdGlvbiBDb2xsZWN0aW9uKHNjaGVtYSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb2xsZWN0aW9uKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaXRlbXNcIiwgW10pO1xuXG4gICAgX3RoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDb2xsZWN0aW9uLCBbe1xuICAgIGtleTogXCJhZGRJblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRJbihwYXRoLCB2YWx1ZSkge1xuICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKSB0aGlzLmFkZCh2YWx1ZSk7ZWxzZSB7XG4gICAgICAgIHZhciBfcGF0aCA9IF90b0FycmF5KHBhdGgpLFxuICAgICAgICAgICAga2V5ID0gX3BhdGhbMF0sXG4gICAgICAgICAgICByZXN0ID0gX3BhdGguc2xpY2UoMSk7XG5cbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIG5vZGUuYWRkSW4ocmVzdCwgdmFsdWUpO2Vsc2UgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnNjaGVtYSkgdGhpcy5zZXQoa2V5LCBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIHJlc3QsIHZhbHVlKSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBZQU1MIGNvbGxlY3Rpb24gYXQgXCIuY29uY2F0KGtleSwgXCIuIFJlbWFpbmluZyBwYXRoOiBcIikuY29uY2F0KHJlc3QpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlSW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVsZXRlSW4oX3JlZikge1xuICAgICAgdmFyIF9yZWYyID0gX3RvQXJyYXkoX3JlZiksXG4gICAgICAgICAga2V5ID0gX3JlZjJbMF0sXG4gICAgICAgICAgcmVzdCA9IF9yZWYyLnNsaWNlKDEpO1xuXG4gICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSByZXR1cm4gbm9kZS5kZWxldGVJbihyZXN0KTtlbHNlIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIFlBTUwgY29sbGVjdGlvbiBhdCBcIi5jb25jYXQoa2V5LCBcIi4gUmVtYWluaW5nIHBhdGg6IFwiKS5jb25jYXQocmVzdCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRJblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRJbihfcmVmMywga2VlcFNjYWxhcikge1xuICAgICAgdmFyIF9yZWY0ID0gX3RvQXJyYXkoX3JlZjMpLFxuICAgICAgICAgIGtleSA9IF9yZWY0WzBdLFxuICAgICAgICAgIHJlc3QgPSBfcmVmNC5zbGljZSgxKTtcblxuICAgICAgdmFyIG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSByZXR1cm4gIWtlZXBTY2FsYXIgJiYgbm9kZSBpbnN0YW5jZW9mIFNjYWxhciA/IG5vZGUudmFsdWUgOiBub2RlO2Vsc2UgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uID8gbm9kZS5nZXRJbihyZXN0LCBrZWVwU2NhbGFyKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzQWxsTnVsbFZhbHVlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXNBbGxOdWxsVmFsdWVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZXZlcnkoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUudHlwZSAhPT0gJ1BBSVInKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBuID0gbm9kZS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIG4gPT0gbnVsbCB8fCBuIGluc3RhbmNlb2YgU2NhbGFyICYmIG4udmFsdWUgPT0gbnVsbCAmJiAhbi5jb21tZW50QmVmb3JlICYmICFuLmNvbW1lbnQgJiYgIW4udGFnO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc0luXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0luKF9yZWY1KSB7XG4gICAgICB2YXIgX3JlZjYgPSBfdG9BcnJheShfcmVmNSksXG4gICAgICAgICAga2V5ID0gX3JlZjZbMF0sXG4gICAgICAgICAgcmVzdCA9IF9yZWY2LnNsaWNlKDEpO1xuXG4gICAgICBpZiAocmVzdC5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLmhhcyhrZXkpO1xuICAgICAgdmFyIG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uID8gbm9kZS5oYXNJbihyZXN0KSA6IGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRJblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRJbihfcmVmNywgdmFsdWUpIHtcbiAgICAgIHZhciBfcmVmOCA9IF90b0FycmF5KF9yZWY3KSxcbiAgICAgICAgICBrZXkgPSBfcmVmOFswXSxcbiAgICAgICAgICByZXN0ID0gX3JlZjguc2xpY2UoMSk7XG5cbiAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSBub2RlLnNldEluKHJlc3QsIHZhbHVlKTtlbHNlIGlmIChub2RlID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY2hlbWEpIHRoaXMuc2V0KGtleSwgY29sbGVjdGlvbkZyb21QYXRoKHRoaXMuc2NoZW1hLCByZXN0LCB2YWx1ZSkpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgWUFNTCBjb2xsZWN0aW9uIGF0IFwiLmNvbmNhdChrZXksIFwiLiBSZW1haW5pbmcgcGF0aDogXCIpLmNvbmNhdChyZXN0KSk7XG4gICAgICB9XG4gICAgfSAvLyBvdmVycmlkZGVuIGluIGltcGxlbWVudGF0aW9uc1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInRvSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoY3R4LCBfcmVmOSwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBibG9ja0l0ZW0gPSBfcmVmOS5ibG9ja0l0ZW0sXG4gICAgICAgICAgZmxvd0NoYXJzID0gX3JlZjkuZmxvd0NoYXJzLFxuICAgICAgICAgIGlzTWFwID0gX3JlZjkuaXNNYXAsXG4gICAgICAgICAgaXRlbUluZGVudCA9IF9yZWY5Lml0ZW1JbmRlbnQ7XG4gICAgICB2YXIgX2N0eCA9IGN0eCxcbiAgICAgICAgICBpbmRlbnQgPSBfY3R4LmluZGVudCxcbiAgICAgICAgICBpbmRlbnRTdGVwID0gX2N0eC5pbmRlbnRTdGVwLFxuICAgICAgICAgIHN0cmluZ2lmeSA9IF9jdHguc3RyaW5naWZ5O1xuICAgICAgdmFyIGluRmxvdyA9IHRoaXMudHlwZSA9PT0gVHlwZS5GTE9XX01BUCB8fCB0aGlzLnR5cGUgPT09IFR5cGUuRkxPV19TRVEgfHwgY3R4LmluRmxvdztcbiAgICAgIGlmIChpbkZsb3cpIGl0ZW1JbmRlbnQgKz0gaW5kZW50U3RlcDtcbiAgICAgIHZhciBhbGxOdWxsVmFsdWVzID0gaXNNYXAgJiYgdGhpcy5oYXNBbGxOdWxsVmFsdWVzKCk7XG4gICAgICBjdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHtcbiAgICAgICAgYWxsTnVsbFZhbHVlczogYWxsTnVsbFZhbHVlcyxcbiAgICAgICAgaW5kZW50OiBpdGVtSW5kZW50LFxuICAgICAgICBpbkZsb3c6IGluRmxvdyxcbiAgICAgICAgdHlwZTogbnVsbFxuICAgICAgfSk7XG4gICAgICB2YXIgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgICB2YXIgaGFzSXRlbVdpdGhOZXdMaW5lID0gZmFsc2U7XG4gICAgICB2YXIgbm9kZXMgPSB0aGlzLml0ZW1zLnJlZHVjZShmdW5jdGlvbiAobm9kZXMsIGl0ZW0sIGkpIHtcbiAgICAgICAgdmFyIGNvbW1lbnQ7XG5cbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICBpZiAoIWNob21wS2VlcCAmJiBpdGVtLnNwYWNlQmVmb3JlKSBub2Rlcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdjb21tZW50JyxcbiAgICAgICAgICAgIHN0cjogJydcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXRlbS5jb21tZW50QmVmb3JlKSBpdGVtLmNvbW1lbnRCZWZvcmUubWF0Y2goL14uKiQvZ20pLmZvckVhY2goZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiAnY29tbWVudCcsXG4gICAgICAgICAgICAgIHN0cjogXCIjXCIuY29uY2F0KGxpbmUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXRlbS5jb21tZW50KSBjb21tZW50ID0gaXRlbS5jb21tZW50O1xuICAgICAgICAgIGlmIChpbkZsb3cgJiYgKCFjaG9tcEtlZXAgJiYgaXRlbS5zcGFjZUJlZm9yZSB8fCBpdGVtLmNvbW1lbnRCZWZvcmUgfHwgaXRlbS5jb21tZW50IHx8IGl0ZW0ua2V5ICYmIChpdGVtLmtleS5jb21tZW50QmVmb3JlIHx8IGl0ZW0ua2V5LmNvbW1lbnQpIHx8IGl0ZW0udmFsdWUgJiYgKGl0ZW0udmFsdWUuY29tbWVudEJlZm9yZSB8fCBpdGVtLnZhbHVlLmNvbW1lbnQpKSkgaGFzSXRlbVdpdGhOZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNob21wS2VlcCA9IGZhbHNlO1xuICAgICAgICB2YXIgc3RyID0gc3RyaW5naWZ5KGl0ZW0sIGN0eCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb21tZW50ID0gbnVsbDtcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjaG9tcEtlZXAgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGluRmxvdyAmJiAhaGFzSXRlbVdpdGhOZXdMaW5lICYmIHN0ci5pbmNsdWRlcygnXFxuJykpIGhhc0l0ZW1XaXRoTmV3TGluZSA9IHRydWU7XG4gICAgICAgIGlmIChpbkZsb3cgJiYgaSA8IF90aGlzMi5pdGVtcy5sZW5ndGggLSAxKSBzdHIgKz0gJywnO1xuICAgICAgICBzdHIgPSBhZGRDb21tZW50KHN0ciwgaXRlbUluZGVudCwgY29tbWVudCk7XG4gICAgICAgIGlmIChjaG9tcEtlZXAgJiYgKGNvbW1lbnQgfHwgaW5GbG93KSkgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdpdGVtJyxcbiAgICAgICAgICBzdHI6IHN0clxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgICAgfSwgW10pO1xuICAgICAgdmFyIHN0cjtcblxuICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzdHIgPSBmbG93Q2hhcnMuc3RhcnQgKyBmbG93Q2hhcnMuZW5kO1xuICAgICAgfSBlbHNlIGlmIChpbkZsb3cpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gZmxvd0NoYXJzLnN0YXJ0LFxuICAgICAgICAgICAgZW5kID0gZmxvd0NoYXJzLmVuZDtcbiAgICAgICAgdmFyIHN0cmluZ3MgPSBub2Rlcy5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICByZXR1cm4gbi5zdHI7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChoYXNJdGVtV2l0aE5ld0xpbmUgfHwgc3RyaW5ncy5yZWR1Y2UoZnVuY3Rpb24gKHN1bSwgc3RyKSB7XG4gICAgICAgICAgcmV0dXJuIHN1bSArIHN0ci5sZW5ndGggKyAyO1xuICAgICAgICB9LCAyKSA+IENvbGxlY3Rpb24ubWF4Rmxvd1N0cmluZ1NpbmdsZUxpbmVMZW5ndGgpIHtcbiAgICAgICAgICBzdHIgPSBzdGFydDtcblxuICAgICAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzdHJpbmdzKSxcbiAgICAgICAgICAgICAgX3N0ZXA7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgdmFyIHMgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgc3RyICs9IHMgPyBcIlxcblwiLmNvbmNhdChpbmRlbnRTdGVwKS5jb25jYXQoaW5kZW50KS5jb25jYXQocykgOiAnXFxuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3RyICs9IFwiXFxuXCIuY29uY2F0KGluZGVudCkuY29uY2F0KGVuZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gXCJcIi5jb25jYXQoc3RhcnQsIFwiIFwiKS5jb25jYXQoc3RyaW5ncy5qb2luKCcgJyksIFwiIFwiKS5jb25jYXQoZW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIF9zdHJpbmdzID0gbm9kZXMubWFwKGJsb2NrSXRlbSk7XG5cbiAgICAgICAgc3RyID0gX3N0cmluZ3Muc2hpZnQoKTtcblxuICAgICAgICB2YXIgX2l0ZXJhdG9yMiA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKF9zdHJpbmdzKSxcbiAgICAgICAgICAgIF9zdGVwMjtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgICB2YXIgX3MgPSBfc3RlcDIudmFsdWU7XG4gICAgICAgICAgICBzdHIgKz0gX3MgPyBcIlxcblwiLmNvbmNhdChpbmRlbnQpLmNvbmNhdChfcykgOiAnXFxuJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbW1lbnQpIHtcbiAgICAgICAgc3RyICs9ICdcXG4nICsgdGhpcy5jb21tZW50LnJlcGxhY2UoL14vZ20sIFwiXCIuY29uY2F0KGluZGVudCwgXCIjXCIpKTtcbiAgICAgICAgaWYgKG9uQ29tbWVudCkgb25Db21tZW50KCk7XG4gICAgICB9IGVsc2UgaWYgKGNob21wS2VlcCAmJiBvbkNob21wS2VlcCkgb25DaG9tcEtlZXAoKTtcblxuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29sbGVjdGlvbjtcbn0oTm9kZSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShDb2xsZWN0aW9uLCBcIm1heEZsb3dTdHJpbmdTaW5nbGVMaW5lTGVuZ3RoXCIsIDYwKTtcblxuZnVuY3Rpb24gYXNJdGVtSW5kZXgoa2V5KSB7XG4gIHZhciBpZHggPSBrZXkgaW5zdGFuY2VvZiBTY2FsYXIgPyBrZXkudmFsdWUgOiBrZXk7XG4gIGlmIChpZHggJiYgdHlwZW9mIGlkeCA9PT0gJ3N0cmluZycpIGlkeCA9IE51bWJlcihpZHgpO1xuICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihpZHgpICYmIGlkeCA+PSAwID8gaWR4IDogbnVsbDtcbn1cblxudmFyIFlBTUxTZXEgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db2xsZWN0aW9uKSB7XG4gIF9pbmhlcml0cyhZQU1MU2VxLCBfQ29sbGVjdGlvbik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihZQU1MU2VxKTtcblxuICBmdW5jdGlvbiBZQU1MU2VxKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBZQU1MU2VxKTtcblxuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhZQU1MU2VxLCBbe1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICB0aGlzLml0ZW1zLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZWxldGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlbGV0ZShrZXkpIHtcbiAgICAgIHZhciBpZHggPSBhc0l0ZW1JbmRleChrZXkpO1xuICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKSByZXR1cm4gZmFsc2U7XG4gICAgICB2YXIgZGVsID0gdGhpcy5pdGVtcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIHJldHVybiBkZWwubGVuZ3RoID4gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgIHZhciBpZHggPSBhc0l0ZW1JbmRleChrZXkpO1xuICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgdmFyIGl0ID0gdGhpcy5pdGVtc1tpZHhdO1xuICAgICAgcmV0dXJuICFrZWVwU2NhbGFyICYmIGl0IGluc3RhbmNlb2YgU2NhbGFyID8gaXQudmFsdWUgOiBpdDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgIHZhciBpZHggPSBhc0l0ZW1JbmRleChrZXkpO1xuICAgICAgcmV0dXJuIHR5cGVvZiBpZHggPT09ICdudW1iZXInICYmIGlkeCA8IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBpZHggPSBhc0l0ZW1JbmRleChrZXkpO1xuICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICdudW1iZXInKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBhIHZhbGlkIGluZGV4LCBub3QgXCIuY29uY2F0KGtleSwgXCIuXCIpKTtcbiAgICAgIHRoaXMuaXRlbXNbaWR4XSA9IHZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OJDEoXywgY3R4KSB7XG4gICAgICB2YXIgc2VxID0gW107XG4gICAgICBpZiAoY3R4ICYmIGN0eC5vbkNyZWF0ZSkgY3R4Lm9uQ3JlYXRlKHNlcSk7XG4gICAgICB2YXIgaSA9IDA7XG5cbiAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLml0ZW1zKSxcbiAgICAgICAgICBfc3RlcDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgaXRlbSA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIHNlcS5wdXNoKHRvSlNPTihpdGVtLCBTdHJpbmcoaSsrKSwgY3R4KSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlcTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICBpZiAoIWN0eCkgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mKFlBTUxTZXEucHJvdG90eXBlKSwgXCJ0b1N0cmluZ1wiLCB0aGlzKS5jYWxsKHRoaXMsIGN0eCwge1xuICAgICAgICBibG9ja0l0ZW06IGZ1bmN0aW9uIGJsb2NrSXRlbShuKSB7XG4gICAgICAgICAgcmV0dXJuIG4udHlwZSA9PT0gJ2NvbW1lbnQnID8gbi5zdHIgOiBcIi0gXCIuY29uY2F0KG4uc3RyKTtcbiAgICAgICAgfSxcbiAgICAgICAgZmxvd0NoYXJzOiB7XG4gICAgICAgICAgc3RhcnQ6ICdbJyxcbiAgICAgICAgICBlbmQ6ICddJ1xuICAgICAgICB9LFxuICAgICAgICBpc01hcDogZmFsc2UsXG4gICAgICAgIGl0ZW1JbmRlbnQ6IChjdHguaW5kZW50IHx8ICcnKSArICcgICdcbiAgICAgIH0sIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBZQU1MU2VxO1xufShDb2xsZWN0aW9uKTtcblxudmFyIHN0cmluZ2lmeUtleSA9IGZ1bmN0aW9uIHN0cmluZ2lmeUtleShrZXksIGpzS2V5LCBjdHgpIHtcbiAgaWYgKGpzS2V5ID09PSBudWxsKSByZXR1cm4gJyc7XG4gIGlmIChfdHlwZW9mKGpzS2V5KSAhPT0gJ29iamVjdCcpIHJldHVybiBTdHJpbmcoanNLZXkpO1xuICBpZiAoa2V5IGluc3RhbmNlb2YgTm9kZSAmJiBjdHggJiYgY3R4LmRvYykgcmV0dXJuIGtleS50b1N0cmluZyh7XG4gICAgYW5jaG9yczoge30sXG4gICAgZG9jOiBjdHguZG9jLFxuICAgIGluZGVudDogJycsXG4gICAgaW5kZW50U3RlcDogY3R4LmluZGVudFN0ZXAsXG4gICAgaW5GbG93OiB0cnVlLFxuICAgIGluU3RyaW5naWZ5S2V5OiB0cnVlLFxuICAgIHN0cmluZ2lmeTogY3R4LnN0cmluZ2lmeVxuICB9KTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzS2V5KTtcbn07XG5cbnZhciBQYWlyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTm9kZSkge1xuICBfaW5oZXJpdHMoUGFpciwgX05vZGUpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoUGFpcik7XG5cbiAgZnVuY3Rpb24gUGFpcihrZXkpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUGFpcik7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuICAgIF90aGlzLmtleSA9IGtleTtcbiAgICBfdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIF90aGlzLnR5cGUgPSBQYWlyLlR5cGUuUEFJUjtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUGFpciwgW3tcbiAgICBrZXk6IFwiYWRkVG9KU01hcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRUb0pTTWFwKGN0eCwgbWFwKSB7XG4gICAgICB2YXIga2V5ID0gdG9KU09OKHRoaXMua2V5LCAnJywgY3R4KTtcblxuICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICB2YXIgdmFsdWUgPSB0b0pTT04odGhpcy52YWx1ZSwga2V5LCBjdHgpO1xuICAgICAgICBtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChtYXAgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgbWFwLmFkZChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHN0cmluZ0tleSA9IHN0cmluZ2lmeUtleSh0aGlzLmtleSwga2V5LCBjdHgpO1xuICAgICAgICBtYXBbc3RyaW5nS2V5XSA9IHRvSlNPTih0aGlzLnZhbHVlLCBzdHJpbmdLZXksIGN0eCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvSlNPTlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b0pTT04oXywgY3R4KSB7XG4gICAgICB2YXIgcGFpciA9IGN0eCAmJiBjdHgubWFwQXNNYXAgPyBuZXcgTWFwKCkgOiB7fTtcbiAgICAgIHJldHVybiB0aGlzLmFkZFRvSlNNYXAoY3R4LCBwYWlyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICBpZiAoIWN0eCB8fCAhY3R4LmRvYykgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgICAgdmFyIF9jdHgkZG9jJG9wdGlvbnMgPSBjdHguZG9jLm9wdGlvbnMsXG4gICAgICAgICAgaW5kZW50U2l6ZSA9IF9jdHgkZG9jJG9wdGlvbnMuaW5kZW50LFxuICAgICAgICAgIGluZGVudFNlcSA9IF9jdHgkZG9jJG9wdGlvbnMuaW5kZW50U2VxLFxuICAgICAgICAgIHNpbXBsZUtleXMgPSBfY3R4JGRvYyRvcHRpb25zLnNpbXBsZUtleXM7XG4gICAgICB2YXIga2V5ID0gdGhpcy5rZXksXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgdmFyIGtleUNvbW1lbnQgPSBrZXkgaW5zdGFuY2VvZiBOb2RlICYmIGtleS5jb21tZW50O1xuXG4gICAgICBpZiAoc2ltcGxlS2V5cykge1xuICAgICAgICBpZiAoa2V5Q29tbWVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2l0aCBzaW1wbGUga2V5cywga2V5IG5vZGVzIGNhbm5vdCBoYXZlIGNvbW1lbnRzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5IGluc3RhbmNlb2YgQ29sbGVjdGlvbikge1xuICAgICAgICAgIHZhciBtc2cgPSAnV2l0aCBzaW1wbGUga2V5cywgY29sbGVjdGlvbiBjYW5ub3QgYmUgdXNlZCBhcyBhIGtleSB2YWx1ZSc7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGV4cGxpY2l0S2V5ID0gIXNpbXBsZUtleXMgJiYgKCFrZXkgfHwga2V5Q29tbWVudCB8fCBrZXkgaW5zdGFuY2VvZiBDb2xsZWN0aW9uIHx8IGtleS50eXBlID09PSBUeXBlLkJMT0NLX0ZPTERFRCB8fCBrZXkudHlwZSA9PT0gVHlwZS5CTE9DS19MSVRFUkFMKTtcbiAgICAgIHZhciBfY3R4ID0gY3R4LFxuICAgICAgICAgIGRvYyA9IF9jdHguZG9jLFxuICAgICAgICAgIGluZGVudCA9IF9jdHguaW5kZW50LFxuICAgICAgICAgIGluZGVudFN0ZXAgPSBfY3R4LmluZGVudFN0ZXAsXG4gICAgICAgICAgc3RyaW5naWZ5ID0gX2N0eC5zdHJpbmdpZnk7XG4gICAgICBjdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHtcbiAgICAgICAgaW1wbGljaXRLZXk6ICFleHBsaWNpdEtleSxcbiAgICAgICAgaW5kZW50OiBpbmRlbnQgKyBpbmRlbnRTdGVwXG4gICAgICB9KTtcbiAgICAgIHZhciBjaG9tcEtlZXAgPSBmYWxzZTtcbiAgICAgIHZhciBzdHIgPSBzdHJpbmdpZnkoa2V5LCBjdHgsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGtleUNvbW1lbnQgPSBudWxsO1xuICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY2hvbXBLZWVwID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgc3RyID0gYWRkQ29tbWVudChzdHIsIGN0eC5pbmRlbnQsIGtleUNvbW1lbnQpO1xuXG4gICAgICBpZiAoY3R4LmFsbE51bGxWYWx1ZXMgJiYgIXNpbXBsZUtleXMpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tbWVudCkge1xuICAgICAgICAgIHN0ciA9IGFkZENvbW1lbnQoc3RyLCBjdHguaW5kZW50LCB0aGlzLmNvbW1lbnQpO1xuICAgICAgICAgIGlmIChvbkNvbW1lbnQpIG9uQ29tbWVudCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGNob21wS2VlcCAmJiAha2V5Q29tbWVudCAmJiBvbkNob21wS2VlcCkgb25DaG9tcEtlZXAoKTtcblxuICAgICAgICByZXR1cm4gY3R4LmluRmxvdyA/IHN0ciA6IFwiPyBcIi5jb25jYXQoc3RyKTtcbiAgICAgIH1cblxuICAgICAgc3RyID0gZXhwbGljaXRLZXkgPyBcIj8gXCIuY29uY2F0KHN0ciwgXCJcXG5cIikuY29uY2F0KGluZGVudCwgXCI6XCIpIDogXCJcIi5jb25jYXQoc3RyLCBcIjpcIik7XG5cbiAgICAgIGlmICh0aGlzLmNvbW1lbnQpIHtcbiAgICAgICAgLy8gZXhwZWN0ZWQgKGJ1dCBub3Qgc3RyaWN0bHkgcmVxdWlyZWQpIHRvIGJlIGEgc2luZ2xlLWxpbmUgY29tbWVudFxuICAgICAgICBzdHIgPSBhZGRDb21tZW50KHN0ciwgY3R4LmluZGVudCwgdGhpcy5jb21tZW50KTtcbiAgICAgICAgaWYgKG9uQ29tbWVudCkgb25Db21tZW50KCk7XG4gICAgICB9XG5cbiAgICAgIHZhciB2Y2IgPSAnJztcbiAgICAgIHZhciB2YWx1ZUNvbW1lbnQgPSBudWxsO1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBOb2RlKSB7XG4gICAgICAgIGlmICh2YWx1ZS5zcGFjZUJlZm9yZSkgdmNiID0gJ1xcbic7XG5cbiAgICAgICAgaWYgKHZhbHVlLmNvbW1lbnRCZWZvcmUpIHtcbiAgICAgICAgICB2YXIgY3MgPSB2YWx1ZS5jb21tZW50QmVmb3JlLnJlcGxhY2UoL14vZ20sIFwiXCIuY29uY2F0KGN0eC5pbmRlbnQsIFwiI1wiKSk7XG4gICAgICAgICAgdmNiICs9IFwiXFxuXCIuY29uY2F0KGNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlQ29tbWVudCA9IHZhbHVlLmNvbW1lbnQ7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIF90eXBlb2YodmFsdWUpID09PSAnb2JqZWN0Jykge1xuICAgICAgICB2YWx1ZSA9IGRvYy5zY2hlbWEuY3JlYXRlTm9kZSh2YWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIGN0eC5pbXBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgaWYgKCFleHBsaWNpdEtleSAmJiAhdGhpcy5jb21tZW50ICYmIHZhbHVlIGluc3RhbmNlb2YgU2NhbGFyKSBjdHguaW5kZW50QXRTdGFydCA9IHN0ci5sZW5ndGggKyAxO1xuICAgICAgY2hvbXBLZWVwID0gZmFsc2U7XG5cbiAgICAgIGlmICghaW5kZW50U2VxICYmIGluZGVudFNpemUgPj0gMiAmJiAhY3R4LmluRmxvdyAmJiAhZXhwbGljaXRLZXkgJiYgdmFsdWUgaW5zdGFuY2VvZiBZQU1MU2VxICYmIHZhbHVlLnR5cGUgIT09IFR5cGUuRkxPV19TRVEgJiYgIXZhbHVlLnRhZyAmJiAhZG9jLmFuY2hvcnMuZ2V0TmFtZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gSWYgaW5kZW50U2VxID09PSBmYWxzZSwgY29uc2lkZXIgJy0gJyBhcyBwYXJ0IG9mIGluZGVudGF0aW9uIHdoZXJlIHBvc3NpYmxlXG4gICAgICAgIGN0eC5pbmRlbnQgPSBjdHguaW5kZW50LnN1YnN0cigyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlU3RyID0gc3RyaW5naWZ5KHZhbHVlLCBjdHgsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlQ29tbWVudCA9IG51bGw7XG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBjaG9tcEtlZXAgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgICB2YXIgd3MgPSAnICc7XG5cbiAgICAgIGlmICh2Y2IgfHwgdGhpcy5jb21tZW50KSB7XG4gICAgICAgIHdzID0gXCJcIi5jb25jYXQodmNiLCBcIlxcblwiKS5jb25jYXQoY3R4LmluZGVudCk7XG4gICAgICB9IGVsc2UgaWYgKCFleHBsaWNpdEtleSAmJiB2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHtcbiAgICAgICAgdmFyIGZsb3cgPSB2YWx1ZVN0clswXSA9PT0gJ1snIHx8IHZhbHVlU3RyWzBdID09PSAneyc7XG4gICAgICAgIGlmICghZmxvdyB8fCB2YWx1ZVN0ci5pbmNsdWRlcygnXFxuJykpIHdzID0gXCJcXG5cIi5jb25jYXQoY3R4LmluZGVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaG9tcEtlZXAgJiYgIXZhbHVlQ29tbWVudCAmJiBvbkNob21wS2VlcCkgb25DaG9tcEtlZXAoKTtcbiAgICAgIHJldHVybiBhZGRDb21tZW50KHN0ciArIHdzICsgdmFsdWVTdHIsIGN0eC5pbmRlbnQsIHZhbHVlQ29tbWVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbW1lbnRCZWZvcmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmtleSBpbnN0YW5jZW9mIE5vZGUgPyB0aGlzLmtleS5jb21tZW50QmVmb3JlIDogdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoY2IpIHtcbiAgICAgIGlmICh0aGlzLmtleSA9PSBudWxsKSB0aGlzLmtleSA9IG5ldyBTY2FsYXIobnVsbCk7XG4gICAgICBpZiAodGhpcy5rZXkgaW5zdGFuY2VvZiBOb2RlKSB0aGlzLmtleS5jb21tZW50QmVmb3JlID0gY2I7ZWxzZSB7XG4gICAgICAgIHZhciBtc2cgPSAnUGFpci5jb21tZW50QmVmb3JlIGlzIGFuIGFsaWFzIGZvciBQYWlyLmtleS5jb21tZW50QmVmb3JlLiBUbyBzZXQgaXQsIHRoZSBrZXkgbXVzdCBiZSBhIE5vZGUuJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBhaXI7XG59KE5vZGUpO1xuXG5fZGVmaW5lUHJvcGVydHkoUGFpciwgXCJUeXBlXCIsIHtcbiAgUEFJUjogJ1BBSVInLFxuICBNRVJHRV9QQUlSOiAnTUVSR0VfUEFJUidcbn0pO1xuXG52YXIgZ2V0QWxpYXNDb3VudCA9IGZ1bmN0aW9uIGdldEFsaWFzQ291bnQobm9kZSwgYW5jaG9ycykge1xuICBpZiAobm9kZSBpbnN0YW5jZW9mIEFsaWFzKSB7XG4gICAgdmFyIGFuY2hvciA9IGFuY2hvcnMuZ2V0KG5vZGUuc291cmNlKTtcbiAgICByZXR1cm4gYW5jaG9yLmNvdW50ICogYW5jaG9yLmFsaWFzQ291bnQ7XG4gIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHtcbiAgICB2YXIgY291bnQgPSAwO1xuXG4gICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG5vZGUuaXRlbXMpLFxuICAgICAgICBfc3RlcDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIgaXRlbSA9IF9zdGVwLnZhbHVlO1xuICAgICAgICB2YXIgYyA9IGdldEFsaWFzQ291bnQoaXRlbSwgYW5jaG9ycyk7XG4gICAgICAgIGlmIChjID4gY291bnQpIGNvdW50ID0gYztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50O1xuICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBQYWlyKSB7XG4gICAgdmFyIGtjID0gZ2V0QWxpYXNDb3VudChub2RlLmtleSwgYW5jaG9ycyk7XG4gICAgdmFyIHZjID0gZ2V0QWxpYXNDb3VudChub2RlLnZhbHVlLCBhbmNob3JzKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoa2MsIHZjKTtcbiAgfVxuXG4gIHJldHVybiAxO1xufTtcblxudmFyIEFsaWFzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfTm9kZSkge1xuICBfaW5oZXJpdHMoQWxpYXMsIF9Ob2RlKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEFsaWFzKTtcblxuICBfY3JlYXRlQ2xhc3MoQWxpYXMsIG51bGwsIFt7XG4gICAga2V5OiBcInN0cmluZ2lmeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdHJpbmdpZnkoX3JlZiwgX3JlZjIpIHtcbiAgICAgIHZhciByYW5nZSA9IF9yZWYucmFuZ2UsXG4gICAgICAgICAgc291cmNlID0gX3JlZi5zb3VyY2U7XG4gICAgICB2YXIgYW5jaG9ycyA9IF9yZWYyLmFuY2hvcnMsXG4gICAgICAgICAgZG9jID0gX3JlZjIuZG9jLFxuICAgICAgICAgIGltcGxpY2l0S2V5ID0gX3JlZjIuaW1wbGljaXRLZXksXG4gICAgICAgICAgaW5TdHJpbmdpZnlLZXkgPSBfcmVmMi5pblN0cmluZ2lmeUtleTtcbiAgICAgIHZhciBhbmNob3IgPSBPYmplY3Qua2V5cyhhbmNob3JzKS5maW5kKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHJldHVybiBhbmNob3JzW2FdID09PSBzb3VyY2U7XG4gICAgICB9KTtcbiAgICAgIGlmICghYW5jaG9yICYmIGluU3RyaW5naWZ5S2V5KSBhbmNob3IgPSBkb2MuYW5jaG9ycy5nZXROYW1lKHNvdXJjZSkgfHwgZG9jLmFuY2hvcnMubmV3TmFtZSgpO1xuICAgICAgaWYgKGFuY2hvcikgcmV0dXJuIFwiKlwiLmNvbmNhdChhbmNob3IpLmNvbmNhdChpbXBsaWNpdEtleSA/ICcgJyA6ICcnKTtcbiAgICAgIHZhciBtc2cgPSBkb2MuYW5jaG9ycy5nZXROYW1lKHNvdXJjZSkgPyAnQWxpYXMgbm9kZSBtdXN0IGJlIGFmdGVyIHNvdXJjZSBub2RlJyA6ICdTb3VyY2Ugbm9kZSBub3QgZm91bmQgZm9yIGFsaWFzIG5vZGUnO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIuY29uY2F0KG1zZywgXCIgW1wiKS5jb25jYXQocmFuZ2UsIFwiXVwiKSk7XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gQWxpYXMoc291cmNlKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFsaWFzKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG4gICAgX3RoaXMuc291cmNlID0gc291cmNlO1xuICAgIF90aGlzLnR5cGUgPSBUeXBlLkFMSUFTO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBbGlhcywgW3tcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTiQxKGFyZywgY3R4KSB7XG4gICAgICBpZiAoIWN0eCkgcmV0dXJuIHRvSlNPTih0aGlzLnNvdXJjZSwgYXJnLCBjdHgpO1xuICAgICAgdmFyIGFuY2hvcnMgPSBjdHguYW5jaG9ycyxcbiAgICAgICAgICBtYXhBbGlhc0NvdW50ID0gY3R4Lm1heEFsaWFzQ291bnQ7XG4gICAgICB2YXIgYW5jaG9yID0gYW5jaG9ycy5nZXQodGhpcy5zb3VyY2UpO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5cbiAgICAgIGlmICghYW5jaG9yIHx8IGFuY2hvci5yZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgbXNnID0gJ1RoaXMgc2hvdWxkIG5vdCBoYXBwZW46IEFsaWFzIGFuY2hvciB3YXMgbm90IHJlc29sdmVkPyc7XG4gICAgICAgIGlmICh0aGlzLmNzdE5vZGUpIHRocm93IG5ldyBZQU1MUmVmZXJlbmNlRXJyb3IodGhpcy5jc3ROb2RlLCBtc2cpO2Vsc2UgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG1zZyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXhBbGlhc0NvdW50ID49IDApIHtcbiAgICAgICAgYW5jaG9yLmNvdW50ICs9IDE7XG4gICAgICAgIGlmIChhbmNob3IuYWxpYXNDb3VudCA9PT0gMCkgYW5jaG9yLmFsaWFzQ291bnQgPSBnZXRBbGlhc0NvdW50KHRoaXMuc291cmNlLCBhbmNob3JzKTtcblxuICAgICAgICBpZiAoYW5jaG9yLmNvdW50ICogYW5jaG9yLmFsaWFzQ291bnQgPiBtYXhBbGlhc0NvdW50KSB7XG4gICAgICAgICAgdmFyIF9tc2cgPSAnRXhjZXNzaXZlIGFsaWFzIGNvdW50IGluZGljYXRlcyBhIHJlc291cmNlIGV4aGF1c3Rpb24gYXR0YWNrJztcbiAgICAgICAgICBpZiAodGhpcy5jc3ROb2RlKSB0aHJvdyBuZXcgWUFNTFJlZmVyZW5jZUVycm9yKHRoaXMuY3N0Tm9kZSwgX21zZyk7ZWxzZSB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoX21zZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFuY2hvci5yZXM7XG4gICAgfSAvLyBPbmx5IGNhbGxlZCB3aGVuIHN0cmluZ2lmeWluZyBhbiBhbGlhcyBtYXBwaW5nIGtleSB3aGlsZSBjb25zdHJ1Y3RpbmdcbiAgICAvLyBPYmplY3Qgb3V0cHV0LlxuXG4gIH0sIHtcbiAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoY3R4KSB7XG4gICAgICByZXR1cm4gQWxpYXMuc3RyaW5naWZ5KHRoaXMsIGN0eCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRhZ1wiLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWxpYXMgbm9kZXMgY2Fubm90IGhhdmUgdGFncycpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBbGlhcztcbn0oTm9kZSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShBbGlhcywgXCJkZWZhdWx0XCIsIHRydWUpO1xuXG5mdW5jdGlvbiBmaW5kUGFpcihpdGVtcywga2V5KSB7XG4gIHZhciBrID0ga2V5IGluc3RhbmNlb2YgU2NhbGFyID8ga2V5LnZhbHVlIDoga2V5O1xuXG4gIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihpdGVtcyksXG4gICAgICBfc3RlcDtcblxuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgaXQgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgaWYgKGl0IGluc3RhbmNlb2YgUGFpcikge1xuICAgICAgICBpZiAoaXQua2V5ID09PSBrZXkgfHwgaXQua2V5ID09PSBrKSByZXR1cm4gaXQ7XG4gICAgICAgIGlmIChpdC5rZXkgJiYgaXQua2V5LnZhbHVlID09PSBrKSByZXR1cm4gaXQ7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxudmFyIFlBTUxNYXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db2xsZWN0aW9uKSB7XG4gIF9pbmhlcml0cyhZQU1MTWFwLCBfQ29sbGVjdGlvbik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihZQU1MTWFwKTtcblxuICBmdW5jdGlvbiBZQU1MTWFwKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBZQU1MTWFwKTtcblxuICAgIHJldHVybiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhZQU1MTWFwLCBbe1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHBhaXIsIG92ZXJ3cml0ZSkge1xuICAgICAgaWYgKCFwYWlyKSBwYWlyID0gbmV3IFBhaXIocGFpcik7ZWxzZSBpZiAoIShwYWlyIGluc3RhbmNlb2YgUGFpcikpIHBhaXIgPSBuZXcgUGFpcihwYWlyLmtleSB8fCBwYWlyLCBwYWlyLnZhbHVlKTtcbiAgICAgIHZhciBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywgcGFpci5rZXkpO1xuICAgICAgdmFyIHNvcnRFbnRyaWVzID0gdGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuc29ydE1hcEVudHJpZXM7XG5cbiAgICAgIGlmIChwcmV2KSB7XG4gICAgICAgIGlmIChvdmVyd3JpdGUpIHByZXYudmFsdWUgPSBwYWlyLnZhbHVlO2Vsc2UgdGhyb3cgbmV3IEVycm9yKFwiS2V5IFwiLmNvbmNhdChwYWlyLmtleSwgXCIgYWxyZWFkeSBzZXRcIikpO1xuICAgICAgfSBlbHNlIGlmIChzb3J0RW50cmllcykge1xuICAgICAgICB2YXIgaSA9IHRoaXMuaXRlbXMuZmluZEluZGV4KGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIHNvcnRFbnRyaWVzKHBhaXIsIGl0ZW0pIDwgMDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpID09PSAtMSkgdGhpcy5pdGVtcy5wdXNoKHBhaXIpO2Vsc2UgdGhpcy5pdGVtcy5zcGxpY2UoaSwgMCwgcGFpcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLml0ZW1zLnB1c2gocGFpcik7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKGtleSkge1xuICAgICAgdmFyIGl0ID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgIGlmICghaXQpIHJldHVybiBmYWxzZTtcbiAgICAgIHZhciBkZWwgPSB0aGlzLml0ZW1zLnNwbGljZSh0aGlzLml0ZW1zLmluZGV4T2YoaXQpLCAxKTtcbiAgICAgIHJldHVybiBkZWwubGVuZ3RoID4gMDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgIHZhciBpdCA9IGZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgICB2YXIgbm9kZSA9IGl0ICYmIGl0LnZhbHVlO1xuICAgICAgcmV0dXJuICFrZWVwU2NhbGFyICYmIG5vZGUgaW5zdGFuY2VvZiBTY2FsYXIgPyBub2RlLnZhbHVlIDogbm9kZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiAhIWZpbmRQYWlyKHRoaXMuaXRlbXMsIGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdGhpcy5hZGQobmV3IFBhaXIoa2V5LCB2YWx1ZSksIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0geyp9IGFyZyBpZ25vcmVkXG4gICAgICogQHBhcmFtIHsqfSBjdHggQ29udmVyc2lvbiBjb250ZXh0LCBvcmlnaW5hbGx5IHNldCBpbiBEb2N1bWVudCN0b0pTT04oKVxuICAgICAqIEBwYXJhbSB7Q2xhc3N9IFR5cGUgSWYgc2V0LCBmb3JjZXMgdGhlIHJldHVybmVkIGNvbGxlY3Rpb24gdHlwZVxuICAgICAqIEByZXR1cm5zIHsqfSBJbnN0YW5jZSBvZiBUeXBlLCBNYXAsIG9yIE9iamVjdFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTihfLCBjdHgsIFR5cGUpIHtcbiAgICAgIHZhciBtYXAgPSBUeXBlID8gbmV3IFR5cGUoKSA6IGN0eCAmJiBjdHgubWFwQXNNYXAgPyBuZXcgTWFwKCkgOiB7fTtcbiAgICAgIGlmIChjdHggJiYgY3R4Lm9uQ3JlYXRlKSBjdHgub25DcmVhdGUobWFwKTtcblxuICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLml0ZW1zKSxcbiAgICAgICAgICBfc3RlcDI7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMi5zKCk7ICEoX3N0ZXAyID0gX2l0ZXJhdG9yMi5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGl0ZW0gPSBfc3RlcDIudmFsdWU7XG4gICAgICAgICAgaXRlbS5hZGRUb0pTTWFwKGN0eCwgbWFwKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX2l0ZXJhdG9yMi5mKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgaWYgKCFjdHgpIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcblxuICAgICAgdmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLml0ZW1zKSxcbiAgICAgICAgICBfc3RlcDM7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yMy5zKCk7ICEoX3N0ZXAzID0gX2l0ZXJhdG9yMy5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIGl0ZW0gPSBfc3RlcDMudmFsdWU7XG4gICAgICAgICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIFBhaXIpKSB0aHJvdyBuZXcgRXJyb3IoXCJNYXAgaXRlbXMgbXVzdCBhbGwgYmUgcGFpcnM7IGZvdW5kIFwiLmNvbmNhdChKU09OLnN0cmluZ2lmeShpdGVtKSwgXCIgaW5zdGVhZFwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfaXRlcmF0b3IzLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvcjMuZigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2dldChfZ2V0UHJvdG90eXBlT2YoWUFNTE1hcC5wcm90b3R5cGUpLCBcInRvU3RyaW5nXCIsIHRoaXMpLmNhbGwodGhpcywgY3R4LCB7XG4gICAgICAgIGJsb2NrSXRlbTogZnVuY3Rpb24gYmxvY2tJdGVtKG4pIHtcbiAgICAgICAgICByZXR1cm4gbi5zdHI7XG4gICAgICAgIH0sXG4gICAgICAgIGZsb3dDaGFyczoge1xuICAgICAgICAgIHN0YXJ0OiAneycsXG4gICAgICAgICAgZW5kOiAnfSdcbiAgICAgICAgfSxcbiAgICAgICAgaXNNYXA6IHRydWUsXG4gICAgICAgIGl0ZW1JbmRlbnQ6IGN0eC5pbmRlbnQgfHwgJydcbiAgICAgIH0sIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBZQU1MTWFwO1xufShDb2xsZWN0aW9uKTtcblxudmFyIE1FUkdFX0tFWSA9ICc8PCc7XG52YXIgTWVyZ2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QYWlyKSB7XG4gIF9pbmhlcml0cyhNZXJnZSwgX1BhaXIpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoTWVyZ2UpO1xuXG4gIGZ1bmN0aW9uIE1lcmdlKHBhaXIpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVyZ2UpO1xuXG4gICAgaWYgKHBhaXIgaW5zdGFuY2VvZiBQYWlyKSB7XG4gICAgICB2YXIgc2VxID0gcGFpci52YWx1ZTtcblxuICAgICAgaWYgKCEoc2VxIGluc3RhbmNlb2YgWUFNTFNlcSkpIHtcbiAgICAgICAgc2VxID0gbmV3IFlBTUxTZXEoKTtcbiAgICAgICAgc2VxLml0ZW1zLnB1c2gocGFpci52YWx1ZSk7XG4gICAgICAgIHNlcS5yYW5nZSA9IHBhaXIudmFsdWUucmFuZ2U7XG4gICAgICB9XG5cbiAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcGFpci5rZXksIHNlcSk7XG4gICAgICBfdGhpcy5yYW5nZSA9IHBhaXIucmFuZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbmV3IFNjYWxhcihNRVJHRV9LRVkpLCBuZXcgWUFNTFNlcSgpKTtcbiAgICB9XG5cbiAgICBfdGhpcy50eXBlID0gUGFpci5UeXBlLk1FUkdFX1BBSVI7XG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzKTtcbiAgfSAvLyBJZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgbWVyZ2Uga2V5IGlzIGEgc2luZ2xlIG1hcHBpbmcgbm9kZSwgZWFjaCBvZlxuICAvLyBpdHMga2V5L3ZhbHVlIHBhaXJzIGlzIGluc2VydGVkIGludG8gdGhlIGN1cnJlbnQgbWFwcGluZywgdW5sZXNzIHRoZSBrZXlcbiAgLy8gYWxyZWFkeSBleGlzdHMgaW4gaXQuIElmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lcmdlIGtleSBpcyBhXG4gIC8vIHNlcXVlbmNlLCB0aGVuIHRoaXMgc2VxdWVuY2UgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBtYXBwaW5nIG5vZGVzIGFuZCBlYWNoXG4gIC8vIG9mIHRoZXNlIG5vZGVzIGlzIG1lcmdlZCBpbiB0dXJuIGFjY29yZGluZyB0byBpdHMgb3JkZXIgaW4gdGhlIHNlcXVlbmNlLlxuICAvLyBLZXlzIGluIG1hcHBpbmcgbm9kZXMgZWFybGllciBpbiB0aGUgc2VxdWVuY2Ugb3ZlcnJpZGUga2V5cyBzcGVjaWZpZWQgaW5cbiAgLy8gbGF0ZXIgbWFwcGluZyBub2Rlcy4gLS0gaHR0cDovL3lhbWwub3JnL3R5cGUvbWVyZ2UuaHRtbFxuXG5cbiAgX2NyZWF0ZUNsYXNzKE1lcmdlLCBbe1xuICAgIGtleTogXCJhZGRUb0pTTWFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFRvSlNNYXAoY3R4LCBtYXApIHtcbiAgICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih0aGlzLnZhbHVlLml0ZW1zKSxcbiAgICAgICAgICBfc3RlcDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gX3N0ZXAudmFsdWUuc291cmNlO1xuICAgICAgICAgIGlmICghKHNvdXJjZSBpbnN0YW5jZW9mIFlBTUxNYXApKSB0aHJvdyBuZXcgRXJyb3IoJ01lcmdlIHNvdXJjZXMgbXVzdCBiZSBtYXBzJyk7XG4gICAgICAgICAgdmFyIHNyY01hcCA9IHNvdXJjZS50b0pTT04obnVsbCwgY3R4LCBNYXApO1xuXG4gICAgICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihzcmNNYXApLFxuICAgICAgICAgICAgICBfc3RlcDI7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICAgICAgdmFyIF9zdGVwMiR2YWx1ZSA9IF9zbGljZWRUb0FycmF5KF9zdGVwMi52YWx1ZSwgMiksXG4gICAgICAgICAgICAgICAgICBrZXkgPSBfc3RlcDIkdmFsdWVbMF0sXG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9zdGVwMiR2YWx1ZVsxXTtcblxuICAgICAgICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXAuaGFzKGtleSkpIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAobWFwIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICAgICAgbWFwLmFkZChrZXkpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1hcCwga2V5KSkgbWFwW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIF9pdGVyYXRvcjIuZigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b1N0cmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0b1N0cmluZyhjdHgsIG9uQ29tbWVudCkge1xuICAgICAgdmFyIHNlcSA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAoc2VxLml0ZW1zLmxlbmd0aCA+IDEpIHJldHVybiBfZ2V0KF9nZXRQcm90b3R5cGVPZihNZXJnZS5wcm90b3R5cGUpLCBcInRvU3RyaW5nXCIsIHRoaXMpLmNhbGwodGhpcywgY3R4LCBvbkNvbW1lbnQpO1xuICAgICAgdGhpcy52YWx1ZSA9IHNlcS5pdGVtc1swXTtcblxuICAgICAgdmFyIHN0ciA9IF9nZXQoX2dldFByb3RvdHlwZU9mKE1lcmdlLnByb3RvdHlwZSksIFwidG9TdHJpbmdcIiwgdGhpcykuY2FsbCh0aGlzLCBjdHgsIG9uQ29tbWVudCk7XG5cbiAgICAgIHRoaXMudmFsdWUgPSBzZXE7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNZXJnZTtcbn0oUGFpcik7XG5cbnZhciBiaW5hcnlPcHRpb25zID0ge1xuICBkZWZhdWx0VHlwZTogVHlwZS5CTE9DS19MSVRFUkFMLFxuICBsaW5lV2lkdGg6IDc2XG59O1xudmFyIGJvb2xPcHRpb25zID0ge1xuICB0cnVlU3RyOiAndHJ1ZScsXG4gIGZhbHNlU3RyOiAnZmFsc2UnXG59O1xudmFyIGludE9wdGlvbnMgPSB7XG4gIGFzQmlnSW50OiBmYWxzZVxufTtcbnZhciBudWxsT3B0aW9ucyA9IHtcbiAgbnVsbFN0cjogJ251bGwnXG59O1xudmFyIHN0ck9wdGlvbnMgPSB7XG4gIGRlZmF1bHRUeXBlOiBUeXBlLlBMQUlOLFxuICBkb3VibGVRdW90ZWQ6IHtcbiAgICBqc29uRW5jb2Rpbmc6IGZhbHNlLFxuICAgIG1pbk11bHRpTGluZUxlbmd0aDogNDBcbiAgfSxcbiAgZm9sZDoge1xuICAgIGxpbmVXaWR0aDogODAsXG4gICAgbWluQ29udGVudFdpZHRoOiAyMFxuICB9XG59O1xuXG5mdW5jdGlvbiByZXNvbHZlU2NhbGFyKHN0ciwgdGFncywgc2NhbGFyRmFsbGJhY2spIHtcbiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRhZ3MpLFxuICAgICAgX3N0ZXA7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgdmFyIF9zdGVwJHZhbHVlID0gX3N0ZXAudmFsdWUsXG4gICAgICAgICAgZm9ybWF0ID0gX3N0ZXAkdmFsdWUuZm9ybWF0LFxuICAgICAgICAgIHRlc3QgPSBfc3RlcCR2YWx1ZS50ZXN0LFxuICAgICAgICAgIHJlc29sdmUgPSBfc3RlcCR2YWx1ZS5yZXNvbHZlO1xuXG4gICAgICBpZiAodGVzdCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2godGVzdCk7XG5cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgdmFyIHJlcyA9IHJlc29sdmUuYXBwbHkobnVsbCwgbWF0Y2gpO1xuICAgICAgICAgIGlmICghKHJlcyBpbnN0YW5jZW9mIFNjYWxhcikpIHJlcyA9IG5ldyBTY2FsYXIocmVzKTtcbiAgICAgICAgICBpZiAoZm9ybWF0KSByZXMuZm9ybWF0ID0gZm9ybWF0O1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxuXG4gIGlmIChzY2FsYXJGYWxsYmFjaykgc3RyID0gc2NhbGFyRmFsbGJhY2soc3RyKTtcbiAgcmV0dXJuIG5ldyBTY2FsYXIoc3RyKTtcbn1cblxudmFyIEZPTERfRkxPVyA9ICdmbG93JztcbnZhciBGT0xEX0JMT0NLID0gJ2Jsb2NrJztcbnZhciBGT0xEX1FVT1RFRCA9ICdxdW90ZWQnOyAvLyBwcmVzdW1lcyBpKzEgaXMgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZVxuLy8gcmV0dXJucyBpbmRleCBvZiBsYXN0IG5ld2xpbmUgaW4gbW9yZS1pbmRlbnRlZCBibG9ja1xuXG52YXIgY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzID0gZnVuY3Rpb24gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGkpIHtcbiAgdmFyIGNoID0gdGV4dFtpICsgMV07XG5cbiAgd2hpbGUgKGNoID09PSAnICcgfHwgY2ggPT09ICdcXHQnKSB7XG4gICAgZG8ge1xuICAgICAgY2ggPSB0ZXh0W2kgKz0gMV07XG4gICAgfSB3aGlsZSAoY2ggJiYgY2ggIT09ICdcXG4nKTtcblxuICAgIGNoID0gdGV4dFtpICsgMV07XG4gIH1cblxuICByZXR1cm4gaTtcbn07XG4vKipcbiAqIFRyaWVzIHRvIGtlZXAgaW5wdXQgYXQgdXAgdG8gYGxpbmVXaWR0aGAgY2hhcmFjdGVycywgc3BsaXR0aW5nIG9ubHkgb24gc3BhY2VzXG4gKiBub3QgZm9sbG93ZWQgYnkgbmV3bGluZXMgb3Igc3BhY2VzIHVubGVzcyBgbW9kZWAgaXMgYCdxdW90ZWQnYC4gTGluZXMgYXJlXG4gKiB0ZXJtaW5hdGVkIHdpdGggYFxcbmAgYW5kIHN0YXJ0ZWQgd2l0aCBgaW5kZW50YC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICogQHBhcmFtIHtzdHJpbmd9IGluZGVudFxuICogQHBhcmFtIHtzdHJpbmd9IFttb2RlPSdmbG93J10gYCdibG9jaydgIHByZXZlbnRzIG1vcmUtaW5kZW50ZWQgbGluZXNcbiAqICAgZnJvbSBiZWluZyBmb2xkZWQ7IGAncXVvdGVkJ2AgYWxsb3dzIGZvciBgXFxgIGVzY2FwZXMsIGluY2x1ZGluZyBlc2NhcGVkXG4gKiAgIG5ld2xpbmVzXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmluZGVudEF0U3RhcnRdIEFjY291bnRzIGZvciBsZWFkaW5nIGNvbnRlbnRzIG9uXG4gKiAgIHRoZSBmaXJzdCBsaW5lLCBkZWZhdWx0aW5nIHRvIGBpbmRlbnQubGVuZ3RoYFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxpbmVXaWR0aD04MF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5taW5Db250ZW50V2lkdGg9MjBdIEFsbG93IGhpZ2hseSBpbmRlbnRlZCBsaW5lcyB0b1xuICogICBzdHJldGNoIHRoZSBsaW5lIHdpZHRoXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBvcHRpb25zLm9uRm9sZCBDYWxsZWQgb25jZSBpZiB0aGUgdGV4dCBpcyBmb2xkZWRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG9wdGlvbnMub25Gb2xkIENhbGxlZCBvbmNlIGlmIGFueSBsaW5lIG9mIHRleHQgZXhjZWVkc1xuICogICBsaW5lV2lkdGggY2hhcmFjdGVyc1xuICovXG5cblxuZnVuY3Rpb24gZm9sZEZsb3dMaW5lcyh0ZXh0LCBpbmRlbnQsIG1vZGUsIF9yZWYpIHtcbiAgdmFyIGluZGVudEF0U3RhcnQgPSBfcmVmLmluZGVudEF0U3RhcnQsXG4gICAgICBfcmVmJGxpbmVXaWR0aCA9IF9yZWYubGluZVdpZHRoLFxuICAgICAgbGluZVdpZHRoID0gX3JlZiRsaW5lV2lkdGggPT09IHZvaWQgMCA/IDgwIDogX3JlZiRsaW5lV2lkdGgsXG4gICAgICBfcmVmJG1pbkNvbnRlbnRXaWR0aCA9IF9yZWYubWluQ29udGVudFdpZHRoLFxuICAgICAgbWluQ29udGVudFdpZHRoID0gX3JlZiRtaW5Db250ZW50V2lkdGggPT09IHZvaWQgMCA/IDIwIDogX3JlZiRtaW5Db250ZW50V2lkdGgsXG4gICAgICBvbkZvbGQgPSBfcmVmLm9uRm9sZCxcbiAgICAgIG9uT3ZlcmZsb3cgPSBfcmVmLm9uT3ZlcmZsb3c7XG4gIGlmICghbGluZVdpZHRoIHx8IGxpbmVXaWR0aCA8IDApIHJldHVybiB0ZXh0O1xuICB2YXIgZW5kU3RlcCA9IE1hdGgubWF4KDEgKyBtaW5Db250ZW50V2lkdGgsIDEgKyBsaW5lV2lkdGggLSBpbmRlbnQubGVuZ3RoKTtcbiAgaWYgKHRleHQubGVuZ3RoIDw9IGVuZFN0ZXApIHJldHVybiB0ZXh0O1xuICB2YXIgZm9sZHMgPSBbXTtcbiAgdmFyIGVzY2FwZWRGb2xkcyA9IHt9O1xuICB2YXIgZW5kID0gbGluZVdpZHRoIC0gKHR5cGVvZiBpbmRlbnRBdFN0YXJ0ID09PSAnbnVtYmVyJyA/IGluZGVudEF0U3RhcnQgOiBpbmRlbnQubGVuZ3RoKTtcbiAgdmFyIHNwbGl0ID0gdW5kZWZpbmVkO1xuICB2YXIgcHJldiA9IHVuZGVmaW5lZDtcbiAgdmFyIG92ZXJmbG93ID0gZmFsc2U7XG4gIHZhciBpID0gLTE7XG5cbiAgaWYgKG1vZGUgPT09IEZPTERfQkxPQ0spIHtcbiAgICBpID0gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGkpO1xuICAgIGlmIChpICE9PSAtMSkgZW5kID0gaSArIGVuZFN0ZXA7XG4gIH1cblxuICBmb3IgKHZhciBjaDsgY2ggPSB0ZXh0W2kgKz0gMV07KSB7XG4gICAgaWYgKG1vZGUgPT09IEZPTERfUVVPVEVEICYmIGNoID09PSAnXFxcXCcpIHtcbiAgICAgIHN3aXRjaCAodGV4dFtpICsgMV0pIHtcbiAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgaSArPSAzO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3UnOlxuICAgICAgICAgIGkgKz0gNTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdVJzpcbiAgICAgICAgICBpICs9IDk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpICs9IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoID09PSAnXFxuJykge1xuICAgICAgaWYgKG1vZGUgPT09IEZPTERfQkxPQ0spIGkgPSBjb25zdW1lTW9yZUluZGVudGVkTGluZXModGV4dCwgaSk7XG4gICAgICBlbmQgPSBpICsgZW5kU3RlcDtcbiAgICAgIHNwbGl0ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2ggPT09ICcgJyAmJiBwcmV2ICYmIHByZXYgIT09ICcgJyAmJiBwcmV2ICE9PSAnXFxuJyAmJiBwcmV2ICE9PSAnXFx0Jykge1xuICAgICAgICAvLyBzcGFjZSBzdXJyb3VuZGVkIGJ5IG5vbi1zcGFjZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBuZXdsaW5lICsgaW5kZW50XG4gICAgICAgIHZhciBuZXh0ID0gdGV4dFtpICsgMV07XG4gICAgICAgIGlmIChuZXh0ICYmIG5leHQgIT09ICcgJyAmJiBuZXh0ICE9PSAnXFxuJyAmJiBuZXh0ICE9PSAnXFx0Jykgc3BsaXQgPSBpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaSA+PSBlbmQpIHtcbiAgICAgICAgaWYgKHNwbGl0KSB7XG4gICAgICAgICAgZm9sZHMucHVzaChzcGxpdCk7XG4gICAgICAgICAgZW5kID0gc3BsaXQgKyBlbmRTdGVwO1xuICAgICAgICAgIHNwbGl0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09IEZPTERfUVVPVEVEKSB7XG4gICAgICAgICAgLy8gd2hpdGUtc3BhY2UgY29sbGVjdGVkIGF0IGVuZCBtYXkgc3RyZXRjaCBwYXN0IGxpbmVXaWR0aFxuICAgICAgICAgIHdoaWxlIChwcmV2ID09PSAnICcgfHwgcHJldiA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgIHByZXYgPSBjaDtcbiAgICAgICAgICAgIGNoID0gdGV4dFtpICs9IDFdO1xuICAgICAgICAgICAgb3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgIH0gLy8gaSAtIDIgYWNjb3VudHMgZm9yIG5vdC1kcm9wcGVkIGxhc3QgY2hhciArIG5ld2xpbmUtZXNjYXBpbmcgXFxcblxuXG4gICAgICAgICAgZm9sZHMucHVzaChpIC0gMik7XG4gICAgICAgICAgZXNjYXBlZEZvbGRzW2kgLSAyXSA9IHRydWU7XG4gICAgICAgICAgZW5kID0gaSAtIDIgKyBlbmRTdGVwO1xuICAgICAgICAgIHNwbGl0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHByZXYgPSBjaDtcbiAgfVxuXG4gIGlmIChvdmVyZmxvdyAmJiBvbk92ZXJmbG93KSBvbk92ZXJmbG93KCk7XG4gIGlmIChmb2xkcy5sZW5ndGggPT09IDApIHJldHVybiB0ZXh0O1xuICBpZiAob25Gb2xkKSBvbkZvbGQoKTtcbiAgdmFyIHJlcyA9IHRleHQuc2xpY2UoMCwgZm9sZHNbMF0pO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBmb2xkcy5sZW5ndGg7ICsrX2kpIHtcbiAgICB2YXIgZm9sZCA9IGZvbGRzW19pXTtcblxuICAgIHZhciBfZW5kID0gZm9sZHNbX2kgKyAxXSB8fCB0ZXh0Lmxlbmd0aDtcblxuICAgIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCAmJiBlc2NhcGVkRm9sZHNbZm9sZF0pIHJlcyArPSBcIlwiLmNvbmNhdCh0ZXh0W2ZvbGRdLCBcIlxcXFxcIik7XG4gICAgcmVzICs9IFwiXFxuXCIuY29uY2F0KGluZGVudCkuY29uY2F0KHRleHQuc2xpY2UoZm9sZCArIDEsIF9lbmQpKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbnZhciBnZXRGb2xkT3B0aW9ucyA9IGZ1bmN0aW9uIGdldEZvbGRPcHRpb25zKF9yZWYpIHtcbiAgdmFyIGluZGVudEF0U3RhcnQgPSBfcmVmLmluZGVudEF0U3RhcnQ7XG4gIHJldHVybiBpbmRlbnRBdFN0YXJ0ID8gT2JqZWN0LmFzc2lnbih7XG4gICAgaW5kZW50QXRTdGFydDogaW5kZW50QXRTdGFydFxuICB9LCBzdHJPcHRpb25zLmZvbGQpIDogc3RyT3B0aW9ucy5mb2xkO1xufTsgLy8gQWxzbyBjaGVja3MgZm9yIGxpbmVzIHN0YXJ0aW5nIHdpdGggJSwgYXMgcGFyc2luZyB0aGUgb3V0cHV0IGFzIFlBTUwgMS4xIHdpbGxcbi8vIHByZXN1bWUgdGhhdCdzIHN0YXJ0aW5nIGEgbmV3IGRvY3VtZW50LlxuXG5cbnZhciBjb250YWluc0RvY3VtZW50TWFya2VyID0gZnVuY3Rpb24gY29udGFpbnNEb2N1bWVudE1hcmtlcihzdHIpIHtcbiAgcmV0dXJuIC9eKCV8LS0tfFxcLlxcLlxcLikvbS50ZXN0KHN0cik7XG59O1xuXG5mdW5jdGlvbiBsaW5lTGVuZ3RoT3ZlckxpbWl0KHN0ciwgbGltaXQpIHtcbiAgdmFyIHN0ckxlbiA9IHN0ci5sZW5ndGg7XG4gIGlmIChzdHJMZW4gPD0gbGltaXQpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gMCwgc3RhcnQgPSAwOyBpIDwgc3RyTGVuOyArK2kpIHtcbiAgICBpZiAoc3RyW2ldID09PSAnXFxuJykge1xuICAgICAgaWYgKGkgLSBzdGFydCA+IGxpbWl0KSByZXR1cm4gdHJ1ZTtcbiAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICBpZiAoc3RyTGVuIC0gc3RhcnQgPD0gbGltaXQpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZG91YmxlUXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpIHtcbiAgdmFyIGltcGxpY2l0S2V5ID0gY3R4LmltcGxpY2l0S2V5O1xuICB2YXIgX3N0ck9wdGlvbnMkZG91YmxlUXVvID0gc3RyT3B0aW9ucy5kb3VibGVRdW90ZWQsXG4gICAgICBqc29uRW5jb2RpbmcgPSBfc3RyT3B0aW9ucyRkb3VibGVRdW8uanNvbkVuY29kaW5nLFxuICAgICAgbWluTXVsdGlMaW5lTGVuZ3RoID0gX3N0ck9wdGlvbnMkZG91YmxlUXVvLm1pbk11bHRpTGluZUxlbmd0aDtcbiAgdmFyIGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIGlmIChqc29uRW5jb2RpbmcpIHJldHVybiBqc29uO1xuICB2YXIgaW5kZW50ID0gY3R4LmluZGVudCB8fCAoY29udGFpbnNEb2N1bWVudE1hcmtlcih2YWx1ZSkgPyAnICAnIDogJycpO1xuICB2YXIgc3RyID0gJyc7XG4gIHZhciBzdGFydCA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGNoID0ganNvbltpXTsgY2g7IGNoID0ganNvblsrK2ldKSB7XG4gICAgaWYgKGNoID09PSAnICcgJiYganNvbltpICsgMV0gPT09ICdcXFxcJyAmJiBqc29uW2kgKyAyXSA9PT0gJ24nKSB7XG4gICAgICAvLyBzcGFjZSBiZWZvcmUgbmV3bGluZSBuZWVkcyB0byBiZSBlc2NhcGVkIHRvIG5vdCBiZSBmb2xkZWRcbiAgICAgIHN0ciArPSBqc29uLnNsaWNlKHN0YXJ0LCBpKSArICdcXFxcICc7XG4gICAgICBpICs9IDE7XG4gICAgICBzdGFydCA9IGk7XG4gICAgICBjaCA9ICdcXFxcJztcbiAgICB9XG5cbiAgICBpZiAoY2ggPT09ICdcXFxcJykgc3dpdGNoIChqc29uW2kgKyAxXSkge1xuICAgICAgY2FzZSAndSc6XG4gICAgICAgIHtcbiAgICAgICAgICBzdHIgKz0ganNvbi5zbGljZShzdGFydCwgaSk7XG4gICAgICAgICAgdmFyIGNvZGUgPSBqc29uLnN1YnN0cihpICsgMiwgNCk7XG5cbiAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJzAwMDAnOlxuICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFwwJztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJzAwMDcnOlxuICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxhJztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJzAwMGInOlxuICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFx2JztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJzAwMWInOlxuICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxlJztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJzAwODUnOlxuICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxOJztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJzAwYTAnOlxuICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxfJztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJzIwMjgnOlxuICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxMJztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJzIwMjknOlxuICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxQJztcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGlmIChjb2RlLnN1YnN0cigwLCAyKSA9PT0gJzAwJykgc3RyICs9ICdcXFxceCcgKyBjb2RlLnN1YnN0cigyKTtlbHNlIHN0ciArPSBqc29uLnN1YnN0cihpLCA2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpICs9IDU7XG4gICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnbic6XG4gICAgICAgIGlmIChpbXBsaWNpdEtleSB8fCBqc29uW2kgKyAyXSA9PT0gJ1wiJyB8fCBqc29uLmxlbmd0aCA8IG1pbk11bHRpTGluZUxlbmd0aCkge1xuICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBmb2xkaW5nIHdpbGwgZWF0IGZpcnN0IG5ld2xpbmVcbiAgICAgICAgICBzdHIgKz0ganNvbi5zbGljZShzdGFydCwgaSkgKyAnXFxuXFxuJztcblxuICAgICAgICAgIHdoaWxlIChqc29uW2kgKyAyXSA9PT0gJ1xcXFwnICYmIGpzb25baSArIDNdID09PSAnbicgJiYganNvbltpICsgNF0gIT09ICdcIicpIHtcbiAgICAgICAgICAgIHN0ciArPSAnXFxuJztcbiAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdHIgKz0gaW5kZW50OyAvLyBzcGFjZSBhZnRlciBuZXdsaW5lIG5lZWRzIHRvIGJlIGVzY2FwZWQgdG8gbm90IGJlIGZvbGRlZFxuXG4gICAgICAgICAgaWYgKGpzb25baSArIDJdID09PSAnICcpIHN0ciArPSAnXFxcXCc7XG4gICAgICAgICAgaSArPSAxO1xuICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaSArPSAxO1xuICAgIH1cbiAgfVxuXG4gIHN0ciA9IHN0YXJ0ID8gc3RyICsganNvbi5zbGljZShzdGFydCkgOiBqc29uO1xuICByZXR1cm4gaW1wbGljaXRLZXkgPyBzdHIgOiBmb2xkRmxvd0xpbmVzKHN0ciwgaW5kZW50LCBGT0xEX1FVT1RFRCwgZ2V0Rm9sZE9wdGlvbnMoY3R4KSk7XG59XG5cbmZ1bmN0aW9uIHNpbmdsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KSB7XG4gIGlmIChjdHguaW1wbGljaXRLZXkpIHtcbiAgICBpZiAoL1xcbi8udGVzdCh2YWx1ZSkpIHJldHVybiBkb3VibGVRdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gc2luZ2xlIHF1b3RlZCBzdHJpbmcgY2FuJ3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYXJvdW5kIG5ld2xpbmVcbiAgICBpZiAoL1sgXFx0XVxcbnxcXG5bIFxcdF0vLnRlc3QodmFsdWUpKSByZXR1cm4gZG91YmxlUXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICB9XG5cbiAgdmFyIGluZGVudCA9IGN0eC5pbmRlbnQgfHwgKGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIodmFsdWUpID8gJyAgJyA6ICcnKTtcbiAgdmFyIHJlcyA9IFwiJ1wiICsgdmFsdWUucmVwbGFjZSgvJy9nLCBcIicnXCIpLnJlcGxhY2UoL1xcbisvZywgXCIkJlxcblwiLmNvbmNhdChpbmRlbnQpKSArIFwiJ1wiO1xuICByZXR1cm4gY3R4LmltcGxpY2l0S2V5ID8gcmVzIDogZm9sZEZsb3dMaW5lcyhyZXMsIGluZGVudCwgRk9MRF9GTE9XLCBnZXRGb2xkT3B0aW9ucyhjdHgpKTtcbn1cblxuZnVuY3Rpb24gYmxvY2tTdHJpbmcoX3JlZjIsIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICB2YXIgY29tbWVudCA9IF9yZWYyLmNvbW1lbnQsXG4gICAgICB0eXBlID0gX3JlZjIudHlwZSxcbiAgICAgIHZhbHVlID0gX3JlZjIudmFsdWU7XG5cbiAgLy8gMS4gQmxvY2sgY2FuJ3QgZW5kIGluIHdoaXRlc3BhY2UgdW5sZXNzIHRoZSBsYXN0IGxpbmUgaXMgbm9uLWVtcHR5LlxuICAvLyAyLiBTdHJpbmdzIGNvbnNpc3Rpbmcgb2Ygb25seSB3aGl0ZXNwYWNlIGFyZSBiZXN0IHJlbmRlcmVkIGV4cGxpY2l0bHkuXG4gIGlmICgvXFxuW1xcdCBdKyQvLnRlc3QodmFsdWUpIHx8IC9eXFxzKiQvLnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGRvdWJsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcbiAgfVxuXG4gIHZhciBpbmRlbnQgPSBjdHguaW5kZW50IHx8IChjdHguZm9yY2VCbG9ja0luZGVudCB8fCBjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSA/ICcgICcgOiAnJyk7XG4gIHZhciBpbmRlbnRTaXplID0gaW5kZW50ID8gJzInIDogJzEnOyAvLyByb290IGlzIGF0IC0xXG5cbiAgdmFyIGxpdGVyYWwgPSB0eXBlID09PSBUeXBlLkJMT0NLX0ZPTERFRCA/IGZhbHNlIDogdHlwZSA9PT0gVHlwZS5CTE9DS19MSVRFUkFMID8gdHJ1ZSA6ICFsaW5lTGVuZ3RoT3ZlckxpbWl0KHZhbHVlLCBzdHJPcHRpb25zLmZvbGQubGluZVdpZHRoIC0gaW5kZW50Lmxlbmd0aCk7XG4gIHZhciBoZWFkZXIgPSBsaXRlcmFsID8gJ3wnIDogJz4nO1xuICBpZiAoIXZhbHVlKSByZXR1cm4gaGVhZGVyICsgJ1xcbic7XG4gIHZhciB3c1N0YXJ0ID0gJyc7XG4gIHZhciB3c0VuZCA9ICcnO1xuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1tcXG5cXHQgXSokLywgZnVuY3Rpb24gKHdzKSB7XG4gICAgdmFyIG4gPSB3cy5pbmRleE9mKCdcXG4nKTtcblxuICAgIGlmIChuID09PSAtMSkge1xuICAgICAgaGVhZGVyICs9ICctJzsgLy8gc3RyaXBcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSB3cyB8fCBuICE9PSB3cy5sZW5ndGggLSAxKSB7XG4gICAgICBoZWFkZXIgKz0gJysnOyAvLyBrZWVwXG5cbiAgICAgIGlmIChvbkNob21wS2VlcCkgb25DaG9tcEtlZXAoKTtcbiAgICB9XG5cbiAgICB3c0VuZCA9IHdzLnJlcGxhY2UoL1xcbiQvLCAnJyk7XG4gICAgcmV0dXJuICcnO1xuICB9KS5yZXBsYWNlKC9eW1xcbiBdKi8sIGZ1bmN0aW9uICh3cykge1xuICAgIGlmICh3cy5pbmRleE9mKCcgJykgIT09IC0xKSBoZWFkZXIgKz0gaW5kZW50U2l6ZTtcbiAgICB2YXIgbSA9IHdzLm1hdGNoKC8gKyQvKTtcblxuICAgIGlmIChtKSB7XG4gICAgICB3c1N0YXJ0ID0gd3Muc2xpY2UoMCwgLW1bMF0ubGVuZ3RoKTtcbiAgICAgIHJldHVybiBtWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB3c1N0YXJ0ID0gd3M7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9KTtcbiAgaWYgKHdzRW5kKSB3c0VuZCA9IHdzRW5kLnJlcGxhY2UoL1xcbisoPyFcXG58JCkvZywgXCIkJlwiLmNvbmNhdChpbmRlbnQpKTtcbiAgaWYgKHdzU3RhcnQpIHdzU3RhcnQgPSB3c1N0YXJ0LnJlcGxhY2UoL1xcbisvZywgXCIkJlwiLmNvbmNhdChpbmRlbnQpKTtcblxuICBpZiAoY29tbWVudCkge1xuICAgIGhlYWRlciArPSAnICMnICsgY29tbWVudC5yZXBsYWNlKC8gP1tcXHJcXG5dKy9nLCAnICcpO1xuICAgIGlmIChvbkNvbW1lbnQpIG9uQ29tbWVudCgpO1xuICB9XG5cbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiXCIuY29uY2F0KGhlYWRlcikuY29uY2F0KGluZGVudFNpemUsIFwiXFxuXCIpLmNvbmNhdChpbmRlbnQpLmNvbmNhdCh3c0VuZCk7XG5cbiAgaWYgKGxpdGVyYWwpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcbisvZywgXCIkJlwiLmNvbmNhdChpbmRlbnQpKTtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoaGVhZGVyLCBcIlxcblwiKS5jb25jYXQoaW5kZW50KS5jb25jYXQod3NTdGFydCkuY29uY2F0KHZhbHVlKS5jb25jYXQod3NFbmQpO1xuICB9XG5cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXG4rL2csICdcXG4kJicpLnJlcGxhY2UoLyg/Ol58XFxuKShbXFx0IF0uKikoPzooW1xcblxcdCBdKilcXG4oPyFbXFxuXFx0IF0pKT8vZywgJyQxJDInKSAvLyBtb3JlLWluZGVudGVkIGxpbmVzIGFyZW4ndCBmb2xkZWRcbiAgLy8gICAgICAgICBeIGluZC5saW5lICBeIGVtcHR5ICAgICBeIGNhcHR1cmUgbmV4dCBlbXB0eSBsaW5lcyBvbmx5IGF0IGVuZCBvZiBpbmRlbnRcbiAgLnJlcGxhY2UoL1xcbisvZywgXCIkJlwiLmNvbmNhdChpbmRlbnQpKTtcbiAgdmFyIGJvZHkgPSBmb2xkRmxvd0xpbmVzKFwiXCIuY29uY2F0KHdzU3RhcnQpLmNvbmNhdCh2YWx1ZSkuY29uY2F0KHdzRW5kKSwgaW5kZW50LCBGT0xEX0JMT0NLLCBzdHJPcHRpb25zLmZvbGQpO1xuICByZXR1cm4gXCJcIi5jb25jYXQoaGVhZGVyLCBcIlxcblwiKS5jb25jYXQoaW5kZW50KS5jb25jYXQoYm9keSk7XG59XG5cbmZ1bmN0aW9uIHBsYWluU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICB2YXIgY29tbWVudCA9IGl0ZW0uY29tbWVudCxcbiAgICAgIHR5cGUgPSBpdGVtLnR5cGUsXG4gICAgICB2YWx1ZSA9IGl0ZW0udmFsdWU7XG4gIHZhciBhY3R1YWxTdHJpbmcgPSBjdHguYWN0dWFsU3RyaW5nLFxuICAgICAgaW1wbGljaXRLZXkgPSBjdHguaW1wbGljaXRLZXksXG4gICAgICBpbmRlbnQgPSBjdHguaW5kZW50LFxuICAgICAgaW5GbG93ID0gY3R4LmluRmxvdztcblxuICBpZiAoaW1wbGljaXRLZXkgJiYgL1tcXG5bXFxde30sXS8udGVzdCh2YWx1ZSkgfHwgaW5GbG93ICYmIC9bW1xcXXt9LF0vLnRlc3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGRvdWJsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcbiAgfVxuXG4gIGlmICghdmFsdWUgfHwgL15bXFxuXFx0ICxbXFxde30jJiohfD4nXCIlQGBdfF5bPy1dJHxeWz8tXVsgXFx0XXxbXFxuOl1bIFxcdF18WyBcXHRdXFxufFtcXG5cXHQgXSN8W1xcblxcdCA6XSQvLnRlc3QodmFsdWUpKSB7XG4gICAgLy8gbm90IGFsbG93ZWQ6XG4gICAgLy8gLSBlbXB0eSBzdHJpbmcsICctJyBvciAnPydcbiAgICAvLyAtIHN0YXJ0IHdpdGggYW4gaW5kaWNhdG9yIGNoYXJhY3RlciAoZXhjZXB0IFs/Oi1dKSBvciAvWz8tXSAvXG4gICAgLy8gLSAnXFxuICcsICc6ICcgb3IgJyBcXG4nIGFueXdoZXJlXG4gICAgLy8gLSAnIycgbm90IHByZWNlZGVkIGJ5IGEgbm9uLXNwYWNlIGNoYXJcbiAgICAvLyAtIGVuZCB3aXRoICcgJyBvciAnOidcbiAgICByZXR1cm4gaW1wbGljaXRLZXkgfHwgaW5GbG93IHx8IHZhbHVlLmluZGV4T2YoJ1xcbicpID09PSAtMSA/IHZhbHVlLmluZGV4T2YoJ1wiJykgIT09IC0xICYmIHZhbHVlLmluZGV4T2YoXCInXCIpID09PSAtMSA/IHNpbmdsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KSA6IGRvdWJsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KSA6IGJsb2NrU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gIH1cblxuICBpZiAoIWltcGxpY2l0S2V5ICYmICFpbkZsb3cgJiYgdHlwZSAhPT0gVHlwZS5QTEFJTiAmJiB2YWx1ZS5pbmRleE9mKCdcXG4nKSAhPT0gLTEpIHtcbiAgICAvLyBXaGVyZSBhbGxvd2VkICYgdHlwZSBub3Qgc2V0IGV4cGxpY2l0bHksIHByZWZlciBibG9jayBzdHlsZSBmb3IgbXVsdGlsaW5lIHN0cmluZ3NcbiAgICByZXR1cm4gYmxvY2tTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgfVxuXG4gIGlmIChpbmRlbnQgPT09ICcnICYmIGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIodmFsdWUpKSB7XG4gICAgY3R4LmZvcmNlQmxvY2tJbmRlbnQgPSB0cnVlO1xuICAgIHJldHVybiBibG9ja1N0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICB9XG5cbiAgdmFyIHN0ciA9IHZhbHVlLnJlcGxhY2UoL1xcbisvZywgXCIkJlxcblwiLmNvbmNhdChpbmRlbnQpKTsgLy8gVmVyaWZ5IHRoYXQgb3V0cHV0IHdpbGwgYmUgcGFyc2VkIGFzIGEgc3RyaW5nLCBhcyBlLmcuIHBsYWluIG51bWJlcnMgYW5kXG4gIC8vIGJvb2xlYW5zIGdldCBwYXJzZWQgd2l0aCB0aG9zZSB0eXBlcyBpbiB2MS4yIChlLmcuICc0MicsICd0cnVlJyAmICcwLjllLTMnKSxcbiAgLy8gYW5kIG90aGVycyBpbiB2MS4xLlxuXG4gIGlmIChhY3R1YWxTdHJpbmcpIHtcbiAgICB2YXIgdGFncyA9IGN0eC5kb2Muc2NoZW1hLnRhZ3M7XG4gICAgdmFyIHJlc29sdmVkID0gcmVzb2x2ZVNjYWxhcihzdHIsIHRhZ3MsIHRhZ3Muc2NhbGFyRmFsbGJhY2spLnZhbHVlO1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgIT09ICdzdHJpbmcnKSByZXR1cm4gZG91YmxlUXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICB9XG5cbiAgdmFyIGJvZHkgPSBpbXBsaWNpdEtleSA/IHN0ciA6IGZvbGRGbG93TGluZXMoc3RyLCBpbmRlbnQsIEZPTERfRkxPVywgZ2V0Rm9sZE9wdGlvbnMoY3R4KSk7XG5cbiAgaWYgKGNvbW1lbnQgJiYgIWluRmxvdyAmJiAoYm9keS5pbmRleE9mKCdcXG4nKSAhPT0gLTEgfHwgY29tbWVudC5pbmRleE9mKCdcXG4nKSAhPT0gLTEpKSB7XG4gICAgaWYgKG9uQ29tbWVudCkgb25Db21tZW50KCk7XG4gICAgcmV0dXJuIGFkZENvbW1lbnRCZWZvcmUoYm9keSwgaW5kZW50LCBjb21tZW50KTtcbiAgfVxuXG4gIHJldHVybiBib2R5O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gIHZhciBkZWZhdWx0VHlwZSA9IHN0ck9wdGlvbnMuZGVmYXVsdFR5cGU7XG4gIHZhciBpbXBsaWNpdEtleSA9IGN0eC5pbXBsaWNpdEtleSxcbiAgICAgIGluRmxvdyA9IGN0eC5pbkZsb3c7XG4gIHZhciBfaXRlbSA9IGl0ZW0sXG4gICAgICB0eXBlID0gX2l0ZW0udHlwZSxcbiAgICAgIHZhbHVlID0gX2l0ZW0udmFsdWU7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgaXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0sIHtcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pO1xuICB9XG5cbiAgdmFyIF9zdHJpbmdpZnkgPSBmdW5jdGlvbiBfc3RyaW5naWZ5KF90eXBlKSB7XG4gICAgc3dpdGNoIChfdHlwZSkge1xuICAgICAgY2FzZSBUeXBlLkJMT0NLX0ZPTERFRDpcbiAgICAgIGNhc2UgVHlwZS5CTE9DS19MSVRFUkFMOlxuICAgICAgICByZXR1cm4gYmxvY2tTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcblxuICAgICAgY2FzZSBUeXBlLlFVT1RFX0RPVUJMRTpcbiAgICAgICAgcmV0dXJuIGRvdWJsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcblxuICAgICAgY2FzZSBUeXBlLlFVT1RFX1NJTkdMRTpcbiAgICAgICAgcmV0dXJuIHNpbmdsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcblxuICAgICAgY2FzZSBUeXBlLlBMQUlOOlxuICAgICAgICByZXR1cm4gcGxhaW5TdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIGlmICh0eXBlICE9PSBUeXBlLlFVT1RFX0RPVUJMRSAmJiAvW1xceDAwLVxceDA4XFx4MGItXFx4MWZcXHg3Zi1cXHg5Zl0vLnRlc3QodmFsdWUpKSB7XG4gICAgLy8gZm9yY2UgZG91YmxlIHF1b3RlcyBvbiBjb250cm9sIGNoYXJhY3RlcnNcbiAgICB0eXBlID0gVHlwZS5RVU9URV9ET1VCTEU7XG4gIH0gZWxzZSBpZiAoKGltcGxpY2l0S2V5IHx8IGluRmxvdykgJiYgKHR5cGUgPT09IFR5cGUuQkxPQ0tfRk9MREVEIHx8IHR5cGUgPT09IFR5cGUuQkxPQ0tfTElURVJBTCkpIHtcbiAgICAvLyBzaG91bGQgbm90IGhhcHBlbjsgYmxvY2tzIGFyZSBub3QgdmFsaWQgaW5zaWRlIGZsb3cgY29udGFpbmVyc1xuICAgIHR5cGUgPSBUeXBlLlFVT1RFX0RPVUJMRTtcbiAgfVxuXG4gIHZhciByZXMgPSBfc3RyaW5naWZ5KHR5cGUpO1xuXG4gIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICByZXMgPSBfc3RyaW5naWZ5KGRlZmF1bHRUeXBlKTtcbiAgICBpZiAocmVzID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBkZWZhdWx0IHN0cmluZyB0eXBlIFwiLmNvbmNhdChkZWZhdWx0VHlwZSkpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5TnVtYmVyKF9yZWYpIHtcbiAgdmFyIGZvcm1hdCA9IF9yZWYuZm9ybWF0LFxuICAgICAgbWluRnJhY3Rpb25EaWdpdHMgPSBfcmVmLm1pbkZyYWN0aW9uRGlnaXRzLFxuICAgICAgdGFnID0gX3JlZi50YWcsXG4gICAgICB2YWx1ZSA9IF9yZWYudmFsdWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKSByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiBpc05hTih2YWx1ZSkgPyAnLm5hbicgOiB2YWx1ZSA8IDAgPyAnLS5pbmYnIDogJy5pbmYnO1xuICB2YXIgbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICBpZiAoIWZvcm1hdCAmJiBtaW5GcmFjdGlvbkRpZ2l0cyAmJiAoIXRhZyB8fCB0YWcgPT09ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcpICYmIC9eXFxkLy50ZXN0KG4pKSB7XG4gICAgdmFyIGkgPSBuLmluZGV4T2YoJy4nKTtcblxuICAgIGlmIChpIDwgMCkge1xuICAgICAgaSA9IG4ubGVuZ3RoO1xuICAgICAgbiArPSAnLic7XG4gICAgfVxuXG4gICAgdmFyIGQgPSBtaW5GcmFjdGlvbkRpZ2l0cyAtIChuLmxlbmd0aCAtIGkgLSAxKTtcblxuICAgIHdoaWxlIChkLS0gPiAwKSB7XG4gICAgICBuICs9ICcwJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gY2hlY2tGbG93Q29sbGVjdGlvbkVuZChlcnJvcnMsIGNzdCkge1xuICB2YXIgY2hhciwgbmFtZTtcblxuICBzd2l0Y2ggKGNzdC50eXBlKSB7XG4gICAgY2FzZSBUeXBlLkZMT1dfTUFQOlxuICAgICAgY2hhciA9ICd9JztcbiAgICAgIG5hbWUgPSAnZmxvdyBtYXAnO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFR5cGUuRkxPV19TRVE6XG4gICAgICBjaGFyID0gJ10nO1xuICAgICAgbmFtZSA9ICdmbG93IHNlcXVlbmNlJztcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGVycm9ycy5wdXNoKG5ldyBZQU1MU2VtYW50aWNFcnJvcihjc3QsICdOb3QgYSBmbG93IGNvbGxlY3Rpb24hPycpKTtcbiAgICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBsYXN0SXRlbTtcblxuICBmb3IgKHZhciBpID0gY3N0Lml0ZW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgdmFyIGl0ZW0gPSBjc3QuaXRlbXNbaV07XG5cbiAgICBpZiAoIWl0ZW0gfHwgaXRlbS50eXBlICE9PSBUeXBlLkNPTU1FTlQpIHtcbiAgICAgIGxhc3RJdGVtID0gaXRlbTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChsYXN0SXRlbSAmJiBsYXN0SXRlbS5jaGFyICE9PSBjaGFyKSB7XG4gICAgdmFyIG1zZyA9IFwiRXhwZWN0ZWQgXCIuY29uY2F0KG5hbWUsIFwiIHRvIGVuZCB3aXRoIFwiKS5jb25jYXQoY2hhcik7XG4gICAgdmFyIGVycjtcblxuICAgIGlmICh0eXBlb2YgbGFzdEl0ZW0ub2Zmc2V0ID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyID0gbmV3IFlBTUxTZW1hbnRpY0Vycm9yKGNzdCwgbXNnKTtcbiAgICAgIGVyci5vZmZzZXQgPSBsYXN0SXRlbS5vZmZzZXQgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnIgPSBuZXcgWUFNTFNlbWFudGljRXJyb3IobGFzdEl0ZW0sIG1zZyk7XG4gICAgICBpZiAobGFzdEl0ZW0ucmFuZ2UgJiYgbGFzdEl0ZW0ucmFuZ2UuZW5kKSBlcnIub2Zmc2V0ID0gbGFzdEl0ZW0ucmFuZ2UuZW5kIC0gbGFzdEl0ZW0ucmFuZ2Uuc3RhcnQ7XG4gICAgfVxuXG4gICAgZXJyb3JzLnB1c2goZXJyKTtcbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tGbG93Q29tbWVudFNwYWNlKGVycm9ycywgY29tbWVudCkge1xuICB2YXIgcHJldiA9IGNvbW1lbnQuY29udGV4dC5zcmNbY29tbWVudC5yYW5nZS5zdGFydCAtIDFdO1xuXG4gIGlmIChwcmV2ICE9PSAnXFxuJyAmJiBwcmV2ICE9PSAnXFx0JyAmJiBwcmV2ICE9PSAnICcpIHtcbiAgICB2YXIgbXNnID0gJ0NvbW1lbnRzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gb3RoZXIgdG9rZW5zIGJ5IHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMnO1xuICAgIGVycm9ycy5wdXNoKG5ldyBZQU1MU2VtYW50aWNFcnJvcihjb21tZW50LCBtc2cpKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0TG9uZ0tleUVycm9yKHNvdXJjZSwga2V5KSB7XG4gIHZhciBzayA9IFN0cmluZyhrZXkpO1xuICB2YXIgayA9IHNrLnN1YnN0cigwLCA4KSArICcuLi4nICsgc2suc3Vic3RyKC04KTtcbiAgcmV0dXJuIG5ldyBZQU1MU2VtYW50aWNFcnJvcihzb3VyY2UsIFwiVGhlIFxcXCJcIi5jb25jYXQoaywgXCJcXFwiIGtleSBpcyB0b28gbG9uZ1wiKSk7XG59XG5mdW5jdGlvbiByZXNvbHZlQ29tbWVudHMoY29sbGVjdGlvbiwgY29tbWVudHMpIHtcbiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGNvbW1lbnRzKSxcbiAgICAgIF9zdGVwO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciBfc3RlcCR2YWx1ZSA9IF9zdGVwLnZhbHVlLFxuICAgICAgICAgIGFmdGVyS2V5ID0gX3N0ZXAkdmFsdWUuYWZ0ZXJLZXksXG4gICAgICAgICAgYmVmb3JlID0gX3N0ZXAkdmFsdWUuYmVmb3JlLFxuICAgICAgICAgIGNvbW1lbnQgPSBfc3RlcCR2YWx1ZS5jb21tZW50O1xuICAgICAgdmFyIGl0ZW0gPSBjb2xsZWN0aW9uLml0ZW1zW2JlZm9yZV07XG5cbiAgICAgIGlmICghaXRlbSkge1xuICAgICAgICBpZiAoY29tbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNvbGxlY3Rpb24uY29tbWVudCkgY29sbGVjdGlvbi5jb21tZW50ICs9ICdcXG4nICsgY29tbWVudDtlbHNlIGNvbGxlY3Rpb24uY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChhZnRlcktleSAmJiBpdGVtLnZhbHVlKSBpdGVtID0gaXRlbS52YWx1ZTtcblxuICAgICAgICBpZiAoY29tbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGFmdGVyS2V5IHx8ICFpdGVtLmNvbW1lbnRCZWZvcmUpIGl0ZW0uc3BhY2VCZWZvcmUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpdGVtLmNvbW1lbnRCZWZvcmUpIGl0ZW0uY29tbWVudEJlZm9yZSArPSAnXFxuJyArIGNvbW1lbnQ7ZWxzZSBpdGVtLmNvbW1lbnRCZWZvcmUgPSBjb21tZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cbn1cblxuLy8gb24gZXJyb3IsIHdpbGwgcmV0dXJuIHsgc3RyOiBzdHJpbmcsIGVycm9yczogRXJyb3JbXSB9XG5mdW5jdGlvbiByZXNvbHZlU3RyaW5nKGRvYywgbm9kZSkge1xuICB2YXIgcmVzID0gbm9kZS5zdHJWYWx1ZTtcbiAgaWYgKCFyZXMpIHJldHVybiAnJztcbiAgaWYgKHR5cGVvZiByZXMgPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzO1xuICByZXMuZXJyb3JzLmZvckVhY2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaWYgKCFlcnJvci5zb3VyY2UpIGVycm9yLnNvdXJjZSA9IG5vZGU7XG4gICAgZG9jLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgfSk7XG4gIHJldHVybiByZXMuc3RyO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVGFnSGFuZGxlKGRvYywgbm9kZSkge1xuICB2YXIgX25vZGUkdGFnID0gbm9kZS50YWcsXG4gICAgICBoYW5kbGUgPSBfbm9kZSR0YWcuaGFuZGxlLFxuICAgICAgc3VmZml4ID0gX25vZGUkdGFnLnN1ZmZpeDtcbiAgdmFyIHByZWZpeCA9IGRvYy50YWdQcmVmaXhlcy5maW5kKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHAuaGFuZGxlID09PSBoYW5kbGU7XG4gIH0pO1xuXG4gIGlmICghcHJlZml4KSB7XG4gICAgdmFyIGR0cCA9IGRvYy5nZXREZWZhdWx0cygpLnRhZ1ByZWZpeGVzO1xuICAgIGlmIChkdHApIHByZWZpeCA9IGR0cC5maW5kKGZ1bmN0aW9uIChwKSB7XG4gICAgICByZXR1cm4gcC5oYW5kbGUgPT09IGhhbmRsZTtcbiAgICB9KTtcbiAgICBpZiAoIXByZWZpeCkgdGhyb3cgbmV3IFlBTUxTZW1hbnRpY0Vycm9yKG5vZGUsIFwiVGhlIFwiLmNvbmNhdChoYW5kbGUsIFwiIHRhZyBoYW5kbGUgaXMgbm9uLWRlZmF1bHQgYW5kIHdhcyBub3QgZGVjbGFyZWQuXCIpKTtcbiAgfVxuXG4gIGlmICghc3VmZml4KSB0aHJvdyBuZXcgWUFNTFNlbWFudGljRXJyb3Iobm9kZSwgXCJUaGUgXCIuY29uY2F0KGhhbmRsZSwgXCIgdGFnIGhhcyBubyBzdWZmaXguXCIpKTtcblxuICBpZiAoaGFuZGxlID09PSAnIScgJiYgKGRvYy52ZXJzaW9uIHx8IGRvYy5vcHRpb25zLnZlcnNpb24pID09PSAnMS4wJykge1xuICAgIGlmIChzdWZmaXhbMF0gPT09ICdeJykge1xuICAgICAgZG9jLndhcm5pbmdzLnB1c2gobmV3IFlBTUxXYXJuaW5nKG5vZGUsICdZQU1MIDEuMCBeIHRhZyBleHBhbnNpb24gaXMgbm90IHN1cHBvcnRlZCcpKTtcbiAgICAgIHJldHVybiBzdWZmaXg7XG4gICAgfVxuXG4gICAgaWYgKC9bOi9dLy50ZXN0KHN1ZmZpeCkpIHtcbiAgICAgIC8vIHdvcmQvZm9vIC0+IHRhZzp3b3JkLnlhbWwub3JnLDIwMDI6Zm9vXG4gICAgICB2YXIgdm9jYWIgPSBzdWZmaXgubWF0Y2goL14oW2EtejAtOS1dKylcXC8oLiopL2kpO1xuICAgICAgcmV0dXJuIHZvY2FiID8gXCJ0YWc6XCIuY29uY2F0KHZvY2FiWzFdLCBcIi55YW1sLm9yZywyMDAyOlwiKS5jb25jYXQodm9jYWJbMl0pIDogXCJ0YWc6XCIuY29uY2F0KHN1ZmZpeCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHByZWZpeC5wcmVmaXggKyBkZWNvZGVVUklDb21wb25lbnQoc3VmZml4KTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRhZ05hbWUoZG9jLCBub2RlKSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZyxcbiAgICAgIHR5cGUgPSBub2RlLnR5cGU7XG4gIHZhciBub25TcGVjaWZpYyA9IGZhbHNlO1xuXG4gIGlmICh0YWcpIHtcbiAgICB2YXIgaGFuZGxlID0gdGFnLmhhbmRsZSxcbiAgICAgICAgc3VmZml4ID0gdGFnLnN1ZmZpeCxcbiAgICAgICAgdmVyYmF0aW0gPSB0YWcudmVyYmF0aW07XG5cbiAgICBpZiAodmVyYmF0aW0pIHtcbiAgICAgIGlmICh2ZXJiYXRpbSAhPT0gJyEnICYmIHZlcmJhdGltICE9PSAnISEnKSByZXR1cm4gdmVyYmF0aW07XG4gICAgICB2YXIgbXNnID0gXCJWZXJiYXRpbSB0YWdzIGFyZW4ndCByZXNvbHZlZCwgc28gXCIuY29uY2F0KHZlcmJhdGltLCBcIiBpcyBpbnZhbGlkLlwiKTtcbiAgICAgIGRvYy5lcnJvcnMucHVzaChuZXcgWUFNTFNlbWFudGljRXJyb3Iobm9kZSwgbXNnKSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGUgPT09ICchJyAmJiAhc3VmZml4KSB7XG4gICAgICBub25TcGVjaWZpYyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlVGFnSGFuZGxlKGRvYywgbm9kZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBkb2MuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgVHlwZS5CTE9DS19GT0xERUQ6XG4gICAgY2FzZSBUeXBlLkJMT0NLX0xJVEVSQUw6XG4gICAgY2FzZSBUeXBlLlFVT1RFX0RPVUJMRTpcbiAgICBjYXNlIFR5cGUuUVVPVEVfU0lOR0xFOlxuICAgICAgcmV0dXJuIGRlZmF1bHRUYWdzLlNUUjtcblxuICAgIGNhc2UgVHlwZS5GTE9XX01BUDpcbiAgICBjYXNlIFR5cGUuTUFQOlxuICAgICAgcmV0dXJuIGRlZmF1bHRUYWdzLk1BUDtcblxuICAgIGNhc2UgVHlwZS5GTE9XX1NFUTpcbiAgICBjYXNlIFR5cGUuU0VROlxuICAgICAgcmV0dXJuIGRlZmF1bHRUYWdzLlNFUTtcblxuICAgIGNhc2UgVHlwZS5QTEFJTjpcbiAgICAgIHJldHVybiBub25TcGVjaWZpYyA/IGRlZmF1bHRUYWdzLlNUUiA6IG51bGw7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUJ5VGFnTmFtZShkb2MsIG5vZGUsIHRhZ05hbWUpIHtcbiAgdmFyIHRhZ3MgPSBkb2Muc2NoZW1hLnRhZ3M7XG4gIHZhciBtYXRjaFdpdGhUZXN0ID0gW107XG5cbiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHRhZ3MpLFxuICAgICAgX3N0ZXA7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgdmFyIHRhZyA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICBpZiAodGFnLnRhZyA9PT0gdGFnTmFtZSkge1xuICAgICAgICBpZiAodGFnLnRlc3QpIG1hdGNoV2l0aFRlc3QucHVzaCh0YWcpO2Vsc2Uge1xuICAgICAgICAgIHZhciByZXMgPSB0YWcucmVzb2x2ZShkb2MsIG5vZGUpO1xuICAgICAgICAgIHJldHVybiByZXMgaW5zdGFuY2VvZiBDb2xsZWN0aW9uID8gcmVzIDogbmV3IFNjYWxhcihyZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cblxuICB2YXIgc3RyID0gcmVzb2x2ZVN0cmluZyhkb2MsIG5vZGUpO1xuICBpZiAodHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgbWF0Y2hXaXRoVGVzdC5sZW5ndGggPiAwKSByZXR1cm4gcmVzb2x2ZVNjYWxhcihzdHIsIG1hdGNoV2l0aFRlc3QsIHRhZ3Muc2NhbGFyRmFsbGJhY2spO1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0RmFsbGJhY2tUYWdOYW1lKF9yZWYpIHtcbiAgdmFyIHR5cGUgPSBfcmVmLnR5cGU7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBUeXBlLkZMT1dfTUFQOlxuICAgIGNhc2UgVHlwZS5NQVA6XG4gICAgICByZXR1cm4gZGVmYXVsdFRhZ3MuTUFQO1xuXG4gICAgY2FzZSBUeXBlLkZMT1dfU0VROlxuICAgIGNhc2UgVHlwZS5TRVE6XG4gICAgICByZXR1cm4gZGVmYXVsdFRhZ3MuU0VRO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBkZWZhdWx0VGFncy5TVFI7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRhZyhkb2MsIG5vZGUsIHRhZ05hbWUpIHtcbiAgdHJ5IHtcbiAgICB2YXIgcmVzID0gcmVzb2x2ZUJ5VGFnTmFtZShkb2MsIG5vZGUsIHRhZ05hbWUpO1xuXG4gICAgaWYgKHJlcykge1xuICAgICAgaWYgKHRhZ05hbWUgJiYgbm9kZS50YWcpIHJlcy50YWcgPSB0YWdOYW1lO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCFlcnJvci5zb3VyY2UpIGVycm9yLnNvdXJjZSA9IG5vZGU7XG4gICAgZG9jLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgdmFyIGZhbGxiYWNrID0gZ2V0RmFsbGJhY2tUYWdOYW1lKG5vZGUpO1xuICAgIGlmICghZmFsbGJhY2spIHRocm93IG5ldyBFcnJvcihcIlRoZSB0YWcgXCIuY29uY2F0KHRhZ05hbWUsIFwiIGlzIHVuYXZhaWxhYmxlXCIpKTtcbiAgICB2YXIgbXNnID0gXCJUaGUgdGFnIFwiLmNvbmNhdCh0YWdOYW1lLCBcIiBpcyB1bmF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIFwiKS5jb25jYXQoZmFsbGJhY2spO1xuICAgIGRvYy53YXJuaW5ncy5wdXNoKG5ldyBZQU1MV2FybmluZyhub2RlLCBtc2cpKTtcblxuICAgIHZhciBfcmVzID0gcmVzb2x2ZUJ5VGFnTmFtZShkb2MsIG5vZGUsIGZhbGxiYWNrKTtcblxuICAgIF9yZXMudGFnID0gdGFnTmFtZTtcbiAgICByZXR1cm4gX3JlcztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB2YXIgcmVmRXJyb3IgPSBuZXcgWUFNTFJlZmVyZW5jZUVycm9yKG5vZGUsIGVycm9yLm1lc3NhZ2UpO1xuICAgIHJlZkVycm9yLnN0YWNrID0gZXJyb3Iuc3RhY2s7XG4gICAgZG9jLmVycm9ycy5wdXNoKHJlZkVycm9yKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG52YXIgaXNDb2xsZWN0aW9uSXRlbSA9IGZ1bmN0aW9uIGlzQ29sbGVjdGlvbkl0ZW0obm9kZSkge1xuICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgdmFyIHR5cGUgPSBub2RlLnR5cGU7XG4gIHJldHVybiB0eXBlID09PSBUeXBlLk1BUF9LRVkgfHwgdHlwZSA9PT0gVHlwZS5NQVBfVkFMVUUgfHwgdHlwZSA9PT0gVHlwZS5TRVFfSVRFTTtcbn07XG5cbmZ1bmN0aW9uIHJlc29sdmVOb2RlUHJvcHMoZXJyb3JzLCBub2RlKSB7XG4gIHZhciBjb21tZW50cyA9IHtcbiAgICBiZWZvcmU6IFtdLFxuICAgIGFmdGVyOiBbXVxuICB9O1xuICB2YXIgaGFzQW5jaG9yID0gZmFsc2U7XG4gIHZhciBoYXNUYWcgPSBmYWxzZTtcbiAgdmFyIHByb3BzID0gaXNDb2xsZWN0aW9uSXRlbShub2RlLmNvbnRleHQucGFyZW50KSA/IG5vZGUuY29udGV4dC5wYXJlbnQucHJvcHMuY29uY2F0KG5vZGUucHJvcHMpIDogbm9kZS5wcm9wcztcblxuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocHJvcHMpLFxuICAgICAgX3N0ZXA7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgdmFyIF9zdGVwJHZhbHVlID0gX3N0ZXAudmFsdWUsXG4gICAgICAgICAgc3RhcnQgPSBfc3RlcCR2YWx1ZS5zdGFydCxcbiAgICAgICAgICBlbmQgPSBfc3RlcCR2YWx1ZS5lbmQ7XG5cbiAgICAgIHN3aXRjaCAobm9kZS5jb250ZXh0LnNyY1tzdGFydF0pIHtcbiAgICAgICAgY2FzZSBDaGFyLkNPTU1FTlQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFub2RlLmNvbW1lbnRIYXNSZXF1aXJlZFdoaXRlc3BhY2Uoc3RhcnQpKSB7XG4gICAgICAgICAgICAgIHZhciBtc2cgPSAnQ29tbWVudHMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBvdGhlciB0b2tlbnMgYnkgd2hpdGUgc3BhY2UgY2hhcmFjdGVycyc7XG4gICAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBZQU1MU2VtYW50aWNFcnJvcihub2RlLCBtc2cpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGhlYWRlciA9IG5vZGUuaGVhZGVyLFxuICAgICAgICAgICAgICAgIHZhbHVlUmFuZ2UgPSBub2RlLnZhbHVlUmFuZ2U7XG4gICAgICAgICAgICB2YXIgY2MgPSB2YWx1ZVJhbmdlICYmIChzdGFydCA+IHZhbHVlUmFuZ2Uuc3RhcnQgfHwgaGVhZGVyICYmIHN0YXJ0ID4gaGVhZGVyLnN0YXJ0KSA/IGNvbW1lbnRzLmFmdGVyIDogY29tbWVudHMuYmVmb3JlO1xuICAgICAgICAgICAgY2MucHVzaChub2RlLmNvbnRleHQuc3JjLnNsaWNlKHN0YXJ0ICsgMSwgZW5kKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIC8vIEFjdHVhbCBhbmNob3IgJiB0YWcgcmVzb2x1dGlvbiBpcyBoYW5kbGVkIGJ5IHNjaGVtYSwgaGVyZSB3ZSBqdXN0IGNvbXBsYWluXG5cbiAgICAgICAgY2FzZSBDaGFyLkFOQ0hPUjpcbiAgICAgICAgICBpZiAoaGFzQW5jaG9yKSB7XG4gICAgICAgICAgICB2YXIgX21zZyA9ICdBIG5vZGUgY2FuIGhhdmUgYXQgbW9zdCBvbmUgYW5jaG9yJztcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBZQU1MU2VtYW50aWNFcnJvcihub2RlLCBfbXNnKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaGFzQW5jaG9yID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIENoYXIuVEFHOlxuICAgICAgICAgIGlmIChoYXNUYWcpIHtcbiAgICAgICAgICAgIHZhciBfbXNnMiA9ICdBIG5vZGUgY2FuIGhhdmUgYXQgbW9zdCBvbmUgdGFnJztcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBZQU1MU2VtYW50aWNFcnJvcihub2RlLCBfbXNnMikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGhhc1RhZyA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbW1lbnRzOiBjb21tZW50cyxcbiAgICBoYXNBbmNob3I6IGhhc0FuY2hvcixcbiAgICBoYXNUYWc6IGhhc1RhZ1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTm9kZVZhbHVlKGRvYywgbm9kZSkge1xuICB2YXIgYW5jaG9ycyA9IGRvYy5hbmNob3JzLFxuICAgICAgZXJyb3JzID0gZG9jLmVycm9ycyxcbiAgICAgIHNjaGVtYSA9IGRvYy5zY2hlbWE7XG5cbiAgaWYgKG5vZGUudHlwZSA9PT0gVHlwZS5BTElBUykge1xuICAgIHZhciBuYW1lID0gbm9kZS5yYXdWYWx1ZTtcbiAgICB2YXIgc3JjID0gYW5jaG9ycy5nZXROb2RlKG5hbWUpO1xuXG4gICAgaWYgKCFzcmMpIHtcbiAgICAgIHZhciBtc2cgPSBcIkFsaWFzZWQgYW5jaG9yIG5vdCBmb3VuZDogXCIuY29uY2F0KG5hbWUpO1xuICAgICAgZXJyb3JzLnB1c2gobmV3IFlBTUxSZWZlcmVuY2VFcnJvcihub2RlLCBtc2cpKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gLy8gTGF6eSByZXNvbHV0aW9uIGZvciBjaXJjdWxhciByZWZlcmVuY2VzXG5cblxuICAgIHZhciByZXMgPSBuZXcgQWxpYXMoc3JjKTtcblxuICAgIGFuY2hvcnMuX2NzdEFsaWFzZXMucHVzaChyZXMpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHZhciB0YWdOYW1lID0gcmVzb2x2ZVRhZ05hbWUoZG9jLCBub2RlKTtcbiAgaWYgKHRhZ05hbWUpIHJldHVybiByZXNvbHZlVGFnKGRvYywgbm9kZSwgdGFnTmFtZSk7XG5cbiAgaWYgKG5vZGUudHlwZSAhPT0gVHlwZS5QTEFJTikge1xuICAgIHZhciBfbXNnMyA9IFwiRmFpbGVkIHRvIHJlc29sdmUgXCIuY29uY2F0KG5vZGUudHlwZSwgXCIgbm9kZSBoZXJlXCIpO1xuXG4gICAgZXJyb3JzLnB1c2gobmV3IFlBTUxTeW50YXhFcnJvcihub2RlLCBfbXNnMykpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICB2YXIgc3RyID0gcmVzb2x2ZVN0cmluZyhkb2MsIG5vZGUpO1xuICAgIHJldHVybiByZXNvbHZlU2NhbGFyKHN0ciwgc2NoZW1hLnRhZ3MsIHNjaGVtYS50YWdzLnNjYWxhckZhbGxiYWNrKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIWVycm9yLnNvdXJjZSkgZXJyb3Iuc291cmNlID0gbm9kZTtcbiAgICBlcnJvcnMucHVzaChlcnJvcik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0gLy8gc2V0cyBub2RlLnJlc29sdmVkIG9uIHN1Y2Nlc3NcblxuXG5mdW5jdGlvbiByZXNvbHZlTm9kZShkb2MsIG5vZGUpIHtcbiAgaWYgKCFub2RlKSByZXR1cm4gbnVsbDtcbiAgaWYgKG5vZGUuZXJyb3IpIGRvYy5lcnJvcnMucHVzaChub2RlLmVycm9yKTtcblxuICB2YXIgX3Jlc29sdmVOb2RlUHJvcHMgPSByZXNvbHZlTm9kZVByb3BzKGRvYy5lcnJvcnMsIG5vZGUpLFxuICAgICAgY29tbWVudHMgPSBfcmVzb2x2ZU5vZGVQcm9wcy5jb21tZW50cyxcbiAgICAgIGhhc0FuY2hvciA9IF9yZXNvbHZlTm9kZVByb3BzLmhhc0FuY2hvcixcbiAgICAgIGhhc1RhZyA9IF9yZXNvbHZlTm9kZVByb3BzLmhhc1RhZztcblxuICBpZiAoaGFzQW5jaG9yKSB7XG4gICAgdmFyIGFuY2hvcnMgPSBkb2MuYW5jaG9ycztcbiAgICB2YXIgbmFtZSA9IG5vZGUuYW5jaG9yO1xuICAgIHZhciBwcmV2ID0gYW5jaG9ycy5nZXROb2RlKG5hbWUpOyAvLyBBdCB0aGlzIHBvaW50LCBhbGlhc2VzIGZvciBhbnkgcHJlY2VkaW5nIG5vZGUgd2l0aCB0aGUgc2FtZSBhbmNob3JcbiAgICAvLyBuYW1lIGhhdmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkLCBzbyBpdCBtYXkgc2FmZWx5IGJlIHJlbmFtZWQuXG5cbiAgICBpZiAocHJldikgYW5jaG9ycy5tYXBbYW5jaG9ycy5uZXdOYW1lKG5hbWUpXSA9IHByZXY7IC8vIER1cmluZyBwYXJzaW5nLCB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBDU1Qgbm9kZSBpbiBhbmNob3JzLm1hcCBhc1xuICAgIC8vIGFuY2hvcnMgbmVlZCB0byBiZSBhdmFpbGFibGUgZHVyaW5nIHJlc29sdXRpb24gdG8gYWxsb3cgZm9yXG4gICAgLy8gY2lyY3VsYXIgcmVmZXJlbmNlcy5cblxuICAgIGFuY2hvcnMubWFwW25hbWVdID0gbm9kZTtcbiAgfVxuXG4gIGlmIChub2RlLnR5cGUgPT09IFR5cGUuQUxJQVMgJiYgKGhhc0FuY2hvciB8fCBoYXNUYWcpKSB7XG4gICAgdmFyIG1zZyA9ICdBbiBhbGlhcyBub2RlIG11c3Qgbm90IHNwZWNpZnkgYW55IHByb3BlcnRpZXMnO1xuICAgIGRvYy5lcnJvcnMucHVzaChuZXcgWUFNTFNlbWFudGljRXJyb3Iobm9kZSwgbXNnKSk7XG4gIH1cblxuICB2YXIgcmVzID0gcmVzb2x2ZU5vZGVWYWx1ZShkb2MsIG5vZGUpO1xuXG4gIGlmIChyZXMpIHtcbiAgICByZXMucmFuZ2UgPSBbbm9kZS5yYW5nZS5zdGFydCwgbm9kZS5yYW5nZS5lbmRdO1xuICAgIGlmIChkb2Mub3B0aW9ucy5rZWVwQ3N0Tm9kZXMpIHJlcy5jc3ROb2RlID0gbm9kZTtcbiAgICBpZiAoZG9jLm9wdGlvbnMua2VlcE5vZGVUeXBlcykgcmVzLnR5cGUgPSBub2RlLnR5cGU7XG4gICAgdmFyIGNiID0gY29tbWVudHMuYmVmb3JlLmpvaW4oJ1xcbicpO1xuXG4gICAgaWYgKGNiKSB7XG4gICAgICByZXMuY29tbWVudEJlZm9yZSA9IHJlcy5jb21tZW50QmVmb3JlID8gXCJcIi5jb25jYXQocmVzLmNvbW1lbnRCZWZvcmUsIFwiXFxuXCIpLmNvbmNhdChjYikgOiBjYjtcbiAgICB9XG5cbiAgICB2YXIgY2EgPSBjb21tZW50cy5hZnRlci5qb2luKCdcXG4nKTtcbiAgICBpZiAoY2EpIHJlcy5jb21tZW50ID0gcmVzLmNvbW1lbnQgPyBcIlwiLmNvbmNhdChyZXMuY29tbWVudCwgXCJcXG5cIikuY29uY2F0KGNhKSA6IGNhO1xuICB9XG5cbiAgcmV0dXJuIG5vZGUucmVzb2x2ZWQgPSByZXM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVNYXAoZG9jLCBjc3QpIHtcbiAgaWYgKGNzdC50eXBlICE9PSBUeXBlLk1BUCAmJiBjc3QudHlwZSAhPT0gVHlwZS5GTE9XX01BUCkge1xuICAgIHZhciBtc2cgPSBcIkEgXCIuY29uY2F0KGNzdC50eXBlLCBcIiBub2RlIGNhbm5vdCBiZSByZXNvbHZlZCBhcyBhIG1hcHBpbmdcIik7XG4gICAgZG9jLmVycm9ycy5wdXNoKG5ldyBZQU1MU3ludGF4RXJyb3IoY3N0LCBtc2cpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBfcmVmID0gY3N0LnR5cGUgPT09IFR5cGUuRkxPV19NQVAgPyByZXNvbHZlRmxvd01hcEl0ZW1zKGRvYywgY3N0KSA6IHJlc29sdmVCbG9ja01hcEl0ZW1zKGRvYywgY3N0KSxcbiAgICAgIGNvbW1lbnRzID0gX3JlZi5jb21tZW50cyxcbiAgICAgIGl0ZW1zID0gX3JlZi5pdGVtcztcblxuICB2YXIgbWFwID0gbmV3IFlBTUxNYXAoKTtcbiAgbWFwLml0ZW1zID0gaXRlbXM7XG4gIHJlc29sdmVDb21tZW50cyhtYXAsIGNvbW1lbnRzKTtcbiAgdmFyIGhhc0NvbGxlY3Rpb25LZXkgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGlLZXkgPSBpdGVtc1tpXS5rZXk7XG4gICAgaWYgKGlLZXkgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSBoYXNDb2xsZWN0aW9uS2V5ID0gdHJ1ZTtcblxuICAgIGlmIChkb2Muc2NoZW1hLm1lcmdlICYmIGlLZXkgJiYgaUtleS52YWx1ZSA9PT0gTUVSR0VfS0VZKSB7XG4gICAgICBpdGVtc1tpXSA9IG5ldyBNZXJnZShpdGVtc1tpXSk7XG4gICAgICB2YXIgc291cmNlcyA9IGl0ZW1zW2ldLnZhbHVlLml0ZW1zO1xuICAgICAgdmFyIGVycm9yID0gbnVsbDtcbiAgICAgIHNvdXJjZXMuc29tZShmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEFsaWFzKSB7XG4gICAgICAgICAgLy8gRHVyaW5nIHBhcnNpbmcsIGFsaWFzIHNvdXJjZXMgYXJlIENTVCBub2RlczsgdG8gYWNjb3VudCBmb3JcbiAgICAgICAgICAvLyBjaXJjdWxhciByZWZlcmVuY2VzIHRoZWlyIHJlc29sdmVkIHZhbHVlcyBjYW4ndCBiZSB1c2VkIGhlcmUuXG4gICAgICAgICAgdmFyIHR5cGUgPSBub2RlLnNvdXJjZS50eXBlO1xuICAgICAgICAgIGlmICh0eXBlID09PSBUeXBlLk1BUCB8fCB0eXBlID09PSBUeXBlLkZMT1dfTUFQKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIGVycm9yID0gJ01lcmdlIG5vZGVzIGFsaWFzZXMgY2FuIG9ubHkgcG9pbnQgdG8gbWFwcyc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXJyb3IgPSAnTWVyZ2Ugbm9kZXMgY2FuIG9ubHkgaGF2ZSBBbGlhcyBub2RlcyBhcyB2YWx1ZXMnO1xuICAgICAgfSk7XG4gICAgICBpZiAoZXJyb3IpIGRvYy5lcnJvcnMucHVzaChuZXcgWUFNTFNlbWFudGljRXJyb3IoY3N0LCBlcnJvcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBqID0gaSArIDE7IGogPCBpdGVtcy5sZW5ndGg7ICsraikge1xuICAgICAgICB2YXIgaktleSA9IGl0ZW1zW2pdLmtleTtcblxuICAgICAgICBpZiAoaUtleSA9PT0gaktleSB8fCBpS2V5ICYmIGpLZXkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGlLZXksICd2YWx1ZScpICYmIGlLZXkudmFsdWUgPT09IGpLZXkudmFsdWUpIHtcbiAgICAgICAgICB2YXIgX21zZyA9IFwiTWFwIGtleXMgbXVzdCBiZSB1bmlxdWU7IFxcXCJcIi5jb25jYXQoaUtleSwgXCJcXFwiIGlzIHJlcGVhdGVkXCIpO1xuXG4gICAgICAgICAgZG9jLmVycm9ycy5wdXNoKG5ldyBZQU1MU2VtYW50aWNFcnJvcihjc3QsIF9tc2cpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChoYXNDb2xsZWN0aW9uS2V5ICYmICFkb2Mub3B0aW9ucy5tYXBBc01hcCkge1xuICAgIHZhciB3YXJuID0gJ0tleXMgd2l0aCBjb2xsZWN0aW9uIHZhbHVlcyB3aWxsIGJlIHN0cmluZ2lmaWVkIGFzIFlBTUwgZHVlIHRvIEpTIE9iamVjdCByZXN0cmljdGlvbnMuIFVzZSBtYXBBc01hcDogdHJ1ZSB0byBhdm9pZCB0aGlzLic7XG4gICAgZG9jLndhcm5pbmdzLnB1c2gobmV3IFlBTUxXYXJuaW5nKGNzdCwgd2FybikpO1xuICB9XG5cbiAgY3N0LnJlc29sdmVkID0gbWFwO1xuICByZXR1cm4gbWFwO1xufVxuXG52YXIgdmFsdWVIYXNQYWlyQ29tbWVudCA9IGZ1bmN0aW9uIHZhbHVlSGFzUGFpckNvbW1lbnQoX3JlZjIpIHtcbiAgdmFyIF9yZWYyJGNvbnRleHQgPSBfcmVmMi5jb250ZXh0LFxuICAgICAgbGluZVN0YXJ0ID0gX3JlZjIkY29udGV4dC5saW5lU3RhcnQsXG4gICAgICBub2RlID0gX3JlZjIkY29udGV4dC5ub2RlLFxuICAgICAgc3JjID0gX3JlZjIkY29udGV4dC5zcmMsXG4gICAgICBwcm9wcyA9IF9yZWYyLnByb3BzO1xuICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzdGFydCA9IHByb3BzWzBdLnN0YXJ0O1xuICBpZiAobm9kZSAmJiBzdGFydCA+IG5vZGUudmFsdWVSYW5nZS5zdGFydCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoc3JjW3N0YXJ0XSAhPT0gQ2hhci5DT01NRU5UKSByZXR1cm4gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGxpbmVTdGFydDsgaSA8IHN0YXJ0OyArK2kpIHtcbiAgICBpZiAoc3JjW2ldID09PSAnXFxuJykgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiByZXNvbHZlUGFpckNvbW1lbnQoaXRlbSwgcGFpcikge1xuICBpZiAoIXZhbHVlSGFzUGFpckNvbW1lbnQoaXRlbSkpIHJldHVybjtcbiAgdmFyIGNvbW1lbnQgPSBpdGVtLmdldFByb3BWYWx1ZSgwLCBDaGFyLkNPTU1FTlQsIHRydWUpO1xuICB2YXIgZm91bmQgPSBmYWxzZTtcbiAgdmFyIGNiID0gcGFpci52YWx1ZS5jb21tZW50QmVmb3JlO1xuXG4gIGlmIChjYiAmJiBjYi5zdGFydHNXaXRoKGNvbW1lbnQpKSB7XG4gICAgcGFpci52YWx1ZS5jb21tZW50QmVmb3JlID0gY2Iuc3Vic3RyKGNvbW1lbnQubGVuZ3RoICsgMSk7XG4gICAgZm91bmQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBjYyA9IHBhaXIudmFsdWUuY29tbWVudDtcblxuICAgIGlmICghaXRlbS5ub2RlICYmIGNjICYmIGNjLnN0YXJ0c1dpdGgoY29tbWVudCkpIHtcbiAgICAgIHBhaXIudmFsdWUuY29tbWVudCA9IGNjLnN1YnN0cihjb21tZW50Lmxlbmd0aCArIDEpO1xuICAgICAgZm91bmQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChmb3VuZCkgcGFpci5jb21tZW50ID0gY29tbWVudDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrTWFwSXRlbXMoZG9jLCBjc3QpIHtcbiAgdmFyIGNvbW1lbnRzID0gW107XG4gIHZhciBpdGVtcyA9IFtdO1xuICB2YXIga2V5ID0gdW5kZWZpbmVkO1xuICB2YXIga2V5U3RhcnQgPSBudWxsO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY3N0Lml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGl0ZW0gPSBjc3QuaXRlbXNbaV07XG5cbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgY2FzZSBUeXBlLkJMQU5LX0xJTkU6XG4gICAgICAgIGNvbW1lbnRzLnB1c2goe1xuICAgICAgICAgIGFmdGVyS2V5OiAhIWtleSxcbiAgICAgICAgICBiZWZvcmU6IGl0ZW1zLmxlbmd0aFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVHlwZS5DT01NRU5UOlxuICAgICAgICBjb21tZW50cy5wdXNoKHtcbiAgICAgICAgICBhZnRlcktleTogISFrZXksXG4gICAgICAgICAgYmVmb3JlOiBpdGVtcy5sZW5ndGgsXG4gICAgICAgICAgY29tbWVudDogaXRlbS5jb21tZW50XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUeXBlLk1BUF9LRVk6XG4gICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgaXRlbXMucHVzaChuZXcgUGFpcihrZXkpKTtcbiAgICAgICAgaWYgKGl0ZW0uZXJyb3IpIGRvYy5lcnJvcnMucHVzaChpdGVtLmVycm9yKTtcbiAgICAgICAga2V5ID0gcmVzb2x2ZU5vZGUoZG9jLCBpdGVtLm5vZGUpO1xuICAgICAgICBrZXlTdGFydCA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFR5cGUuTUFQX1ZBTFVFOlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSBrZXkgPSBudWxsO1xuICAgICAgICAgIGlmIChpdGVtLmVycm9yKSBkb2MuZXJyb3JzLnB1c2goaXRlbS5lcnJvcik7XG5cbiAgICAgICAgICBpZiAoIWl0ZW0uY29udGV4dC5hdExpbmVTdGFydCAmJiBpdGVtLm5vZGUgJiYgaXRlbS5ub2RlLnR5cGUgPT09IFR5cGUuTUFQICYmICFpdGVtLm5vZGUuY29udGV4dC5hdExpbmVTdGFydCkge1xuICAgICAgICAgICAgdmFyIG1zZyA9ICdOZXN0ZWQgbWFwcGluZ3MgYXJlIG5vdCBhbGxvd2VkIGluIGNvbXBhY3QgbWFwcGluZ3MnO1xuICAgICAgICAgICAgZG9jLmVycm9ycy5wdXNoKG5ldyBZQU1MU2VtYW50aWNFcnJvcihpdGVtLm5vZGUsIG1zZykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciB2YWx1ZU5vZGUgPSBpdGVtLm5vZGU7XG5cbiAgICAgICAgICBpZiAoIXZhbHVlTm9kZSAmJiBpdGVtLnByb3BzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIENvbW1lbnRzIG9uIGFuIGVtcHR5IG1hcHBpbmcgdmFsdWUgbmVlZCB0byBiZSBwcmVzZXJ2ZWQsIHNvIHdlXG4gICAgICAgICAgICAvLyBuZWVkIHRvIGNvbnN0cnVjdCBhIG1pbmltYWwgZW1wdHkgbm9kZSBoZXJlIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZVxuICAgICAgICAgICAgLy8gbWlzc2luZyBgaXRlbS5ub2RlYC4gLS0gZWVtZWxpL3lhbWwjMTlcbiAgICAgICAgICAgIHZhbHVlTm9kZSA9IG5ldyBQbGFpblZhbHVlKFR5cGUuUExBSU4sIFtdKTtcbiAgICAgICAgICAgIHZhbHVlTm9kZS5jb250ZXh0ID0ge1xuICAgICAgICAgICAgICBwYXJlbnQ6IGl0ZW0sXG4gICAgICAgICAgICAgIHNyYzogaXRlbS5jb250ZXh0LnNyY1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBwb3MgPSBpdGVtLnJhbmdlLnN0YXJ0ICsgMTtcbiAgICAgICAgICAgIHZhbHVlTm9kZS5yYW5nZSA9IHtcbiAgICAgICAgICAgICAgc3RhcnQ6IHBvcyxcbiAgICAgICAgICAgICAgZW5kOiBwb3NcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YWx1ZU5vZGUudmFsdWVSYW5nZSA9IHtcbiAgICAgICAgICAgICAgc3RhcnQ6IHBvcyxcbiAgICAgICAgICAgICAgZW5kOiBwb3NcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbS5yYW5nZS5vcmlnU3RhcnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHZhciBvcmlnUG9zID0gaXRlbS5yYW5nZS5vcmlnU3RhcnQgKyAxO1xuICAgICAgICAgICAgICB2YWx1ZU5vZGUucmFuZ2Uub3JpZ1N0YXJ0ID0gdmFsdWVOb2RlLnJhbmdlLm9yaWdFbmQgPSBvcmlnUG9zO1xuICAgICAgICAgICAgICB2YWx1ZU5vZGUudmFsdWVSYW5nZS5vcmlnU3RhcnQgPSB2YWx1ZU5vZGUudmFsdWVSYW5nZS5vcmlnRW5kID0gb3JpZ1BvcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgcGFpciA9IG5ldyBQYWlyKGtleSwgcmVzb2x2ZU5vZGUoZG9jLCB2YWx1ZU5vZGUpKTtcbiAgICAgICAgICByZXNvbHZlUGFpckNvbW1lbnQoaXRlbSwgcGFpcik7XG4gICAgICAgICAgaXRlbXMucHVzaChwYWlyKTtcblxuICAgICAgICAgIGlmIChrZXkgJiYgdHlwZW9mIGtleVN0YXJ0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaWYgKGl0ZW0ucmFuZ2Uuc3RhcnQgPiBrZXlTdGFydCArIDEwMjQpIGRvYy5lcnJvcnMucHVzaChnZXRMb25nS2V5RXJyb3IoY3N0LCBrZXkpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBrZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAga2V5U3RhcnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIGl0ZW1zLnB1c2gobmV3IFBhaXIoa2V5KSk7XG4gICAgICAgIGtleSA9IHJlc29sdmVOb2RlKGRvYywgaXRlbSk7XG4gICAgICAgIGtleVN0YXJ0ID0gaXRlbS5yYW5nZS5zdGFydDtcbiAgICAgICAgaWYgKGl0ZW0uZXJyb3IpIGRvYy5lcnJvcnMucHVzaChpdGVtLmVycm9yKTtcblxuICAgICAgICBuZXh0OiBmb3IgKHZhciBqID0gaSArIDE7OyArK2opIHtcbiAgICAgICAgICB2YXIgbmV4dEl0ZW0gPSBjc3QuaXRlbXNbal07XG5cbiAgICAgICAgICBzd2l0Y2ggKG5leHRJdGVtICYmIG5leHRJdGVtLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgVHlwZS5CTEFOS19MSU5FOlxuICAgICAgICAgICAgY2FzZSBUeXBlLkNPTU1FTlQ6XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG5leHQ7XG5cbiAgICAgICAgICAgIGNhc2UgVHlwZS5NQVBfVkFMVUU6XG4gICAgICAgICAgICAgIGJyZWFrIG5leHQ7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX21zZzIgPSAnSW1wbGljaXQgbWFwIGtleXMgbmVlZCB0byBiZSBmb2xsb3dlZCBieSBtYXAgdmFsdWVzJztcbiAgICAgICAgICAgICAgICBkb2MuZXJyb3JzLnB1c2gobmV3IFlBTUxTZW1hbnRpY0Vycm9yKGl0ZW0sIF9tc2cyKSk7XG4gICAgICAgICAgICAgICAgYnJlYWsgbmV4dDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtLnZhbHVlUmFuZ2VDb250YWluc05ld2xpbmUpIHtcbiAgICAgICAgICB2YXIgX21zZzMgPSAnSW1wbGljaXQgbWFwIGtleXMgbmVlZCB0byBiZSBvbiBhIHNpbmdsZSBsaW5lJztcbiAgICAgICAgICBkb2MuZXJyb3JzLnB1c2gobmV3IFlBTUxTZW1hbnRpY0Vycm9yKGl0ZW0sIF9tc2czKSk7XG4gICAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgaXRlbXMucHVzaChuZXcgUGFpcihrZXkpKTtcbiAgcmV0dXJuIHtcbiAgICBjb21tZW50czogY29tbWVudHMsXG4gICAgaXRlbXM6IGl0ZW1zXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVGbG93TWFwSXRlbXMoZG9jLCBjc3QpIHtcbiAgdmFyIGNvbW1lbnRzID0gW107XG4gIHZhciBpdGVtcyA9IFtdO1xuICB2YXIga2V5ID0gdW5kZWZpbmVkO1xuICB2YXIgZXhwbGljaXRLZXkgPSBmYWxzZTtcbiAgdmFyIG5leHQgPSAneyc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjc3QuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgaXRlbSA9IGNzdC5pdGVtc1tpXTtcblxuICAgIGlmICh0eXBlb2YgaXRlbS5jaGFyID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGNoYXIgPSBpdGVtLmNoYXIsXG4gICAgICAgICAgb2Zmc2V0ID0gaXRlbS5vZmZzZXQ7XG5cbiAgICAgIGlmIChjaGFyID09PSAnPycgJiYga2V5ID09PSB1bmRlZmluZWQgJiYgIWV4cGxpY2l0S2V5KSB7XG4gICAgICAgIGV4cGxpY2l0S2V5ID0gdHJ1ZTtcbiAgICAgICAgbmV4dCA9ICc6JztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSAnOicpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSBrZXkgPSBudWxsO1xuXG4gICAgICAgIGlmIChuZXh0ID09PSAnOicpIHtcbiAgICAgICAgICBuZXh0ID0gJywnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZXhwbGljaXRLZXkpIHtcbiAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgJiYgY2hhciAhPT0gJywnKSBrZXkgPSBudWxsO1xuICAgICAgICAgIGV4cGxpY2l0S2V5ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpdGVtcy5wdXNoKG5ldyBQYWlyKGtleSkpO1xuICAgICAgICAgIGtleSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGlmIChjaGFyID09PSAnLCcpIHtcbiAgICAgICAgICAgIG5leHQgPSAnOic7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICd9Jykge1xuICAgICAgICBpZiAoaSA9PT0gY3N0Lml0ZW1zLmxlbmd0aCAtIDEpIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBuZXh0KSB7XG4gICAgICAgIG5leHQgPSAnOic7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbXNnID0gXCJGbG93IG1hcCBjb250YWlucyBhbiB1bmV4cGVjdGVkIFwiLmNvbmNhdChjaGFyKTtcbiAgICAgIHZhciBlcnIgPSBuZXcgWUFNTFN5bnRheEVycm9yKGNzdCwgbXNnKTtcbiAgICAgIGVyci5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICBkb2MuZXJyb3JzLnB1c2goZXJyKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gVHlwZS5CTEFOS19MSU5FKSB7XG4gICAgICBjb21tZW50cy5wdXNoKHtcbiAgICAgICAgYWZ0ZXJLZXk6ICEha2V5LFxuICAgICAgICBiZWZvcmU6IGl0ZW1zLmxlbmd0aFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFR5cGUuQ09NTUVOVCkge1xuICAgICAgY2hlY2tGbG93Q29tbWVudFNwYWNlKGRvYy5lcnJvcnMsIGl0ZW0pO1xuICAgICAgY29tbWVudHMucHVzaCh7XG4gICAgICAgIGFmdGVyS2V5OiAhIWtleSxcbiAgICAgICAgYmVmb3JlOiBpdGVtcy5sZW5ndGgsXG4gICAgICAgIGNvbW1lbnQ6IGl0ZW0uY29tbWVudFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG5leHQgPT09ICcsJykgZG9jLmVycm9ycy5wdXNoKG5ldyBZQU1MU2VtYW50aWNFcnJvcihpdGVtLCAnU2VwYXJhdG9yICwgbWlzc2luZyBpbiBmbG93IG1hcCcpKTtcbiAgICAgIGtleSA9IHJlc29sdmVOb2RlKGRvYywgaXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXh0ICE9PSAnLCcpIGRvYy5lcnJvcnMucHVzaChuZXcgWUFNTFNlbWFudGljRXJyb3IoaXRlbSwgJ0luZGljYXRvciA6IG1pc3NpbmcgaW4gZmxvdyBtYXAgZW50cnknKSk7XG4gICAgICBpdGVtcy5wdXNoKG5ldyBQYWlyKGtleSwgcmVzb2x2ZU5vZGUoZG9jLCBpdGVtKSkpO1xuICAgICAga2V5ID0gdW5kZWZpbmVkO1xuICAgICAgZXhwbGljaXRLZXkgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjaGVja0Zsb3dDb2xsZWN0aW9uRW5kKGRvYy5lcnJvcnMsIGNzdCk7XG4gIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgaXRlbXMucHVzaChuZXcgUGFpcihrZXkpKTtcbiAgcmV0dXJuIHtcbiAgICBjb21tZW50czogY29tbWVudHMsXG4gICAgaXRlbXM6IGl0ZW1zXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTZXEoZG9jLCBjc3QpIHtcbiAgaWYgKGNzdC50eXBlICE9PSBUeXBlLlNFUSAmJiBjc3QudHlwZSAhPT0gVHlwZS5GTE9XX1NFUSkge1xuICAgIHZhciBtc2cgPSBcIkEgXCIuY29uY2F0KGNzdC50eXBlLCBcIiBub2RlIGNhbm5vdCBiZSByZXNvbHZlZCBhcyBhIHNlcXVlbmNlXCIpO1xuICAgIGRvYy5lcnJvcnMucHVzaChuZXcgWUFNTFN5bnRheEVycm9yKGNzdCwgbXNnKSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgX3JlZiA9IGNzdC50eXBlID09PSBUeXBlLkZMT1dfU0VRID8gcmVzb2x2ZUZsb3dTZXFJdGVtcyhkb2MsIGNzdCkgOiByZXNvbHZlQmxvY2tTZXFJdGVtcyhkb2MsIGNzdCksXG4gICAgICBjb21tZW50cyA9IF9yZWYuY29tbWVudHMsXG4gICAgICBpdGVtcyA9IF9yZWYuaXRlbXM7XG5cbiAgdmFyIHNlcSA9IG5ldyBZQU1MU2VxKCk7XG4gIHNlcS5pdGVtcyA9IGl0ZW1zO1xuICByZXNvbHZlQ29tbWVudHMoc2VxLCBjb21tZW50cyk7XG5cbiAgaWYgKCFkb2Mub3B0aW9ucy5tYXBBc01hcCAmJiBpdGVtcy5zb21lKGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBpdCBpbnN0YW5jZW9mIFBhaXIgJiYgaXQua2V5IGluc3RhbmNlb2YgQ29sbGVjdGlvbjtcbiAgfSkpIHtcbiAgICB2YXIgd2FybiA9ICdLZXlzIHdpdGggY29sbGVjdGlvbiB2YWx1ZXMgd2lsbCBiZSBzdHJpbmdpZmllZCBhcyBZQU1MIGR1ZSB0byBKUyBPYmplY3QgcmVzdHJpY3Rpb25zLiBVc2UgbWFwQXNNYXA6IHRydWUgdG8gYXZvaWQgdGhpcy4nO1xuICAgIGRvYy53YXJuaW5ncy5wdXNoKG5ldyBZQU1MV2FybmluZyhjc3QsIHdhcm4pKTtcbiAgfVxuXG4gIGNzdC5yZXNvbHZlZCA9IHNlcTtcbiAgcmV0dXJuIHNlcTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrU2VxSXRlbXMoZG9jLCBjc3QpIHtcbiAgdmFyIGNvbW1lbnRzID0gW107XG4gIHZhciBpdGVtcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY3N0Lml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGl0ZW0gPSBjc3QuaXRlbXNbaV07XG5cbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgY2FzZSBUeXBlLkJMQU5LX0xJTkU6XG4gICAgICAgIGNvbW1lbnRzLnB1c2goe1xuICAgICAgICAgIGJlZm9yZTogaXRlbXMubGVuZ3RoXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUeXBlLkNPTU1FTlQ6XG4gICAgICAgIGNvbW1lbnRzLnB1c2goe1xuICAgICAgICAgIGNvbW1lbnQ6IGl0ZW0uY29tbWVudCxcbiAgICAgICAgICBiZWZvcmU6IGl0ZW1zLmxlbmd0aFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVHlwZS5TRVFfSVRFTTpcbiAgICAgICAgaWYgKGl0ZW0uZXJyb3IpIGRvYy5lcnJvcnMucHVzaChpdGVtLmVycm9yKTtcbiAgICAgICAgaXRlbXMucHVzaChyZXNvbHZlTm9kZShkb2MsIGl0ZW0ubm9kZSkpO1xuXG4gICAgICAgIGlmIChpdGVtLmhhc1Byb3BzKSB7XG4gICAgICAgICAgdmFyIG1zZyA9ICdTZXF1ZW5jZSBpdGVtcyBjYW5ub3QgaGF2ZSB0YWdzIG9yIGFuY2hvcnMgYmVmb3JlIHRoZSAtIGluZGljYXRvcic7XG4gICAgICAgICAgZG9jLmVycm9ycy5wdXNoKG5ldyBZQU1MU2VtYW50aWNFcnJvcihpdGVtLCBtc2cpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoaXRlbS5lcnJvcikgZG9jLmVycm9ycy5wdXNoKGl0ZW0uZXJyb3IpO1xuICAgICAgICBkb2MuZXJyb3JzLnB1c2gobmV3IFlBTUxTeW50YXhFcnJvcihpdGVtLCBcIlVuZXhwZWN0ZWQgXCIuY29uY2F0KGl0ZW0udHlwZSwgXCIgbm9kZSBpbiBzZXF1ZW5jZVwiKSkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY29tbWVudHM6IGNvbW1lbnRzLFxuICAgIGl0ZW1zOiBpdGVtc1xuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmxvd1NlcUl0ZW1zKGRvYywgY3N0KSB7XG4gIHZhciBjb21tZW50cyA9IFtdO1xuICB2YXIgaXRlbXMgPSBbXTtcbiAgdmFyIGV4cGxpY2l0S2V5ID0gZmFsc2U7XG4gIHZhciBrZXkgPSB1bmRlZmluZWQ7XG4gIHZhciBrZXlTdGFydCA9IG51bGw7XG4gIHZhciBuZXh0ID0gJ1snO1xuICB2YXIgcHJldkl0ZW0gPSBudWxsO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY3N0Lml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGl0ZW0gPSBjc3QuaXRlbXNbaV07XG5cbiAgICBpZiAodHlwZW9mIGl0ZW0uY2hhciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBjaGFyID0gaXRlbS5jaGFyLFxuICAgICAgICAgIG9mZnNldCA9IGl0ZW0ub2Zmc2V0O1xuXG4gICAgICBpZiAoY2hhciAhPT0gJzonICYmIChleHBsaWNpdEtleSB8fCBrZXkgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgaWYgKGV4cGxpY2l0S2V5ICYmIGtleSA9PT0gdW5kZWZpbmVkKSBrZXkgPSBuZXh0ID8gaXRlbXMucG9wKCkgOiBudWxsO1xuICAgICAgICBpdGVtcy5wdXNoKG5ldyBQYWlyKGtleSkpO1xuICAgICAgICBleHBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgICBrZXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIGtleVN0YXJ0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IG5leHQpIHtcbiAgICAgICAgbmV4dCA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCFuZXh0ICYmIGNoYXIgPT09ICc/Jykge1xuICAgICAgICBleHBsaWNpdEtleSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKG5leHQgIT09ICdbJyAmJiBjaGFyID09PSAnOicgJiYga2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG5leHQgPT09ICcsJykge1xuICAgICAgICAgIGtleSA9IGl0ZW1zLnBvcCgpO1xuXG4gICAgICAgICAgaWYgKGtleSBpbnN0YW5jZW9mIFBhaXIpIHtcbiAgICAgICAgICAgIHZhciBtc2cgPSAnQ2hhaW5pbmcgZmxvdyBzZXF1ZW5jZSBwYWlycyBpcyBpbnZhbGlkJztcbiAgICAgICAgICAgIHZhciBlcnIgPSBuZXcgWUFNTFNlbWFudGljRXJyb3IoY3N0LCBtc2cpO1xuICAgICAgICAgICAgZXJyLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgICAgIGRvYy5lcnJvcnMucHVzaChlcnIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZXhwbGljaXRLZXkgJiYgdHlwZW9mIGtleVN0YXJ0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFyIGtleUVuZCA9IGl0ZW0ucmFuZ2UgPyBpdGVtLnJhbmdlLnN0YXJ0IDogaXRlbS5vZmZzZXQ7XG4gICAgICAgICAgICBpZiAoa2V5RW5kID4ga2V5U3RhcnQgKyAxMDI0KSBkb2MuZXJyb3JzLnB1c2goZ2V0TG9uZ0tleUVycm9yKGNzdCwga2V5KSk7XG4gICAgICAgICAgICB2YXIgc3JjID0gcHJldkl0ZW0uY29udGV4dC5zcmM7XG5cbiAgICAgICAgICAgIGZvciAodmFyIF9pID0ga2V5U3RhcnQ7IF9pIDwga2V5RW5kOyArK19pKSB7XG4gICAgICAgICAgICAgIGlmIChzcmNbX2ldID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgIHZhciBfbXNnID0gJ0ltcGxpY2l0IGtleXMgb2YgZmxvdyBzZXF1ZW5jZSBwYWlycyBuZWVkIHRvIGJlIG9uIGEgc2luZ2xlIGxpbmUnO1xuICAgICAgICAgICAgICAgIGRvYy5lcnJvcnMucHVzaChuZXcgWUFNTFNlbWFudGljRXJyb3IocHJldkl0ZW0sIF9tc2cpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrZXkgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAga2V5U3RhcnQgPSBudWxsO1xuICAgICAgICBleHBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgICBuZXh0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobmV4dCA9PT0gJ1snIHx8IGNoYXIgIT09ICddJyB8fCBpIDwgY3N0Lml0ZW1zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdmFyIF9tc2cyID0gXCJGbG93IHNlcXVlbmNlIGNvbnRhaW5zIGFuIHVuZXhwZWN0ZWQgXCIuY29uY2F0KGNoYXIpO1xuXG4gICAgICAgIHZhciBfZXJyID0gbmV3IFlBTUxTeW50YXhFcnJvcihjc3QsIF9tc2cyKTtcblxuICAgICAgICBfZXJyLm9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgZG9jLmVycm9ycy5wdXNoKF9lcnIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSBUeXBlLkJMQU5LX0xJTkUpIHtcbiAgICAgIGNvbW1lbnRzLnB1c2goe1xuICAgICAgICBiZWZvcmU6IGl0ZW1zLmxlbmd0aFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFR5cGUuQ09NTUVOVCkge1xuICAgICAgY2hlY2tGbG93Q29tbWVudFNwYWNlKGRvYy5lcnJvcnMsIGl0ZW0pO1xuICAgICAgY29tbWVudHMucHVzaCh7XG4gICAgICAgIGNvbW1lbnQ6IGl0ZW0uY29tbWVudCxcbiAgICAgICAgYmVmb3JlOiBpdGVtcy5sZW5ndGhcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV4dCkge1xuICAgICAgICB2YXIgX21zZzMgPSBcIkV4cGVjdGVkIGEgXCIuY29uY2F0KG5leHQsIFwiIGluIGZsb3cgc2VxdWVuY2VcIik7XG5cbiAgICAgICAgZG9jLmVycm9ycy5wdXNoKG5ldyBZQU1MU2VtYW50aWNFcnJvcihpdGVtLCBfbXNnMykpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWUgPSByZXNvbHZlTm9kZShkb2MsIGl0ZW0pO1xuXG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaXRlbXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIHByZXZJdGVtID0gaXRlbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1zLnB1c2gobmV3IFBhaXIoa2V5LCB2YWx1ZSkpO1xuICAgICAgICBrZXkgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGtleVN0YXJ0ID0gaXRlbS5yYW5nZS5zdGFydDtcbiAgICAgIG5leHQgPSAnLCc7XG4gICAgfVxuICB9XG5cbiAgY2hlY2tGbG93Q29sbGVjdGlvbkVuZChkb2MuZXJyb3JzLCBjc3QpO1xuICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIGl0ZW1zLnB1c2gobmV3IFBhaXIoa2V5KSk7XG4gIHJldHVybiB7XG4gICAgY29tbWVudHM6IGNvbW1lbnRzLFxuICAgIGl0ZW1zOiBpdGVtc1xuICB9O1xufVxuXG5leHBvcnQgeyBBbGlhcyBhcyBBLCBDb2xsZWN0aW9uIGFzIEMsIE1lcmdlIGFzIE0sIE5vZGUgYXMgTiwgUGFpciBhcyBQLCBTY2FsYXIgYXMgUywgWUFNTFNlcSBhcyBZLCBib29sT3B0aW9ucyBhcyBhLCBiaW5hcnlPcHRpb25zIGFzIGIsIHN0cmluZ2lmeVN0cmluZyBhcyBjLCBZQU1MTWFwIGFzIGQsIGlzRW1wdHlQYXRoIGFzIGUsIGFkZENvbW1lbnQgYXMgZiwgcmVzb2x2ZU1hcCBhcyBnLCByZXNvbHZlU2VxIGFzIGgsIGludE9wdGlvbnMgYXMgaSwgcmVzb2x2ZVN0cmluZyBhcyBqLCBzdHJpbmdpZnlOdW1iZXIgYXMgaywgZmluZFBhaXIgYXMgbCwgbnVsbE9wdGlvbnMgYXMgbiwgcmVzb2x2ZU5vZGUgYXMgciwgc3RyT3B0aW9ucyBhcyBzLCB0b0pTT04gYXMgdCB9O1xuIiwiaW1wb3J0IHsgbyBhcyBZQU1MUmVmZXJlbmNlRXJyb3IsIFQgYXMgVHlwZSwgZyBhcyBZQU1MU2VtYW50aWNFcnJvciwgXyBhcyBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciwgZSBhcyBfZGVmaW5lUHJvcGVydHksIGogYXMgX2luaGVyaXRzLCBrIGFzIF9jcmVhdGVTdXBlciwgYyBhcyBfY2xhc3NDYWxsQ2hlY2ssIHAgYXMgX2Fzc2VydFRoaXNJbml0aWFsaXplZCwgYiBhcyBfY3JlYXRlQ2xhc3MsIGEgYXMgX3R5cGVvZiwgbCBhcyBfZ2V0LCBtIGFzIF9nZXRQcm90b3R5cGVPZiB9IGZyb20gJy4vUGxhaW5WYWx1ZS1mZjUxNDdjNi5qcyc7XG5pbXBvcnQgeyBqIGFzIHJlc29sdmVTdHJpbmcsIGIgYXMgYmluYXJ5T3B0aW9ucywgYyBhcyBzdHJpbmdpZnlTdHJpbmcsIGggYXMgcmVzb2x2ZVNlcSwgUCBhcyBQYWlyLCBkIGFzIFlBTUxNYXAsIFkgYXMgWUFNTFNlcSwgdCBhcyB0b0pTT04sIFMgYXMgU2NhbGFyLCBsIGFzIGZpbmRQYWlyLCBnIGFzIHJlc29sdmVNYXAsIGsgYXMgc3RyaW5naWZ5TnVtYmVyIH0gZnJvbSAnLi9yZXNvbHZlU2VxLTA0ODI1ZjMwLmpzJztcblxuLyogZ2xvYmFsIGF0b2IsIGJ0b2EsIEJ1ZmZlciAqL1xudmFyIGJpbmFyeSA9IHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheTtcbiAgfSxcbiAgLy8gQnVmZmVyIGluaGVyaXRzIGZyb20gVWludDhBcnJheVxuICBkZWZhdWx0OiBmYWxzZSxcbiAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5JyxcblxuICAvKipcbiAgICogUmV0dXJucyBhIEJ1ZmZlciBpbiBub2RlIGFuZCBhbiBVaW50OEFycmF5IGluIGJyb3dzZXJzXG4gICAqXG4gICAqIFRvIHVzZSB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBhcyBhbiBpbWFnZSwgeW91J2xsIHdhbnQgdG8gZG8gc29tZXRoaW5nIGxpa2U6XG4gICAqXG4gICAqICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdpbWFnZS9qcGVnJyB9KVxuICAgKiAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwaG90bycpLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICovXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoZG9jLCBub2RlKSB7XG4gICAgdmFyIHNyYyA9IHJlc29sdmVTdHJpbmcoZG9jLCBub2RlKTtcblxuICAgIGlmICh0eXBlb2YgQnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20oc3JjLCAnYmFzZTY0Jyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gT24gSUUgMTEsIGF0b2IoKSBjYW4ndCBoYW5kbGUgbmV3bGluZXNcbiAgICAgIHZhciBzdHIgPSBhdG9iKHNyYy5yZXBsYWNlKC9bXFxuXFxyXS9nLCAnJykpO1xuICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGgpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgICAgICBidWZmZXJbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG1zZyA9ICdUaGlzIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyBiaW5hcnkgdGFnczsgZWl0aGVyIEJ1ZmZlciBvciBhdG9iIGlzIHJlcXVpcmVkJztcbiAgICAgIGRvYy5lcnJvcnMucHVzaChuZXcgWUFNTFJlZmVyZW5jZUVycm9yKG5vZGUsIG1zZykpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICBvcHRpb25zOiBiaW5hcnlPcHRpb25zLFxuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShfcmVmLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICB2YXIgY29tbWVudCA9IF9yZWYuY29tbWVudCxcbiAgICAgICAgdHlwZSA9IF9yZWYudHlwZSxcbiAgICAgICAgdmFsdWUgPSBfcmVmLnZhbHVlO1xuICAgIHZhciBzcmM7XG5cbiAgICBpZiAodHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3JjID0gdmFsdWUgaW5zdGFuY2VvZiBCdWZmZXIgPyB2YWx1ZS50b1N0cmluZygnYmFzZTY0JykgOiBCdWZmZXIuZnJvbSh2YWx1ZS5idWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBidG9hID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgcyA9ICcnO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2YWx1ZVtpXSk7XG4gICAgICB9XG5cbiAgICAgIHNyYyA9IGJ0b2Eocyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgYmluYXJ5IHRhZ3M7IGVpdGhlciBCdWZmZXIgb3IgYnRvYSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICghdHlwZSkgdHlwZSA9IGJpbmFyeU9wdGlvbnMuZGVmYXVsdFR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gVHlwZS5RVU9URV9ET1VCTEUpIHtcbiAgICAgIHZhbHVlID0gc3JjO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbGluZVdpZHRoID0gYmluYXJ5T3B0aW9ucy5saW5lV2lkdGg7XG4gICAgICB2YXIgbiA9IE1hdGguY2VpbChzcmMubGVuZ3RoIC8gbGluZVdpZHRoKTtcbiAgICAgIHZhciBsaW5lcyA9IG5ldyBBcnJheShuKTtcblxuICAgICAgZm9yICh2YXIgX2kgPSAwLCBvID0gMDsgX2kgPCBuOyArK19pLCBvICs9IGxpbmVXaWR0aCkge1xuICAgICAgICBsaW5lc1tfaV0gPSBzcmMuc3Vic3RyKG8sIGxpbmVXaWR0aCk7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gbGluZXMuam9pbih0eXBlID09PSBUeXBlLkJMT0NLX0xJVEVSQUwgPyAnXFxuJyA6ICcgJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZ2lmeVN0cmluZyh7XG4gICAgICBjb21tZW50OiBjb21tZW50LFxuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHBhcnNlUGFpcnMoZG9jLCBjc3QpIHtcbiAgdmFyIHNlcSA9IHJlc29sdmVTZXEoZG9jLCBjc3QpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc2VxLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGl0ZW0gPSBzZXEuaXRlbXNbaV07XG4gICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQYWlyKSBjb250aW51ZTtlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgWUFNTE1hcCkge1xuICAgICAgaWYgKGl0ZW0uaXRlbXMubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgbXNnID0gJ0VhY2ggcGFpciBtdXN0IGhhdmUgaXRzIG93biBzZXF1ZW5jZSBpbmRpY2F0b3InO1xuICAgICAgICB0aHJvdyBuZXcgWUFNTFNlbWFudGljRXJyb3IoY3N0LCBtc2cpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFpciA9IGl0ZW0uaXRlbXNbMF0gfHwgbmV3IFBhaXIoKTtcbiAgICAgIGlmIChpdGVtLmNvbW1lbnRCZWZvcmUpIHBhaXIuY29tbWVudEJlZm9yZSA9IHBhaXIuY29tbWVudEJlZm9yZSA/IFwiXCIuY29uY2F0KGl0ZW0uY29tbWVudEJlZm9yZSwgXCJcXG5cIikuY29uY2F0KHBhaXIuY29tbWVudEJlZm9yZSkgOiBpdGVtLmNvbW1lbnRCZWZvcmU7XG4gICAgICBpZiAoaXRlbS5jb21tZW50KSBwYWlyLmNvbW1lbnQgPSBwYWlyLmNvbW1lbnQgPyBcIlwiLmNvbmNhdChpdGVtLmNvbW1lbnQsIFwiXFxuXCIpLmNvbmNhdChwYWlyLmNvbW1lbnQpIDogaXRlbS5jb21tZW50O1xuICAgICAgaXRlbSA9IHBhaXI7XG4gICAgfVxuICAgIHNlcS5pdGVtc1tpXSA9IGl0ZW0gaW5zdGFuY2VvZiBQYWlyID8gaXRlbSA6IG5ldyBQYWlyKGl0ZW0pO1xuICB9XG5cbiAgcmV0dXJuIHNlcTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhaXJzKHNjaGVtYSwgaXRlcmFibGUsIGN0eCkge1xuICB2YXIgcGFpcnMgPSBuZXcgWUFNTFNlcShzY2hlbWEpO1xuICBwYWlycy50YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6cGFpcnMnO1xuXG4gIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihpdGVyYWJsZSksXG4gICAgICBfc3RlcDtcblxuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgaXQgPSBfc3RlcC52YWx1ZTtcbiAgICAgIHZhciBrZXkgPSB2b2lkIDAsXG4gICAgICAgICAgdmFsdWUgPSB2b2lkIDA7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGl0KSkge1xuICAgICAgICBpZiAoaXQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAga2V5ID0gaXRbMF07XG4gICAgICAgICAgdmFsdWUgPSBpdFsxXTtcbiAgICAgICAgfSBlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBba2V5LCB2YWx1ZV0gdHVwbGU6IFwiLmNvbmNhdChpdCkpO1xuICAgICAgfSBlbHNlIGlmIChpdCAmJiBpdCBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGl0KTtcblxuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBrZXkgPSBrZXlzWzBdO1xuICAgICAgICAgIHZhbHVlID0gaXRba2V5XTtcbiAgICAgICAgfSBlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCB7IGtleTogdmFsdWUgfSB0dXBsZTogXCIuY29uY2F0KGl0KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXkgPSBpdDtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhaXIgPSBzY2hlbWEuY3JlYXRlUGFpcihrZXksIHZhbHVlLCBjdHgpO1xuICAgICAgcGFpcnMuaXRlbXMucHVzaChwYWlyKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxuXG4gIHJldHVybiBwYWlycztcbn1cbnZhciBwYWlycyA9IHtcbiAgZGVmYXVsdDogZmFsc2UsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJyxcbiAgcmVzb2x2ZTogcGFyc2VQYWlycyxcbiAgY3JlYXRlTm9kZTogY3JlYXRlUGFpcnNcbn07XG5cbnZhciBZQU1MT01hcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1lBTUxTZXEpIHtcbiAgX2luaGVyaXRzKFlBTUxPTWFwLCBfWUFNTFNlcSk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihZQU1MT01hcCk7XG5cbiAgZnVuY3Rpb24gWUFNTE9NYXAoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFlBTUxPTWFwKTtcblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcyk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiYWRkXCIsIFlBTUxNYXAucHJvdG90eXBlLmFkZC5iaW5kKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZGVsZXRlXCIsIFlBTUxNYXAucHJvdG90eXBlLmRlbGV0ZS5iaW5kKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0XCIsIFlBTUxNYXAucHJvdG90eXBlLmdldC5iaW5kKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFzXCIsIFlBTUxNYXAucHJvdG90eXBlLmhhcy5iaW5kKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwic2V0XCIsIFlBTUxNYXAucHJvdG90eXBlLnNldC5iaW5kKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSk7XG5cbiAgICBfdGhpcy50YWcgPSBZQU1MT01hcC50YWc7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFlBTUxPTWFwLCBbe1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OJDEoXywgY3R4KSB7XG4gICAgICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICAgICAgaWYgKGN0eCAmJiBjdHgub25DcmVhdGUpIGN0eC5vbkNyZWF0ZShtYXApO1xuXG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5pdGVtcyksXG4gICAgICAgICAgX3N0ZXA7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgICAgdmFyIHBhaXIgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICB2YXIga2V5ID0gdm9pZCAwLFxuICAgICAgICAgICAgICB2YWx1ZSA9IHZvaWQgMDtcblxuICAgICAgICAgIGlmIChwYWlyIGluc3RhbmNlb2YgUGFpcikge1xuICAgICAgICAgICAga2V5ID0gdG9KU09OKHBhaXIua2V5LCAnJywgY3R4KTtcbiAgICAgICAgICAgIHZhbHVlID0gdG9KU09OKHBhaXIudmFsdWUsIGtleSwgY3R4KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2V5ID0gdG9KU09OKHBhaXIsICcnLCBjdHgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChtYXAuaGFzKGtleSkpIHRocm93IG5ldyBFcnJvcignT3JkZXJlZCBtYXBzIG11c3Qgbm90IGluY2x1ZGUgZHVwbGljYXRlIGtleXMnKTtcbiAgICAgICAgICBtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFlBTUxPTWFwO1xufShZQU1MU2VxKTtcblxuX2RlZmluZVByb3BlcnR5KFlBTUxPTWFwLCBcInRhZ1wiLCAndGFnOnlhbWwub3JnLDIwMDI6b21hcCcpO1xuXG5mdW5jdGlvbiBwYXJzZU9NYXAoZG9jLCBjc3QpIHtcbiAgdmFyIHBhaXJzID0gcGFyc2VQYWlycyhkb2MsIGNzdCk7XG4gIHZhciBzZWVuS2V5cyA9IFtdO1xuXG4gIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIocGFpcnMuaXRlbXMpLFxuICAgICAgX3N0ZXAyO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciBrZXkgPSBfc3RlcDIudmFsdWUua2V5O1xuXG4gICAgICBpZiAoa2V5IGluc3RhbmNlb2YgU2NhbGFyKSB7XG4gICAgICAgIGlmIChzZWVuS2V5cy5pbmNsdWRlcyhrZXkudmFsdWUpKSB7XG4gICAgICAgICAgdmFyIG1zZyA9ICdPcmRlcmVkIG1hcHMgbXVzdCBub3QgaW5jbHVkZSBkdXBsaWNhdGUga2V5cyc7XG4gICAgICAgICAgdGhyb3cgbmV3IFlBTUxTZW1hbnRpY0Vycm9yKGNzdCwgbXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWVuS2V5cy5wdXNoKGtleS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvcjIuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvcjIuZigpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFlBTUxPTWFwKCksIHBhaXJzKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlT01hcChzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpIHtcbiAgdmFyIHBhaXJzID0gY3JlYXRlUGFpcnMoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KTtcbiAgdmFyIG9tYXAgPSBuZXcgWUFNTE9NYXAoKTtcbiAgb21hcC5pdGVtcyA9IHBhaXJzLml0ZW1zO1xuICByZXR1cm4gb21hcDtcbn1cblxudmFyIG9tYXAgPSB7XG4gIGlkZW50aWZ5OiBmdW5jdGlvbiBpZGVudGlmeSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIE1hcDtcbiAgfSxcbiAgbm9kZUNsYXNzOiBZQU1MT01hcCxcbiAgZGVmYXVsdDogZmFsc2UsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnLFxuICByZXNvbHZlOiBwYXJzZU9NYXAsXG4gIGNyZWF0ZU5vZGU6IGNyZWF0ZU9NYXBcbn07XG5cbnZhciBZQU1MU2V0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfWUFNTE1hcCkge1xuICBfaW5oZXJpdHMoWUFNTFNldCwgX1lBTUxNYXApO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoWUFNTFNldCk7XG5cbiAgZnVuY3Rpb24gWUFNTFNldCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWUFNTFNldCk7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpO1xuICAgIF90aGlzLnRhZyA9IFlBTUxTZXQudGFnO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhZQU1MU2V0LCBbe1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKGtleSkge1xuICAgICAgdmFyIHBhaXIgPSBrZXkgaW5zdGFuY2VvZiBQYWlyID8ga2V5IDogbmV3IFBhaXIoa2V5KTtcbiAgICAgIHZhciBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywgcGFpci5rZXkpO1xuICAgICAgaWYgKCFwcmV2KSB0aGlzLml0ZW1zLnB1c2gocGFpcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5LCBrZWVwUGFpcikge1xuICAgICAgdmFyIHBhaXIgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuICAgICAgcmV0dXJuICFrZWVwUGFpciAmJiBwYWlyIGluc3RhbmNlb2YgUGFpciA/IHBhaXIua2V5IGluc3RhbmNlb2YgU2NhbGFyID8gcGFpci5rZXkudmFsdWUgOiBwYWlyLmtleSA6IHBhaXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBib29sZWFuIHZhbHVlIGZvciBzZXQoa2V5LCB2YWx1ZSkgaW4gYSBZQU1MIHNldCwgbm90IFwiLmNvbmNhdChfdHlwZW9mKHZhbHVlKSkpO1xuICAgICAgdmFyIHByZXYgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuXG4gICAgICBpZiAocHJldiAmJiAhdmFsdWUpIHtcbiAgICAgICAgdGhpcy5pdGVtcy5zcGxpY2UodGhpcy5pdGVtcy5pbmRleE9mKHByZXYpLCAxKTtcbiAgICAgIH0gZWxzZSBpZiAoIXByZXYgJiYgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKG5ldyBQYWlyKGtleSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0b0pTT05cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9KU09OKF8sIGN0eCkge1xuICAgICAgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mKFlBTUxTZXQucHJvdG90eXBlKSwgXCJ0b0pTT05cIiwgdGhpcykuY2FsbCh0aGlzLCBfLCBjdHgsIFNldCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgaWYgKCFjdHgpIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcbiAgICAgIGlmICh0aGlzLmhhc0FsbE51bGxWYWx1ZXMoKSkgcmV0dXJuIF9nZXQoX2dldFByb3RvdHlwZU9mKFlBTUxTZXQucHJvdG90eXBlKSwgXCJ0b1N0cmluZ1wiLCB0aGlzKS5jYWxsKHRoaXMsIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ1NldCBpdGVtcyBtdXN0IGFsbCBoYXZlIG51bGwgdmFsdWVzJyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFlBTUxTZXQ7XG59KFlBTUxNYXApO1xuXG5fZGVmaW5lUHJvcGVydHkoWUFNTFNldCwgXCJ0YWdcIiwgJ3RhZzp5YW1sLm9yZywyMDAyOnNldCcpO1xuXG5mdW5jdGlvbiBwYXJzZVNldChkb2MsIGNzdCkge1xuICB2YXIgbWFwID0gcmVzb2x2ZU1hcChkb2MsIGNzdCk7XG4gIGlmICghbWFwLmhhc0FsbE51bGxWYWx1ZXMoKSkgdGhyb3cgbmV3IFlBTUxTZW1hbnRpY0Vycm9yKGNzdCwgJ1NldCBpdGVtcyBtdXN0IGFsbCBoYXZlIG51bGwgdmFsdWVzJyk7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBZQU1MU2V0KCksIG1hcCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNldChzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpIHtcbiAgdmFyIHNldCA9IG5ldyBZQU1MU2V0KCk7XG5cbiAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGl0ZXJhYmxlKSxcbiAgICAgIF9zdGVwO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciB2YWx1ZSA9IF9zdGVwLnZhbHVlO1xuICAgICAgc2V0Lml0ZW1zLnB1c2goc2NoZW1hLmNyZWF0ZVBhaXIodmFsdWUsIG51bGwsIGN0eCkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IuZigpO1xuICB9XG5cbiAgcmV0dXJuIHNldDtcbn1cblxudmFyIHNldCA9IHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU2V0O1xuICB9LFxuICBub2RlQ2xhc3M6IFlBTUxTZXQsXG4gIGRlZmF1bHQ6IGZhbHNlLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnLFxuICByZXNvbHZlOiBwYXJzZVNldCxcbiAgY3JlYXRlTm9kZTogY3JlYXRlU2V0XG59O1xuXG52YXIgcGFyc2VTZXhhZ2VzaW1hbCA9IGZ1bmN0aW9uIHBhcnNlU2V4YWdlc2ltYWwoc2lnbiwgcGFydHMpIHtcbiAgdmFyIG4gPSBwYXJ0cy5zcGxpdCgnOicpLnJlZHVjZShmdW5jdGlvbiAobiwgcCkge1xuICAgIHJldHVybiBuICogNjAgKyBOdW1iZXIocCk7XG4gIH0sIDApO1xuICByZXR1cm4gc2lnbiA9PT0gJy0nID8gLW4gOiBuO1xufTsgLy8gaGhoaDptbTpzcy5zc3NcblxuXG52YXIgc3RyaW5naWZ5U2V4YWdlc2ltYWwgPSBmdW5jdGlvbiBzdHJpbmdpZnlTZXhhZ2VzaW1hbChfcmVmKSB7XG4gIHZhciB2YWx1ZSA9IF9yZWYudmFsdWU7XG4gIGlmIChpc05hTih2YWx1ZSkgfHwgIWlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIHN0cmluZ2lmeU51bWJlcih2YWx1ZSk7XG4gIHZhciBzaWduID0gJyc7XG5cbiAgaWYgKHZhbHVlIDwgMCkge1xuICAgIHNpZ24gPSAnLSc7XG4gICAgdmFsdWUgPSBNYXRoLmFicyh2YWx1ZSk7XG4gIH1cblxuICB2YXIgcGFydHMgPSBbdmFsdWUgJSA2MF07IC8vIHNlY29uZHMsIGluY2x1ZGluZyBtc1xuXG4gIGlmICh2YWx1ZSA8IDYwKSB7XG4gICAgcGFydHMudW5zaGlmdCgwKTsgLy8gYXQgbGVhc3Qgb25lIDogaXMgcmVxdWlyZWRcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IE1hdGgucm91bmQoKHZhbHVlIC0gcGFydHNbMF0pIC8gNjApO1xuICAgIHBhcnRzLnVuc2hpZnQodmFsdWUgJSA2MCk7IC8vIG1pbnV0ZXNcblxuICAgIGlmICh2YWx1ZSA+PSA2MCkge1xuICAgICAgdmFsdWUgPSBNYXRoLnJvdW5kKCh2YWx1ZSAtIHBhcnRzWzBdKSAvIDYwKTtcbiAgICAgIHBhcnRzLnVuc2hpZnQodmFsdWUpOyAvLyBob3Vyc1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaWduICsgcGFydHMubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIFN0cmluZyhuKSA6IFN0cmluZyhuKTtcbiAgfSkuam9pbignOicpLnJlcGxhY2UoLzAwMDAwMFxcZCokLywgJycpIC8vICUgNjAgbWF5IGludHJvZHVjZSBlcnJvclxuICA7XG59O1xuXG52YXIgaW50VGltZSA9IHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIGRlZmF1bHQ6IHRydWUsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gIGZvcm1hdDogJ1RJTUUnLFxuICB0ZXN0OiAvXihbLStdPykoWzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKSspJC8sXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoc3RyLCBzaWduLCBwYXJ0cykge1xuICAgIHJldHVybiBwYXJzZVNleGFnZXNpbWFsKHNpZ24sIHBhcnRzLnJlcGxhY2UoL18vZywgJycpKTtcbiAgfSxcbiAgc3RyaW5naWZ5OiBzdHJpbmdpZnlTZXhhZ2VzaW1hbFxufTtcbnZhciBmbG9hdFRpbWUgPSB7XG4gIGlkZW50aWZ5OiBmdW5jdGlvbiBpZGVudGlmeSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xuICB9LFxuICBkZWZhdWx0OiB0cnVlLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gIGZvcm1hdDogJ1RJTUUnLFxuICB0ZXN0OiAvXihbLStdPykoWzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKStcXC5bMC05X10qKSQvLFxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHN0ciwgc2lnbiwgcGFydHMpIHtcbiAgICByZXR1cm4gcGFyc2VTZXhhZ2VzaW1hbChzaWduLCBwYXJ0cy5yZXBsYWNlKC9fL2csICcnKSk7XG4gIH0sXG4gIHN0cmluZ2lmeTogc3RyaW5naWZ5U2V4YWdlc2ltYWxcbn07XG52YXIgdGltZXN0YW1wID0ge1xuICBpZGVudGlmeTogZnVuY3Rpb24gaWRlbnRpZnkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xuICB9LFxuICBkZWZhdWx0OiB0cnVlLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnLFxuICAvLyBJZiB0aGUgdGltZSB6b25lIGlzIG9taXR0ZWQsIHRoZSB0aW1lc3RhbXAgaXMgYXNzdW1lZCB0byBiZSBzcGVjaWZpZWQgaW4gVVRDLiBUaGUgdGltZSBwYXJ0XG4gIC8vIG1heSBiZSBvbWl0dGVkIGFsdG9nZXRoZXIsIHJlc3VsdGluZyBpbiBhIGRhdGUgZm9ybWF0LiBJbiBzdWNoIGEgY2FzZSwgdGhlIHRpbWUgcGFydCBpc1xuICAvLyBhc3N1bWVkIHRvIGJlIDAwOjAwOjAwWiAoc3RhcnQgb2YgZGF5LCBVVEMpLlxuICB0ZXN0OiBSZWdFeHAoJ14oPzonICsgJyhbMC05XXs0fSktKFswLTldezEsMn0pLShbMC05XXsxLDJ9KScgKyAvLyBZWVlZLU1tLURkXG4gICcoPzooPzp0fFR8WyBcXFxcdF0rKScgKyAvLyB0IHwgVCB8IHdoaXRlc3BhY2VcbiAgJyhbMC05XXsxLDJ9KTooWzAtOV17MSwyfSk6KFswLTldezEsMn0oXFxcXC5bMC05XSspPyknICsgLy8gSGg6TW06U3MoLnNzKT9cbiAgJyg/OlsgXFxcXHRdKihafFstK11bMDEyXT9bMC05XSg/OjpbMC05XXsyfSk/KSk/JyArIC8vIFogfCArNSB8IC0wMzozMFxuICAnKT8nICsgJykkJyksXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoc3RyLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWMsIHR6KSB7XG4gICAgaWYgKG1pbGxpc2VjKSBtaWxsaXNlYyA9IChtaWxsaXNlYyArICcwMCcpLnN1YnN0cigxLCAzKTtcbiAgICB2YXIgZGF0ZSA9IERhdGUuVVRDKHllYXIsIG1vbnRoIC0gMSwgZGF5LCBob3VyIHx8IDAsIG1pbnV0ZSB8fCAwLCBzZWNvbmQgfHwgMCwgbWlsbGlzZWMgfHwgMCk7XG5cbiAgICBpZiAodHogJiYgdHogIT09ICdaJykge1xuICAgICAgdmFyIGQgPSBwYXJzZVNleGFnZXNpbWFsKHR6WzBdLCB0ei5zbGljZSgxKSk7XG4gICAgICBpZiAoTWF0aC5hYnMoZCkgPCAzMCkgZCAqPSA2MDtcbiAgICAgIGRhdGUgLT0gNjAwMDAgKiBkO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcbiAgfSxcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoX3JlZjIpIHtcbiAgICB2YXIgdmFsdWUgPSBfcmVmMi52YWx1ZTtcbiAgICByZXR1cm4gdmFsdWUudG9JU09TdHJpbmcoKS5yZXBsYWNlKC8oKFQwMDowMCk/OjAwKT9cXC4wMDBaJC8sICcnKTtcbiAgfVxufTtcblxuLyogZ2xvYmFsIGNvbnNvbGUsIHByb2Nlc3MsIFlBTUxfU0lMRU5DRV9ERVBSRUNBVElPTl9XQVJOSU5HUywgWUFNTF9TSUxFTkNFX1dBUk5JTkdTICovXG5mdW5jdGlvbiBzaG91bGRXYXJuKGRlcHJlY2F0aW9uKSB7XG4gIHZhciBlbnYgPSB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgfHwge307XG5cbiAgaWYgKGRlcHJlY2F0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBZQU1MX1NJTEVOQ0VfREVQUkVDQVRJT05fV0FSTklOR1MgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gIVlBTUxfU0lMRU5DRV9ERVBSRUNBVElPTl9XQVJOSU5HUztcbiAgICByZXR1cm4gIWVudi5ZQU1MX1NJTEVOQ0VfREVQUkVDQVRJT05fV0FSTklOR1M7XG4gIH1cblxuICBpZiAodHlwZW9mIFlBTUxfU0lMRU5DRV9XQVJOSU5HUyAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiAhWUFNTF9TSUxFTkNFX1dBUk5JTkdTO1xuICByZXR1cm4gIWVudi5ZQU1MX1NJTEVOQ0VfV0FSTklOR1M7XG59XG5cbmZ1bmN0aW9uIHdhcm4od2FybmluZywgdHlwZSkge1xuICBpZiAoc2hvdWxkV2FybihmYWxzZSkpIHtcbiAgICB2YXIgZW1pdCA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVtaXRXYXJuaW5nOyAvLyBUaGlzIHdpbGwgdGhyb3cgaW4gSmVzdCBpZiBgd2FybmluZ2AgaXMgYW4gRXJyb3IgaW5zdGFuY2UgZHVlIHRvXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2plc3QvaXNzdWVzLzI1NDlcblxuICAgIGlmIChlbWl0KSBlbWl0KHdhcm5pbmcsIHR5cGUpO2Vsc2Uge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2Fybih0eXBlID8gXCJcIi5jb25jYXQodHlwZSwgXCI6IFwiKS5jb25jYXQod2FybmluZykgOiB3YXJuaW5nKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5GaWxlRGVwcmVjYXRpb24oZmlsZW5hbWUpIHtcbiAgaWYgKHNob3VsZFdhcm4odHJ1ZSkpIHtcbiAgICB2YXIgcGF0aCA9IGZpbGVuYW1lLnJlcGxhY2UoLy4qeWFtbFsvXFxcXF0vaSwgJycpLnJlcGxhY2UoL1xcLmpzJC8sICcnKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgd2FybihcIlRoZSBlbmRwb2ludCAneWFtbC9cIi5jb25jYXQocGF0aCwgXCInIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlwiKSwgJ0RlcHJlY2F0aW9uV2FybmluZycpO1xuICB9XG59XG52YXIgd2FybmVkID0ge307XG5mdW5jdGlvbiB3YXJuT3B0aW9uRGVwcmVjYXRpb24obmFtZSwgYWx0ZXJuYXRpdmUpIHtcbiAgaWYgKCF3YXJuZWRbbmFtZV0gJiYgc2hvdWxkV2Fybih0cnVlKSkge1xuICAgIHdhcm5lZFtuYW1lXSA9IHRydWU7XG4gICAgdmFyIG1zZyA9IFwiVGhlIG9wdGlvbiAnXCIuY29uY2F0KG5hbWUsIFwiJyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZVwiKTtcbiAgICBtc2cgKz0gYWx0ZXJuYXRpdmUgPyBcIiwgdXNlICdcIi5jb25jYXQoYWx0ZXJuYXRpdmUsIFwiJyBpbnN0ZWFkLlwiKSA6ICcuJztcbiAgICB3YXJuKG1zZywgJ0RlcHJlY2F0aW9uV2FybmluZycpO1xuICB9XG59XG5cbmV4cG9ydCB7IHdhcm5PcHRpb25EZXByZWNhdGlvbiBhcyBhLCBiaW5hcnkgYXMgYiwgd2FybkZpbGVEZXByZWNhdGlvbiBhcyBjLCBmbG9hdFRpbWUgYXMgZiwgaW50VGltZSBhcyBpLCBvbWFwIGFzIG8sIHBhaXJzIGFzIHAsIHNldCBhcyBzLCB0aW1lc3RhbXAgYXMgdCwgd2FybiBhcyB3IH07XG4iLCJpbXBvcnQgeyBfIGFzIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyLCBoIGFzIF9zbGljZWRUb0FycmF5LCBhIGFzIF90eXBlb2YsIGIgYXMgX2NyZWF0ZUNsYXNzLCBlIGFzIF9kZWZpbmVQcm9wZXJ0eSwgYyBhcyBfY2xhc3NDYWxsQ2hlY2ssIGQgYXMgZGVmYXVsdFRhZ1ByZWZpeCwgbiBhcyBkZWZhdWx0VGFncyB9IGZyb20gJy4vUGxhaW5WYWx1ZS1mZjUxNDdjNi5qcyc7XG5pbXBvcnQgeyBkIGFzIFlBTUxNYXAsIGcgYXMgcmVzb2x2ZU1hcCwgWSBhcyBZQU1MU2VxLCBoIGFzIHJlc29sdmVTZXEsIGogYXMgcmVzb2x2ZVN0cmluZywgYyBhcyBzdHJpbmdpZnlTdHJpbmcsIHMgYXMgc3RyT3B0aW9ucywgUyBhcyBTY2FsYXIsIG4gYXMgbnVsbE9wdGlvbnMsIGEgYXMgYm9vbE9wdGlvbnMsIGkgYXMgaW50T3B0aW9ucywgayBhcyBzdHJpbmdpZnlOdW1iZXIsIE4gYXMgTm9kZSwgQSBhcyBBbGlhcywgUCBhcyBQYWlyIH0gZnJvbSAnLi9yZXNvbHZlU2VxLTA0ODI1ZjMwLmpzJztcbmltcG9ydCB7IGIgYXMgYmluYXJ5LCBvIGFzIG9tYXAsIHAgYXMgcGFpcnMsIHMgYXMgc2V0LCBpIGFzIGludFRpbWUsIGYgYXMgZmxvYXRUaW1lLCB0IGFzIHRpbWVzdGFtcCwgYSBhcyB3YXJuT3B0aW9uRGVwcmVjYXRpb24gfSBmcm9tICcuL3dhcm5pbmdzLTBlNGI3MGQzLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlTWFwKHNjaGVtYSwgb2JqLCBjdHgpIHtcbiAgdmFyIG1hcCA9IG5ldyBZQU1MTWFwKHNjaGVtYSk7XG5cbiAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkge1xuICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvYmopLFxuICAgICAgICBfc3RlcDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIgX3N0ZXAkdmFsdWUgPSBfc2xpY2VkVG9BcnJheShfc3RlcC52YWx1ZSwgMiksXG4gICAgICAgICAgICBrZXkgPSBfc3RlcCR2YWx1ZVswXSxcbiAgICAgICAgICAgIHZhbHVlID0gX3N0ZXAkdmFsdWVbMV07XG5cbiAgICAgICAgbWFwLml0ZW1zLnB1c2goc2NoZW1hLmNyZWF0ZVBhaXIoa2V5LCB2YWx1ZSwgY3R4KSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChvYmogJiYgX3R5cGVvZihvYmopID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAodmFyIF9pID0gMCwgX09iamVjdCRrZXlzID0gT2JqZWN0LmtleXMob2JqKTsgX2kgPCBfT2JqZWN0JGtleXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2tleSA9IF9PYmplY3Qka2V5c1tfaV07XG4gICAgICBtYXAuaXRlbXMucHVzaChzY2hlbWEuY3JlYXRlUGFpcihfa2V5LCBvYmpbX2tleV0sIGN0eCkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2NoZW1hLnNvcnRNYXBFbnRyaWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbWFwLml0ZW1zLnNvcnQoc2NoZW1hLnNvcnRNYXBFbnRyaWVzKTtcbiAgfVxuXG4gIHJldHVybiBtYXA7XG59XG5cbnZhciBtYXAgPSB7XG4gIGNyZWF0ZU5vZGU6IGNyZWF0ZU1hcCxcbiAgZGVmYXVsdDogdHJ1ZSxcbiAgbm9kZUNsYXNzOiBZQU1MTWFwLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjptYXAnLFxuICByZXNvbHZlOiByZXNvbHZlTWFwXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVTZXEoc2NoZW1hLCBvYmosIGN0eCkge1xuICB2YXIgc2VxID0gbmV3IFlBTUxTZXEoc2NoZW1hKTtcblxuICBpZiAob2JqICYmIG9ialtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG9iaiksXG4gICAgICAgIF9zdGVwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBpdCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICB2YXIgdiA9IHNjaGVtYS5jcmVhdGVOb2RlKGl0LCBjdHgud3JhcFNjYWxhcnMsIG51bGwsIGN0eCk7XG4gICAgICAgIHNlcS5pdGVtcy5wdXNoKHYpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VxO1xufVxuXG52YXIgc2VxID0ge1xuICBjcmVhdGVOb2RlOiBjcmVhdGVTZXEsXG4gIGRlZmF1bHQ6IHRydWUsXG4gIG5vZGVDbGFzczogWUFNTFNlcSxcbiAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6c2VxJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVNlcVxufTtcblxudmFyIHN0cmluZyA9IHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gIH0sXG4gIGRlZmF1bHQ6IHRydWUsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicsXG4gIHJlc29sdmU6IHJlc29sdmVTdHJpbmcsXG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgYWN0dWFsU3RyaW5nOiB0cnVlXG4gICAgfSwgY3R4KTtcbiAgICByZXR1cm4gc3RyaW5naWZ5U3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gIH0sXG4gIG9wdGlvbnM6IHN0ck9wdGlvbnNcbn07XG5cbnZhciBmYWlsc2FmZSA9IFttYXAsIHNlcSwgc3RyaW5nXTtcblxuLyogZ2xvYmFsIEJpZ0ludCAqL1xuXG52YXIgaW50SWRlbnRpZnkgPSBmdW5jdGlvbiBpbnRJZGVudGlmeSh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbn07XG5cbnZhciBpbnRSZXNvbHZlID0gZnVuY3Rpb24gaW50UmVzb2x2ZShzcmMsIHBhcnQsIHJhZGl4KSB7XG4gIHJldHVybiBpbnRPcHRpb25zLmFzQmlnSW50ID8gQmlnSW50KHNyYykgOiBwYXJzZUludChwYXJ0LCByYWRpeCk7XG59O1xuXG5mdW5jdGlvbiBpbnRTdHJpbmdpZnkobm9kZSwgcmFkaXgsIHByZWZpeCkge1xuICB2YXIgdmFsdWUgPSBub2RlLnZhbHVlO1xuICBpZiAoaW50SWRlbnRpZnkodmFsdWUpICYmIHZhbHVlID49IDApIHJldHVybiBwcmVmaXggKyB2YWx1ZS50b1N0cmluZyhyYWRpeCk7XG4gIHJldHVybiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG59XG5cbnZhciBudWxsT2JqID0ge1xuICBpZGVudGlmeTogZnVuY3Rpb24gaWRlbnRpZnkodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbDtcbiAgfSxcbiAgY3JlYXRlTm9kZTogZnVuY3Rpb24gY3JlYXRlTm9kZShzY2hlbWEsIHZhbHVlLCBjdHgpIHtcbiAgICByZXR1cm4gY3R4LndyYXBTY2FsYXJzID8gbmV3IFNjYWxhcihudWxsKSA6IG51bGw7XG4gIH0sXG4gIGRlZmF1bHQ6IHRydWUsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm51bGwnLFxuICB0ZXN0OiAvXig/On58W05uXXVsbHxOVUxMKT8kLyxcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcbiAgb3B0aW9uczogbnVsbE9wdGlvbnMsXG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KCkge1xuICAgIHJldHVybiBudWxsT3B0aW9ucy5udWxsU3RyO1xuICB9XG59O1xudmFyIGJvb2xPYmogPSB7XG4gIGlkZW50aWZ5OiBmdW5jdGlvbiBpZGVudGlmeSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbiAgfSxcbiAgZGVmYXVsdDogdHJ1ZSxcbiAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsXG4gIHRlc3Q6IC9eKD86W1R0XXJ1ZXxUUlVFfFtGZl1hbHNlfEZBTFNFKSQvLFxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHN0cikge1xuICAgIHJldHVybiBzdHJbMF0gPT09ICd0JyB8fCBzdHJbMF0gPT09ICdUJztcbiAgfSxcbiAgb3B0aW9uczogYm9vbE9wdGlvbnMsXG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KF9yZWYpIHtcbiAgICB2YXIgdmFsdWUgPSBfcmVmLnZhbHVlO1xuICAgIHJldHVybiB2YWx1ZSA/IGJvb2xPcHRpb25zLnRydWVTdHIgOiBib29sT3B0aW9ucy5mYWxzZVN0cjtcbiAgfVxufTtcbnZhciBvY3RPYmogPSB7XG4gIGlkZW50aWZ5OiBmdW5jdGlvbiBpZGVudGlmeSh2YWx1ZSkge1xuICAgIHJldHVybiBpbnRJZGVudGlmeSh2YWx1ZSkgJiYgdmFsdWUgPj0gMDtcbiAgfSxcbiAgZGVmYXVsdDogdHJ1ZSxcbiAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgZm9ybWF0OiAnT0NUJyxcbiAgdGVzdDogL14wbyhbMC03XSspJC8sXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoc3RyLCBvY3QpIHtcbiAgICByZXR1cm4gaW50UmVzb2x2ZShzdHIsIG9jdCwgOCk7XG4gIH0sXG4gIG9wdGlvbnM6IGludE9wdGlvbnMsXG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KG5vZGUpIHtcbiAgICByZXR1cm4gaW50U3RyaW5naWZ5KG5vZGUsIDgsICcwbycpO1xuICB9XG59O1xudmFyIGludE9iaiA9IHtcbiAgaWRlbnRpZnk6IGludElkZW50aWZ5LFxuICBkZWZhdWx0OiB0cnVlLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICB0ZXN0OiAvXlstK10/WzAtOV0rJC8sXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoc3RyKSB7XG4gICAgcmV0dXJuIGludFJlc29sdmUoc3RyLCBzdHIsIDEwKTtcbiAgfSxcbiAgb3B0aW9uczogaW50T3B0aW9ucyxcbiAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG52YXIgaGV4T2JqID0ge1xuICBpZGVudGlmeTogZnVuY3Rpb24gaWRlbnRpZnkodmFsdWUpIHtcbiAgICByZXR1cm4gaW50SWRlbnRpZnkodmFsdWUpICYmIHZhbHVlID49IDA7XG4gIH0sXG4gIGRlZmF1bHQ6IHRydWUsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gIGZvcm1hdDogJ0hFWCcsXG4gIHRlc3Q6IC9eMHgoWzAtOWEtZkEtRl0rKSQvLFxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHN0ciwgaGV4KSB7XG4gICAgcmV0dXJuIGludFJlc29sdmUoc3RyLCBoZXgsIDE2KTtcbiAgfSxcbiAgb3B0aW9uczogaW50T3B0aW9ucyxcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkobm9kZSkge1xuICAgIHJldHVybiBpbnRTdHJpbmdpZnkobm9kZSwgMTYsICcweCcpO1xuICB9XG59O1xudmFyIG5hbk9iaiA9IHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIGRlZmF1bHQ6IHRydWUsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgdGVzdDogL14oPzpbLStdP1xcLmluZnwoXFwubmFuKSkkL2ksXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoc3RyLCBuYW4pIHtcbiAgICByZXR1cm4gbmFuID8gTmFOIDogc3RyWzBdID09PSAnLScgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIH0sXG4gIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xudmFyIGV4cE9iaiA9IHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIGRlZmF1bHQ6IHRydWUsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgZm9ybWF0OiAnRVhQJyxcbiAgdGVzdDogL15bLStdPyg/OlxcLlswLTldK3xbMC05XSsoPzpcXC5bMC05XSopPylbZUVdWy0rXT9bMC05XSskLyxcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZShzdHIpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChzdHIpO1xuICB9LFxuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShfcmVmMikge1xuICAgIHZhciB2YWx1ZSA9IF9yZWYyLnZhbHVlO1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUpLnRvRXhwb25lbnRpYWwoKTtcbiAgfVxufTtcbnZhciBmbG9hdE9iaiA9IHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIGRlZmF1bHQ6IHRydWUsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgdGVzdDogL15bLStdPyg/OlxcLihbMC05XSspfFswLTldK1xcLihbMC05XSopKSQvLFxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHN0ciwgZnJhYzEsIGZyYWMyKSB7XG4gICAgdmFyIGZyYWMgPSBmcmFjMSB8fCBmcmFjMjtcbiAgICB2YXIgbm9kZSA9IG5ldyBTY2FsYXIocGFyc2VGbG9hdChzdHIpKTtcbiAgICBpZiAoZnJhYyAmJiBmcmFjW2ZyYWMubGVuZ3RoIC0gMV0gPT09ICcwJykgbm9kZS5taW5GcmFjdGlvbkRpZ2l0cyA9IGZyYWMubGVuZ3RoO1xuICAgIHJldHVybiBub2RlO1xuICB9LFxuICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbnZhciBjb3JlID0gZmFpbHNhZmUuY29uY2F0KFtudWxsT2JqLCBib29sT2JqLCBvY3RPYmosIGludE9iaiwgaGV4T2JqLCBuYW5PYmosIGV4cE9iaiwgZmxvYXRPYmpdKTtcblxuLyogZ2xvYmFsIEJpZ0ludCAqL1xuXG52YXIgaW50SWRlbnRpZnkkMSA9IGZ1bmN0aW9uIGludElkZW50aWZ5KHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xufTtcblxudmFyIHN0cmluZ2lmeUpTT04gPSBmdW5jdGlvbiBzdHJpbmdpZnlKU09OKF9yZWYpIHtcbiAgdmFyIHZhbHVlID0gX3JlZi52YWx1ZTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn07XG5cbnZhciBqc29uID0gW21hcCwgc2VxLCB7XG4gIGlkZW50aWZ5OiBmdW5jdGlvbiBpZGVudGlmeSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICB9LFxuICBkZWZhdWx0OiB0cnVlLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpzdHInLFxuICByZXNvbHZlOiByZXNvbHZlU3RyaW5nLFxuICBzdHJpbmdpZnk6IHN0cmluZ2lmeUpTT05cbn0sIHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGw7XG4gIH0sXG4gIGNyZWF0ZU5vZGU6IGZ1bmN0aW9uIGNyZWF0ZU5vZGUoc2NoZW1hLCB2YWx1ZSwgY3R4KSB7XG4gICAgcmV0dXJuIGN0eC53cmFwU2NhbGFycyA/IG5ldyBTY2FsYXIobnVsbCkgOiBudWxsO1xuICB9LFxuICBkZWZhdWx0OiB0cnVlLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJyxcbiAgdGVzdDogL15udWxsJC8sXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxufSwge1xuICBpZGVudGlmeTogZnVuY3Rpb24gaWRlbnRpZnkodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG4gIH0sXG4gIGRlZmF1bHQ6IHRydWUsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLFxuICB0ZXN0OiAvXnRydWV8ZmFsc2UkLyxcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZShzdHIpIHtcbiAgICByZXR1cm4gc3RyID09PSAndHJ1ZSc7XG4gIH0sXG4gIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxufSwge1xuICBpZGVudGlmeTogaW50SWRlbnRpZnkkMSxcbiAgZGVmYXVsdDogdHJ1ZSxcbiAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgdGVzdDogL14tPyg/OjB8WzEtOV1bMC05XSopJC8sXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoc3RyKSB7XG4gICAgcmV0dXJuIGludE9wdGlvbnMuYXNCaWdJbnQgPyBCaWdJbnQoc3RyKSA6IHBhcnNlSW50KHN0ciwgMTApO1xuICB9LFxuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShfcmVmMikge1xuICAgIHZhciB2YWx1ZSA9IF9yZWYyLnZhbHVlO1xuICAgIHJldHVybiBpbnRJZGVudGlmeSQxKHZhbHVlKSA/IHZhbHVlLnRvU3RyaW5nKCkgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH1cbn0sIHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIGRlZmF1bHQ6IHRydWUsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgdGVzdDogL14tPyg/OjB8WzEtOV1bMC05XSopKD86XFwuWzAtOV0qKT8oPzpbZUVdWy0rXT9bMC05XSspPyQvLFxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHN0cikge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHN0cik7XG4gIH0sXG4gIHN0cmluZ2lmeTogc3RyaW5naWZ5SlNPTlxufV07XG5cbmpzb24uc2NhbGFyRmFsbGJhY2sgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIHRocm93IG5ldyBTeW50YXhFcnJvcihcIlVucmVzb2x2ZWQgcGxhaW4gc2NhbGFyIFwiLmNvbmNhdChKU09OLnN0cmluZ2lmeShzdHIpKSk7XG59O1xuXG4vKiBnbG9iYWwgQmlnSW50ICovXG5cbnZhciBib29sU3RyaW5naWZ5ID0gZnVuY3Rpb24gYm9vbFN0cmluZ2lmeShfcmVmKSB7XG4gIHZhciB2YWx1ZSA9IF9yZWYudmFsdWU7XG4gIHJldHVybiB2YWx1ZSA/IGJvb2xPcHRpb25zLnRydWVTdHIgOiBib29sT3B0aW9ucy5mYWxzZVN0cjtcbn07XG5cbnZhciBpbnRJZGVudGlmeSQyID0gZnVuY3Rpb24gaW50SWRlbnRpZnkodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgfHwgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSk7XG59O1xuXG5mdW5jdGlvbiBpbnRSZXNvbHZlJDEoc2lnbiwgc3JjLCByYWRpeCkge1xuICB2YXIgc3RyID0gc3JjLnJlcGxhY2UoL18vZywgJycpO1xuXG4gIGlmIChpbnRPcHRpb25zLmFzQmlnSW50KSB7XG4gICAgc3dpdGNoIChyYWRpeCkge1xuICAgICAgY2FzZSAyOlxuICAgICAgICBzdHIgPSBcIjBiXCIuY29uY2F0KHN0cik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIDg6XG4gICAgICAgIHN0ciA9IFwiMG9cIi5jb25jYXQoc3RyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgMTY6XG4gICAgICAgIHN0ciA9IFwiMHhcIi5jb25jYXQoc3RyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIF9uID0gQmlnSW50KHN0cik7XG5cbiAgICByZXR1cm4gc2lnbiA9PT0gJy0nID8gQmlnSW50KC0xKSAqIF9uIDogX247XG4gIH1cblxuICB2YXIgbiA9IHBhcnNlSW50KHN0ciwgcmFkaXgpO1xuICByZXR1cm4gc2lnbiA9PT0gJy0nID8gLTEgKiBuIDogbjtcbn1cblxuZnVuY3Rpb24gaW50U3RyaW5naWZ5JDEobm9kZSwgcmFkaXgsIHByZWZpeCkge1xuICB2YXIgdmFsdWUgPSBub2RlLnZhbHVlO1xuXG4gIGlmIChpbnRJZGVudGlmeSQyKHZhbHVlKSkge1xuICAgIHZhciBzdHIgPSB2YWx1ZS50b1N0cmluZyhyYWRpeCk7XG4gICAgcmV0dXJuIHZhbHVlIDwgMCA/ICctJyArIHByZWZpeCArIHN0ci5zdWJzdHIoMSkgOiBwcmVmaXggKyBzdHI7XG4gIH1cblxuICByZXR1cm4gc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xufVxuXG52YXIgeWFtbDExID0gZmFpbHNhZmUuY29uY2F0KFt7XG4gIGlkZW50aWZ5OiBmdW5jdGlvbiBpZGVudGlmeSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsO1xuICB9LFxuICBjcmVhdGVOb2RlOiBmdW5jdGlvbiBjcmVhdGVOb2RlKHNjaGVtYSwgdmFsdWUsIGN0eCkge1xuICAgIHJldHVybiBjdHgud3JhcFNjYWxhcnMgPyBuZXcgU2NhbGFyKG51bGwpIDogbnVsbDtcbiAgfSxcbiAgZGVmYXVsdDogdHJ1ZSxcbiAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6bnVsbCcsXG4gIHRlc3Q6IC9eKD86fnxbTm5ddWxsfE5VTEwpPyQvLFxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9LFxuICBvcHRpb25zOiBudWxsT3B0aW9ucyxcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoKSB7XG4gICAgcmV0dXJuIG51bGxPcHRpb25zLm51bGxTdHI7XG4gIH1cbn0sIHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuICB9LFxuICBkZWZhdWx0OiB0cnVlLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpib29sJyxcbiAgdGVzdDogL14oPzpZfHl8W1l5XWVzfFlFU3xbVHRdcnVlfFRSVUV8W09vXW58T04pJC8sXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG9wdGlvbnM6IGJvb2xPcHRpb25zLFxuICBzdHJpbmdpZnk6IGJvb2xTdHJpbmdpZnlcbn0sIHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xuICB9LFxuICBkZWZhdWx0OiB0cnVlLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpib29sJyxcbiAgdGVzdDogL14oPzpOfG58W05uXW98Tk98W0ZmXWFsc2V8RkFMU0V8W09vXWZmfE9GRikkL2ksXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBvcHRpb25zOiBib29sT3B0aW9ucyxcbiAgc3RyaW5naWZ5OiBib29sU3RyaW5naWZ5XG59LCB7XG4gIGlkZW50aWZ5OiBpbnRJZGVudGlmeSQyLFxuICBkZWZhdWx0OiB0cnVlLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICBmb3JtYXQ6ICdCSU4nLFxuICB0ZXN0OiAvXihbLStdPykwYihbMC0xX10rKSQvLFxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHN0ciwgc2lnbiwgYmluKSB7XG4gICAgcmV0dXJuIGludFJlc29sdmUkMShzaWduLCBiaW4sIDIpO1xuICB9LFxuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShub2RlKSB7XG4gICAgcmV0dXJuIGludFN0cmluZ2lmeSQxKG5vZGUsIDIsICcwYicpO1xuICB9XG59LCB7XG4gIGlkZW50aWZ5OiBpbnRJZGVudGlmeSQyLFxuICBkZWZhdWx0OiB0cnVlLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICBmb3JtYXQ6ICdPQ1QnLFxuICB0ZXN0OiAvXihbLStdPykwKFswLTdfXSspJC8sXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoc3RyLCBzaWduLCBvY3QpIHtcbiAgICByZXR1cm4gaW50UmVzb2x2ZSQxKHNpZ24sIG9jdCwgOCk7XG4gIH0sXG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KG5vZGUpIHtcbiAgICByZXR1cm4gaW50U3RyaW5naWZ5JDEobm9kZSwgOCwgJzAnKTtcbiAgfVxufSwge1xuICBpZGVudGlmeTogaW50SWRlbnRpZnkkMixcbiAgZGVmYXVsdDogdHJ1ZSxcbiAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgdGVzdDogL14oWy0rXT8pKFswLTldWzAtOV9dKikkLyxcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZShzdHIsIHNpZ24sIGFicykge1xuICAgIHJldHVybiBpbnRSZXNvbHZlJDEoc2lnbiwgYWJzLCAxMCk7XG4gIH0sXG4gIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59LCB7XG4gIGlkZW50aWZ5OiBpbnRJZGVudGlmeSQyLFxuICBkZWZhdWx0OiB0cnVlLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICBmb3JtYXQ6ICdIRVgnLFxuICB0ZXN0OiAvXihbLStdPykweChbMC05YS1mQS1GX10rKSQvLFxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHN0ciwgc2lnbiwgaGV4KSB7XG4gICAgcmV0dXJuIGludFJlc29sdmUkMShzaWduLCBoZXgsIDE2KTtcbiAgfSxcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkobm9kZSkge1xuICAgIHJldHVybiBpbnRTdHJpbmdpZnkkMShub2RlLCAxNiwgJzB4Jyk7XG4gIH1cbn0sIHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIGRlZmF1bHQ6IHRydWUsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgdGVzdDogL14oPzpbLStdP1xcLmluZnwoXFwubmFuKSkkL2ksXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoc3RyLCBuYW4pIHtcbiAgICByZXR1cm4gbmFuID8gTmFOIDogc3RyWzBdID09PSAnLScgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIH0sXG4gIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59LCB7XG4gIGlkZW50aWZ5OiBmdW5jdGlvbiBpZGVudGlmeSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xuICB9LFxuICBkZWZhdWx0OiB0cnVlLFxuICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gIGZvcm1hdDogJ0VYUCcsXG4gIHRlc3Q6IC9eWy0rXT8oWzAtOV1bMC05X10qKT8oXFwuWzAtOV9dKik/W2VFXVstK10/WzAtOV0rJC8sXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoc3RyKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyLnJlcGxhY2UoL18vZywgJycpKTtcbiAgfSxcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoX3JlZjIpIHtcbiAgICB2YXIgdmFsdWUgPSBfcmVmMi52YWx1ZTtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlKS50b0V4cG9uZW50aWFsKCk7XG4gIH1cbn0sIHtcbiAgaWRlbnRpZnk6IGZ1bmN0aW9uIGlkZW50aWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gIH0sXG4gIGRlZmF1bHQ6IHRydWUsXG4gIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgdGVzdDogL15bLStdPyg/OlswLTldWzAtOV9dKik/XFwuKFswLTlfXSopJC8sXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoc3RyLCBmcmFjKSB7XG4gICAgdmFyIG5vZGUgPSBuZXcgU2NhbGFyKHBhcnNlRmxvYXQoc3RyLnJlcGxhY2UoL18vZywgJycpKSk7XG5cbiAgICBpZiAoZnJhYykge1xuICAgICAgdmFyIGYgPSBmcmFjLnJlcGxhY2UoL18vZywgJycpO1xuICAgICAgaWYgKGZbZi5sZW5ndGggLSAxXSA9PT0gJzAnKSBub2RlLm1pbkZyYWN0aW9uRGlnaXRzID0gZi5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH0sXG4gIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59XSwgYmluYXJ5LCBvbWFwLCBwYWlycywgc2V0LCBpbnRUaW1lLCBmbG9hdFRpbWUsIHRpbWVzdGFtcCk7XG5cbnZhciBzY2hlbWFzID0ge1xuICBjb3JlOiBjb3JlLFxuICBmYWlsc2FmZTogZmFpbHNhZmUsXG4gIGpzb246IGpzb24sXG4gIHlhbWwxMTogeWFtbDExXG59O1xudmFyIHRhZ3MgPSB7XG4gIGJpbmFyeTogYmluYXJ5LFxuICBib29sOiBib29sT2JqLFxuICBmbG9hdDogZmxvYXRPYmosXG4gIGZsb2F0RXhwOiBleHBPYmosXG4gIGZsb2F0TmFOOiBuYW5PYmosXG4gIGZsb2F0VGltZTogZmxvYXRUaW1lLFxuICBpbnQ6IGludE9iaixcbiAgaW50SGV4OiBoZXhPYmosXG4gIGludE9jdDogb2N0T2JqLFxuICBpbnRUaW1lOiBpbnRUaW1lLFxuICBtYXA6IG1hcCxcbiAgbnVsbDogbnVsbE9iaixcbiAgb21hcDogb21hcCxcbiAgcGFpcnM6IHBhaXJzLFxuICBzZXE6IHNlcSxcbiAgc2V0OiBzZXQsXG4gIHRpbWVzdGFtcDogdGltZXN0YW1wXG59O1xuXG5mdW5jdGlvbiBmaW5kVGFnT2JqZWN0KHZhbHVlLCB0YWdOYW1lLCB0YWdzKSB7XG4gIGlmICh0YWdOYW1lKSB7XG4gICAgdmFyIG1hdGNoID0gdGFncy5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0LnRhZyA9PT0gdGFnTmFtZTtcbiAgICB9KTtcbiAgICB2YXIgdGFnT2JqID0gbWF0Y2guZmluZChmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuICF0LmZvcm1hdDtcbiAgICB9KSB8fCBtYXRjaFswXTtcbiAgICBpZiAoIXRhZ09iaikgdGhyb3cgbmV3IEVycm9yKFwiVGFnIFwiLmNvbmNhdCh0YWdOYW1lLCBcIiBub3QgZm91bmRcIikpO1xuICAgIHJldHVybiB0YWdPYmo7XG4gIH0gLy8gVE9ETzogZGVwcmVjYXRlL3JlbW92ZSBjbGFzcyBjaGVja1xuXG5cbiAgcmV0dXJuIHRhZ3MuZmluZChmdW5jdGlvbiAodCkge1xuICAgIHJldHVybiAodC5pZGVudGlmeSAmJiB0LmlkZW50aWZ5KHZhbHVlKSB8fCB0LmNsYXNzICYmIHZhbHVlIGluc3RhbmNlb2YgdC5jbGFzcykgJiYgIXQuZm9ybWF0O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTm9kZSh2YWx1ZSwgdGFnTmFtZSwgY3R4KSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE5vZGUpIHJldHVybiB2YWx1ZTtcbiAgdmFyIGRlZmF1bHRQcmVmaXggPSBjdHguZGVmYXVsdFByZWZpeCxcbiAgICAgIG9uVGFnT2JqID0gY3R4Lm9uVGFnT2JqLFxuICAgICAgcHJldk9iamVjdHMgPSBjdHgucHJldk9iamVjdHMsXG4gICAgICBzY2hlbWEgPSBjdHguc2NoZW1hLFxuICAgICAgd3JhcFNjYWxhcnMgPSBjdHgud3JhcFNjYWxhcnM7XG4gIGlmICh0YWdOYW1lICYmIHRhZ05hbWUuc3RhcnRzV2l0aCgnISEnKSkgdGFnTmFtZSA9IGRlZmF1bHRQcmVmaXggKyB0YWdOYW1lLnNsaWNlKDIpO1xuICB2YXIgdGFnT2JqID0gZmluZFRhZ09iamVjdCh2YWx1ZSwgdGFnTmFtZSwgc2NoZW1hLnRhZ3MpO1xuXG4gIGlmICghdGFnT2JqKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZS50b0pTT04gPT09ICdmdW5jdGlvbicpIHZhbHVlID0gdmFsdWUudG9KU09OKCk7XG4gICAgaWYgKF90eXBlb2YodmFsdWUpICE9PSAnb2JqZWN0JykgcmV0dXJuIHdyYXBTY2FsYXJzID8gbmV3IFNjYWxhcih2YWx1ZSkgOiB2YWx1ZTtcbiAgICB0YWdPYmogPSB2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IG1hcCA6IHZhbHVlW1N5bWJvbC5pdGVyYXRvcl0gPyBzZXEgOiBtYXA7XG4gIH1cblxuICBpZiAob25UYWdPYmopIHtcbiAgICBvblRhZ09iaih0YWdPYmopO1xuICAgIGRlbGV0ZSBjdHgub25UYWdPYmo7XG4gIH0gLy8gRGV0ZWN0IGR1cGxpY2F0ZSByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIG9iamVjdCAmIHVzZSBBbGlhcyBub2RlcyBmb3IgYWxsXG4gIC8vIGFmdGVyIGZpcnN0LiBUaGUgYG9iamAgd3JhcHBlciBhbGxvd3MgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgdG8gcmVzb2x2ZS5cblxuXG4gIHZhciBvYmogPSB7fTtcblxuICBpZiAodmFsdWUgJiYgX3R5cGVvZih2YWx1ZSkgPT09ICdvYmplY3QnICYmIHByZXZPYmplY3RzKSB7XG4gICAgdmFyIHByZXYgPSBwcmV2T2JqZWN0cy5nZXQodmFsdWUpO1xuXG4gICAgaWYgKHByZXYpIHtcbiAgICAgIHZhciBhbGlhcyA9IG5ldyBBbGlhcyhwcmV2KTsgLy8gbGVhdmVzIHNvdXJjZSBkaXJ0eTsgbXVzdCBiZSBjbGVhbmVkIGJ5IGNhbGxlclxuXG4gICAgICBjdHguYWxpYXNOb2Rlcy5wdXNoKGFsaWFzKTsgLy8gZGVmaW5lZCBhbG9uZyB3aXRoIHByZXZPYmplY3RzXG5cbiAgICAgIHJldHVybiBhbGlhcztcbiAgICB9XG5cbiAgICBvYmoudmFsdWUgPSB2YWx1ZTtcbiAgICBwcmV2T2JqZWN0cy5zZXQodmFsdWUsIG9iaik7XG4gIH1cblxuICBvYmoubm9kZSA9IHRhZ09iai5jcmVhdGVOb2RlID8gdGFnT2JqLmNyZWF0ZU5vZGUoY3R4LnNjaGVtYSwgdmFsdWUsIGN0eCkgOiB3cmFwU2NhbGFycyA/IG5ldyBTY2FsYXIodmFsdWUpIDogdmFsdWU7XG4gIGlmICh0YWdOYW1lICYmIG9iai5ub2RlIGluc3RhbmNlb2YgTm9kZSkgb2JqLm5vZGUudGFnID0gdGFnTmFtZTtcbiAgcmV0dXJuIG9iai5ub2RlO1xufVxuXG5mdW5jdGlvbiBnZXRTY2hlbWFUYWdzKHNjaGVtYXMsIGtub3duVGFncywgY3VzdG9tVGFncywgc2NoZW1hSWQpIHtcbiAgdmFyIHRhZ3MgPSBzY2hlbWFzW3NjaGVtYUlkLnJlcGxhY2UoL1xcVy9nLCAnJyldOyAvLyAneWFtbC0xLjEnIC0+ICd5YW1sMTEnXG5cbiAgaWYgKCF0YWdzKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWFzKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGtleSk7XG4gICAgfSkuam9pbignLCAnKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHNjaGVtYSBcXFwiXCIuY29uY2F0KHNjaGVtYUlkLCBcIlxcXCI7IHVzZSBvbmUgb2YgXCIpLmNvbmNhdChrZXlzKSk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShjdXN0b21UYWdzKSkge1xuICAgIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihjdXN0b21UYWdzKSxcbiAgICAgICAgX3N0ZXA7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgdmFyIHRhZyA9IF9zdGVwLnZhbHVlO1xuICAgICAgICB0YWdzID0gdGFncy5jb25jYXQodGFnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBjdXN0b21UYWdzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGFncyA9IGN1c3RvbVRhZ3ModGFncy5zbGljZSgpKTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGFncy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBfdGFnID0gdGFnc1tpXTtcblxuICAgIGlmICh0eXBlb2YgX3RhZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciB0YWdPYmogPSBrbm93blRhZ3NbX3RhZ107XG5cbiAgICAgIGlmICghdGFnT2JqKSB7XG4gICAgICAgIHZhciBfa2V5cyA9IE9iamVjdC5rZXlzKGtub3duVGFncykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoa2V5KTtcbiAgICAgICAgfSkuam9pbignLCAnKTtcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGN1c3RvbSB0YWcgXFxcIlwiLmNvbmNhdChfdGFnLCBcIlxcXCI7IHVzZSBvbmUgb2YgXCIpLmNvbmNhdChfa2V5cykpO1xuICAgICAgfVxuXG4gICAgICB0YWdzW2ldID0gdGFnT2JqO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YWdzO1xufVxuXG52YXIgc29ydE1hcEVudHJpZXNCeUtleSA9IGZ1bmN0aW9uIHNvcnRNYXBFbnRyaWVzQnlLZXkoYSwgYikge1xuICByZXR1cm4gYS5rZXkgPCBiLmtleSA/IC0xIDogYS5rZXkgPiBiLmtleSA/IDEgOiAwO1xufTtcblxudmFyIFNjaGVtYSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIC8vIFRPRE86IHJlbW92ZSBpbiB2MlxuICAvLyBUT0RPOiByZW1vdmUgaW4gdjJcbiAgZnVuY3Rpb24gU2NoZW1hKF9yZWYpIHtcbiAgICB2YXIgY3VzdG9tVGFncyA9IF9yZWYuY3VzdG9tVGFncyxcbiAgICAgICAgbWVyZ2UgPSBfcmVmLm1lcmdlLFxuICAgICAgICBzY2hlbWEgPSBfcmVmLnNjaGVtYSxcbiAgICAgICAgc29ydE1hcEVudHJpZXMgPSBfcmVmLnNvcnRNYXBFbnRyaWVzLFxuICAgICAgICBkZXByZWNhdGVkQ3VzdG9tVGFncyA9IF9yZWYudGFncztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTY2hlbWEpO1xuXG4gICAgdGhpcy5tZXJnZSA9ICEhbWVyZ2U7XG4gICAgdGhpcy5uYW1lID0gc2NoZW1hO1xuICAgIHRoaXMuc29ydE1hcEVudHJpZXMgPSBzb3J0TWFwRW50cmllcyA9PT0gdHJ1ZSA/IHNvcnRNYXBFbnRyaWVzQnlLZXkgOiBzb3J0TWFwRW50cmllcyB8fCBudWxsO1xuICAgIGlmICghY3VzdG9tVGFncyAmJiBkZXByZWNhdGVkQ3VzdG9tVGFncykgd2Fybk9wdGlvbkRlcHJlY2F0aW9uKCd0YWdzJywgJ2N1c3RvbVRhZ3MnKTtcbiAgICB0aGlzLnRhZ3MgPSBnZXRTY2hlbWFUYWdzKHNjaGVtYXMsIHRhZ3MsIGN1c3RvbVRhZ3MgfHwgZGVwcmVjYXRlZEN1c3RvbVRhZ3MsIHNjaGVtYSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU2NoZW1hLCBbe1xuICAgIGtleTogXCJjcmVhdGVOb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZU5vZGUkMSh2YWx1ZSwgd3JhcFNjYWxhcnMsIHRhZ05hbWUsIGN0eCkge1xuICAgICAgdmFyIGJhc2VDdHggPSB7XG4gICAgICAgIGRlZmF1bHRQcmVmaXg6IFNjaGVtYS5kZWZhdWx0UHJlZml4LFxuICAgICAgICBzY2hlbWE6IHRoaXMsXG4gICAgICAgIHdyYXBTY2FsYXJzOiB3cmFwU2NhbGFyc1xuICAgICAgfTtcbiAgICAgIHZhciBjcmVhdGVDdHggPSBjdHggPyBPYmplY3QuYXNzaWduKGN0eCwgYmFzZUN0eCkgOiBiYXNlQ3R4O1xuICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUodmFsdWUsIHRhZ05hbWUsIGNyZWF0ZUN0eCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVBhaXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlUGFpcihrZXksIHZhbHVlLCBjdHgpIHtcbiAgICAgIGlmICghY3R4KSBjdHggPSB7XG4gICAgICAgIHdyYXBTY2FsYXJzOiB0cnVlXG4gICAgICB9O1xuICAgICAgdmFyIGsgPSB0aGlzLmNyZWF0ZU5vZGUoa2V5LCBjdHgud3JhcFNjYWxhcnMsIG51bGwsIGN0eCk7XG4gICAgICB2YXIgdiA9IHRoaXMuY3JlYXRlTm9kZSh2YWx1ZSwgY3R4LndyYXBTY2FsYXJzLCBudWxsLCBjdHgpO1xuICAgICAgcmV0dXJuIG5ldyBQYWlyKGssIHYpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTY2hlbWE7XG59KCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShTY2hlbWEsIFwiZGVmYXVsdFByZWZpeFwiLCBkZWZhdWx0VGFnUHJlZml4KTtcblxuX2RlZmluZVByb3BlcnR5KFNjaGVtYSwgXCJkZWZhdWx0VGFnc1wiLCBkZWZhdWx0VGFncyk7XG5cbmV4cG9ydCB7IFNjaGVtYSBhcyBTIH07XG4iLCJpbXBvcnQgeyBkIGFzIGRlZmF1bHRUYWdQcmVmaXgsIF8gYXMgX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIsIGEgYXMgX3R5cGVvZiwgYiBhcyBfY3JlYXRlQ2xhc3MsIGMgYXMgX2NsYXNzQ2FsbENoZWNrLCBlIGFzIF9kZWZpbmVQcm9wZXJ0eSwgWSBhcyBZQU1MU3ludGF4RXJyb3IsIFQgYXMgVHlwZSwgZiBhcyBZQU1MV2FybmluZywgZyBhcyBZQU1MU2VtYW50aWNFcnJvciwgaCBhcyBfc2xpY2VkVG9BcnJheSwgaSBhcyBZQU1MRXJyb3IsIGogYXMgX2luaGVyaXRzLCBrIGFzIF9jcmVhdGVTdXBlciB9IGZyb20gJy4vUGxhaW5WYWx1ZS1mZjUxNDdjNi5qcyc7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZSQxIH0gZnJvbSAnLi9wYXJzZS1jc3QuanMnO1xuaW1wb3J0IHsgYiBhcyBiaW5hcnlPcHRpb25zLCBhIGFzIGJvb2xPcHRpb25zLCBpIGFzIGludE9wdGlvbnMsIG4gYXMgbnVsbE9wdGlvbnMsIHMgYXMgc3RyT3B0aW9ucywgTiBhcyBOb2RlLCBQIGFzIFBhaXIsIFMgYXMgU2NhbGFyLCBjIGFzIHN0cmluZ2lmeVN0cmluZywgQSBhcyBBbGlhcywgWSBhcyBZQU1MU2VxLCBkIGFzIFlBTUxNYXAsIE0gYXMgTWVyZ2UsIEMgYXMgQ29sbGVjdGlvbiwgciBhcyByZXNvbHZlTm9kZSwgZSBhcyBpc0VtcHR5UGF0aCwgdCBhcyB0b0pTT04sIGYgYXMgYWRkQ29tbWVudCB9IGZyb20gJy4vcmVzb2x2ZVNlcS0wNDgyNWYzMC5qcyc7XG5pbXBvcnQgeyBTIGFzIFNjaGVtYSB9IGZyb20gJy4vU2NoZW1hLTJiZjJjNzRlLmpzJztcbmltcG9ydCB7IHcgYXMgd2FybiB9IGZyb20gJy4vd2FybmluZ3MtMGU0YjcwZDMuanMnO1xuXG52YXIgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGFuY2hvclByZWZpeDogJ2EnLFxuICBjdXN0b21UYWdzOiBudWxsLFxuICBpbmRlbnQ6IDIsXG4gIGluZGVudFNlcTogdHJ1ZSxcbiAga2VlcENzdE5vZGVzOiBmYWxzZSxcbiAga2VlcE5vZGVUeXBlczogdHJ1ZSxcbiAga2VlcEJsb2JzSW5KU09OOiB0cnVlLFxuICBtYXBBc01hcDogZmFsc2UsXG4gIG1heEFsaWFzQ291bnQ6IDEwMCxcbiAgcHJldHR5RXJyb3JzOiBmYWxzZSxcbiAgLy8gVE9ETyBTZXQgdHJ1ZSBpbiB2MlxuICBzaW1wbGVLZXlzOiBmYWxzZSxcbiAgdmVyc2lvbjogJzEuMidcbn07XG52YXIgc2NhbGFyT3B0aW9ucyA9IHtcbiAgZ2V0IGJpbmFyeSgpIHtcbiAgICByZXR1cm4gYmluYXJ5T3B0aW9ucztcbiAgfSxcblxuICBzZXQgYmluYXJ5KG9wdCkge1xuICAgIE9iamVjdC5hc3NpZ24oYmluYXJ5T3B0aW9ucywgb3B0KTtcbiAgfSxcblxuICBnZXQgYm9vbCgpIHtcbiAgICByZXR1cm4gYm9vbE9wdGlvbnM7XG4gIH0sXG5cbiAgc2V0IGJvb2wob3B0KSB7XG4gICAgT2JqZWN0LmFzc2lnbihib29sT3B0aW9ucywgb3B0KTtcbiAgfSxcblxuICBnZXQgaW50KCkge1xuICAgIHJldHVybiBpbnRPcHRpb25zO1xuICB9LFxuXG4gIHNldCBpbnQob3B0KSB7XG4gICAgT2JqZWN0LmFzc2lnbihpbnRPcHRpb25zLCBvcHQpO1xuICB9LFxuXG4gIGdldCBudWxsKCkge1xuICAgIHJldHVybiBudWxsT3B0aW9ucztcbiAgfSxcblxuICBzZXQgbnVsbChvcHQpIHtcbiAgICBPYmplY3QuYXNzaWduKG51bGxPcHRpb25zLCBvcHQpO1xuICB9LFxuXG4gIGdldCBzdHIoKSB7XG4gICAgcmV0dXJuIHN0ck9wdGlvbnM7XG4gIH0sXG5cbiAgc2V0IHN0cihvcHQpIHtcbiAgICBPYmplY3QuYXNzaWduKHN0ck9wdGlvbnMsIG9wdCk7XG4gIH1cblxufTtcbnZhciBkb2N1bWVudE9wdGlvbnMgPSB7XG4gICcxLjAnOiB7XG4gICAgc2NoZW1hOiAneWFtbC0xLjEnLFxuICAgIG1lcmdlOiB0cnVlLFxuICAgIHRhZ1ByZWZpeGVzOiBbe1xuICAgICAgaGFuZGxlOiAnIScsXG4gICAgICBwcmVmaXg6IGRlZmF1bHRUYWdQcmVmaXhcbiAgICB9LCB7XG4gICAgICBoYW5kbGU6ICchIScsXG4gICAgICBwcmVmaXg6ICd0YWc6cHJpdmF0ZS55YW1sLm9yZywyMDAyOidcbiAgICB9XVxuICB9LFxuICAnMS4xJzoge1xuICAgIHNjaGVtYTogJ3lhbWwtMS4xJyxcbiAgICBtZXJnZTogdHJ1ZSxcbiAgICB0YWdQcmVmaXhlczogW3tcbiAgICAgIGhhbmRsZTogJyEnLFxuICAgICAgcHJlZml4OiAnISdcbiAgICB9LCB7XG4gICAgICBoYW5kbGU6ICchIScsXG4gICAgICBwcmVmaXg6IGRlZmF1bHRUYWdQcmVmaXhcbiAgICB9XVxuICB9LFxuICAnMS4yJzoge1xuICAgIHNjaGVtYTogJ2NvcmUnLFxuICAgIG1lcmdlOiBmYWxzZSxcbiAgICB0YWdQcmVmaXhlczogW3tcbiAgICAgIGhhbmRsZTogJyEnLFxuICAgICAgcHJlZml4OiAnISdcbiAgICB9LCB7XG4gICAgICBoYW5kbGU6ICchIScsXG4gICAgICBwcmVmaXg6IGRlZmF1bHRUYWdQcmVmaXhcbiAgICB9XVxuICB9XG59O1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlUYWcoZG9jLCB0YWcpIHtcbiAgaWYgKChkb2MudmVyc2lvbiB8fCBkb2Mub3B0aW9ucy52ZXJzaW9uKSA9PT0gJzEuMCcpIHtcbiAgICB2YXIgcHJpdiA9IHRhZy5tYXRjaCgvXnRhZzpwcml2YXRlXFwueWFtbFxcLm9yZywyMDAyOihbXjovXSspJC8pO1xuICAgIGlmIChwcml2KSByZXR1cm4gJyEnICsgcHJpdlsxXTtcbiAgICB2YXIgdm9jYWIgPSB0YWcubWF0Y2goL150YWc6KFthLXpBLVowLTktXSspXFwueWFtbFxcLm9yZywyMDAyOiguKikvKTtcbiAgICByZXR1cm4gdm9jYWIgPyBcIiFcIi5jb25jYXQodm9jYWJbMV0sIFwiL1wiKS5jb25jYXQodm9jYWJbMl0pIDogXCIhXCIuY29uY2F0KHRhZy5yZXBsYWNlKC9edGFnOi8sICcnKSk7XG4gIH1cblxuICB2YXIgcCA9IGRvYy50YWdQcmVmaXhlcy5maW5kKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHRhZy5pbmRleE9mKHAucHJlZml4KSA9PT0gMDtcbiAgfSk7XG5cbiAgaWYgKCFwKSB7XG4gICAgdmFyIGR0cCA9IGRvYy5nZXREZWZhdWx0cygpLnRhZ1ByZWZpeGVzO1xuICAgIHAgPSBkdHAgJiYgZHRwLmZpbmQoZnVuY3Rpb24gKHApIHtcbiAgICAgIHJldHVybiB0YWcuaW5kZXhPZihwLnByZWZpeCkgPT09IDA7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoIXApIHJldHVybiB0YWdbMF0gPT09ICchJyA/IHRhZyA6IFwiITxcIi5jb25jYXQodGFnLCBcIj5cIik7XG4gIHZhciBzdWZmaXggPSB0YWcuc3Vic3RyKHAucHJlZml4Lmxlbmd0aCkucmVwbGFjZSgvWyEsW1xcXXt9XS9nLCBmdW5jdGlvbiAoY2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJyEnOiAnJTIxJyxcbiAgICAgICcsJzogJyUyQycsXG4gICAgICAnWyc6ICclNUInLFxuICAgICAgJ10nOiAnJTVEJyxcbiAgICAgICd7JzogJyU3QicsXG4gICAgICAnfSc6ICclN0QnXG4gICAgfVtjaF07XG4gIH0pO1xuICByZXR1cm4gcC5oYW5kbGUgKyBzdWZmaXg7XG59XG5cbmZ1bmN0aW9uIGdldFRhZ09iamVjdCh0YWdzLCBpdGVtKSB7XG4gIGlmIChpdGVtIGluc3RhbmNlb2YgQWxpYXMpIHJldHVybiBBbGlhcztcblxuICBpZiAoaXRlbS50YWcpIHtcbiAgICB2YXIgbWF0Y2ggPSB0YWdzLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQudGFnID09PSBpdGVtLnRhZztcbiAgICB9KTtcbiAgICBpZiAobWF0Y2gubGVuZ3RoID4gMCkgcmV0dXJuIG1hdGNoLmZpbmQoZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0LmZvcm1hdCA9PT0gaXRlbS5mb3JtYXQ7XG4gICAgfSkgfHwgbWF0Y2hbMF07XG4gIH1cblxuICB2YXIgdGFnT2JqLCBvYmo7XG5cbiAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTY2FsYXIpIHtcbiAgICBvYmogPSBpdGVtLnZhbHVlOyAvLyBUT0RPOiBkZXByZWNhdGUvcmVtb3ZlIGNsYXNzIGNoZWNrXG5cbiAgICB2YXIgX21hdGNoID0gdGFncy5maWx0ZXIoZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiB0LmlkZW50aWZ5ICYmIHQuaWRlbnRpZnkob2JqKSB8fCB0LmNsYXNzICYmIG9iaiBpbnN0YW5jZW9mIHQuY2xhc3M7XG4gICAgfSk7XG5cbiAgICB0YWdPYmogPSBfbWF0Y2guZmluZChmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQuZm9ybWF0ID09PSBpdGVtLmZvcm1hdDtcbiAgICB9KSB8fCBfbWF0Y2guZmluZChmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuICF0LmZvcm1hdDtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmogPSBpdGVtO1xuICAgIHRhZ09iaiA9IHRhZ3MuZmluZChmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQubm9kZUNsYXNzICYmIG9iaiBpbnN0YW5jZW9mIHQubm9kZUNsYXNzO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKCF0YWdPYmopIHtcbiAgICB2YXIgbmFtZSA9IG9iaiAmJiBvYmouY29uc3RydWN0b3IgPyBvYmouY29uc3RydWN0b3IubmFtZSA6IF90eXBlb2Yob2JqKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYWcgbm90IHJlc29sdmVkIGZvciBcIi5jb25jYXQobmFtZSwgXCIgdmFsdWVcIikpO1xuICB9XG5cbiAgcmV0dXJuIHRhZ09iajtcbn0gLy8gbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB2YWx1ZSBzdHJpbmdpZmllciB0byBhbGxvdyBmb3IgY2lyY3VsYXIgYW5jaG9yIHJlZnNcblxuXG5mdW5jdGlvbiBzdHJpbmdpZnlQcm9wcyhub2RlLCB0YWdPYmosIF9yZWYpIHtcbiAgdmFyIGFuY2hvcnMgPSBfcmVmLmFuY2hvcnMsXG4gICAgICBkb2MgPSBfcmVmLmRvYztcbiAgdmFyIHByb3BzID0gW107XG4gIHZhciBhbmNob3IgPSBkb2MuYW5jaG9ycy5nZXROYW1lKG5vZGUpO1xuXG4gIGlmIChhbmNob3IpIHtcbiAgICBhbmNob3JzW2FuY2hvcl0gPSBub2RlO1xuICAgIHByb3BzLnB1c2goXCImXCIuY29uY2F0KGFuY2hvcikpO1xuICB9XG5cbiAgaWYgKG5vZGUudGFnKSB7XG4gICAgcHJvcHMucHVzaChzdHJpbmdpZnlUYWcoZG9jLCBub2RlLnRhZykpO1xuICB9IGVsc2UgaWYgKCF0YWdPYmouZGVmYXVsdCkge1xuICAgIHByb3BzLnB1c2goc3RyaW5naWZ5VGFnKGRvYywgdGFnT2JqLnRhZykpO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5KGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICB2YXIgX2N0eCRkb2MgPSBjdHguZG9jLFxuICAgICAgYW5jaG9ycyA9IF9jdHgkZG9jLmFuY2hvcnMsXG4gICAgICBzY2hlbWEgPSBfY3R4JGRvYy5zY2hlbWE7XG4gIHZhciB0YWdPYmo7XG5cbiAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIE5vZGUpKSB7XG4gICAgdmFyIGNyZWF0ZUN0eCA9IHtcbiAgICAgIGFsaWFzTm9kZXM6IFtdLFxuICAgICAgb25UYWdPYmo6IGZ1bmN0aW9uIG9uVGFnT2JqKG8pIHtcbiAgICAgICAgcmV0dXJuIHRhZ09iaiA9IG87XG4gICAgICB9LFxuICAgICAgcHJldk9iamVjdHM6IG5ldyBNYXAoKVxuICAgIH07XG4gICAgaXRlbSA9IHNjaGVtYS5jcmVhdGVOb2RlKGl0ZW0sIHRydWUsIG51bGwsIGNyZWF0ZUN0eCk7XG5cbiAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoY3JlYXRlQ3R4LmFsaWFzTm9kZXMpLFxuICAgICAgICBfc3RlcDtcblxuICAgIHRyeSB7XG4gICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICB2YXIgYWxpYXMgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgYWxpYXMuc291cmNlID0gYWxpYXMuc291cmNlLm5vZGU7XG4gICAgICAgIHZhciBuYW1lID0gYW5jaG9ycy5nZXROYW1lKGFsaWFzLnNvdXJjZSk7XG5cbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IGFuY2hvcnMubmV3TmFtZSgpO1xuICAgICAgICAgIGFuY2hvcnMubWFwW25hbWVdID0gYWxpYXMuc291cmNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpdGVtIGluc3RhbmNlb2YgUGFpcikgcmV0dXJuIGl0ZW0udG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgaWYgKCF0YWdPYmopIHRhZ09iaiA9IGdldFRhZ09iamVjdChzY2hlbWEudGFncywgaXRlbSk7XG4gIHZhciBwcm9wcyA9IHN0cmluZ2lmeVByb3BzKGl0ZW0sIHRhZ09iaiwgY3R4KTtcbiAgaWYgKHByb3BzLmxlbmd0aCA+IDApIGN0eC5pbmRlbnRBdFN0YXJ0ID0gKGN0eC5pbmRlbnRBdFN0YXJ0IHx8IDApICsgcHJvcHMubGVuZ3RoICsgMTtcbiAgdmFyIHN0ciA9IHR5cGVvZiB0YWdPYmouc3RyaW5naWZ5ID09PSAnZnVuY3Rpb24nID8gdGFnT2JqLnN0cmluZ2lmeShpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIDogaXRlbSBpbnN0YW5jZW9mIFNjYWxhciA/IHN0cmluZ2lmeVN0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIDogaXRlbS50b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICBpZiAoIXByb3BzKSByZXR1cm4gc3RyO1xuICByZXR1cm4gaXRlbSBpbnN0YW5jZW9mIFNjYWxhciB8fCBzdHJbMF0gPT09ICd7JyB8fCBzdHJbMF0gPT09ICdbJyA/IFwiXCIuY29uY2F0KHByb3BzLCBcIiBcIikuY29uY2F0KHN0cikgOiBcIlwiLmNvbmNhdChwcm9wcywgXCJcXG5cIikuY29uY2F0KGN0eC5pbmRlbnQpLmNvbmNhdChzdHIpO1xufVxuXG52YXIgQW5jaG9ycyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIF9jcmVhdGVDbGFzcyhBbmNob3JzLCBudWxsLCBbe1xuICAgIGtleTogXCJ2YWxpZEFuY2hvck5vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdmFsaWRBbmNob3JOb2RlKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlIGluc3RhbmNlb2YgU2NhbGFyIHx8IG5vZGUgaW5zdGFuY2VvZiBZQU1MU2VxIHx8IG5vZGUgaW5zdGFuY2VvZiBZQU1MTWFwO1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIEFuY2hvcnMocHJlZml4KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFuY2hvcnMpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwibWFwXCIsIHt9KTtcblxuICAgIHRoaXMucHJlZml4ID0gcHJlZml4O1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEFuY2hvcnMsIFt7XG4gICAga2V5OiBcImNyZWF0ZUFsaWFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUFsaWFzKG5vZGUsIG5hbWUpIHtcbiAgICAgIHRoaXMuc2V0QW5jaG9yKG5vZGUsIG5hbWUpO1xuICAgICAgcmV0dXJuIG5ldyBBbGlhcyhub2RlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlTWVyZ2VQYWlyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZU1lcmdlUGFpcigpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBtZXJnZSA9IG5ldyBNZXJnZSgpO1xuXG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgc291cmNlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgc291cmNlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgbWVyZ2UudmFsdWUuaXRlbXMgPSBzb3VyY2VzLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgICBpZiAocyBpbnN0YW5jZW9mIEFsaWFzKSB7XG4gICAgICAgICAgaWYgKHMuc291cmNlIGluc3RhbmNlb2YgWUFNTE1hcCkgcmV0dXJuIHM7XG4gICAgICAgIH0gZWxzZSBpZiAocyBpbnN0YW5jZW9mIFlBTUxNYXApIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMuY3JlYXRlQWxpYXMocyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lcmdlIHNvdXJjZXMgbXVzdCBiZSBNYXAgbm9kZXMgb3IgdGhlaXIgQWxpYXNlcycpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbWVyZ2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldE5hbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TmFtZShub2RlKSB7XG4gICAgICB2YXIgbWFwID0gdGhpcy5tYXA7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMobWFwKS5maW5kKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHJldHVybiBtYXBbYV0gPT09IG5vZGU7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0TmFtZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TmFtZXMoKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5tYXApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXROb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5vZGUobmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFwW25hbWVdO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuZXdOYW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5ld05hbWUocHJlZml4KSB7XG4gICAgICBpZiAoIXByZWZpeCkgcHJlZml4ID0gdGhpcy5wcmVmaXg7XG4gICAgICB2YXIgbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLm1hcCk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAxOyB0cnVlOyArK2kpIHtcbiAgICAgICAgdmFyIG5hbWUgPSBcIlwiLmNvbmNhdChwcmVmaXgpLmNvbmNhdChpKTtcbiAgICAgICAgaWYgKCFuYW1lcy5pbmNsdWRlcyhuYW1lKSkgcmV0dXJuIG5hbWU7XG4gICAgICB9XG4gICAgfSAvLyBEdXJpbmcgcGFyc2luZywgbWFwICYgYWxpYXNlcyBjb250YWluIENTVCBub2Rlc1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVzb2x2ZU5vZGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc29sdmVOb2RlcygpIHtcbiAgICAgIHZhciBtYXAgPSB0aGlzLm1hcCxcbiAgICAgICAgICBfY3N0QWxpYXNlcyA9IHRoaXMuX2NzdEFsaWFzZXM7XG4gICAgICBPYmplY3Qua2V5cyhtYXApLmZvckVhY2goZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgbWFwW2FdID0gbWFwW2FdLnJlc29sdmVkO1xuICAgICAgfSk7XG5cbiAgICAgIF9jc3RBbGlhc2VzLmZvckVhY2goZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgYS5zb3VyY2UgPSBhLnNvdXJjZS5yZXNvbHZlZDtcbiAgICAgIH0pO1xuXG4gICAgICBkZWxldGUgdGhpcy5fY3N0QWxpYXNlcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0QW5jaG9yXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEFuY2hvcihub2RlLCBuYW1lKSB7XG4gICAgICBpZiAobm9kZSAhPSBudWxsICYmICFBbmNob3JzLnZhbGlkQW5jaG9yTm9kZShub2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuY2hvcnMgbWF5IG9ubHkgYmUgc2V0IGZvciBTY2FsYXIsIFNlcSBhbmQgTWFwIG5vZGVzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lICYmIC9bXFx4MDAtXFx4MTlcXHMsW1xcXXt9XS8udGVzdChuYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuY2hvciBuYW1lcyBtdXN0IG5vdCBjb250YWluIHdoaXRlc3BhY2Ugb3IgY29udHJvbCBjaGFyYWN0ZXJzJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBtYXAgPSB0aGlzLm1hcDtcbiAgICAgIHZhciBwcmV2ID0gbm9kZSAmJiBPYmplY3Qua2V5cyhtYXApLmZpbmQoZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgcmV0dXJuIG1hcFthXSA9PT0gbm9kZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocHJldikge1xuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2ICE9PSBuYW1lKSB7XG4gICAgICAgICAgZGVsZXRlIG1hcFtwcmV2XTtcbiAgICAgICAgICBtYXBbbmFtZV0gPSBub2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBudWxsO1xuICAgICAgICAgIG5hbWUgPSB0aGlzLm5ld05hbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcFtuYW1lXSA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBbmNob3JzO1xufSgpO1xuXG52YXIgdmlzaXQgPSBmdW5jdGlvbiB2aXNpdChub2RlLCB0YWdzKSB7XG4gIGlmIChub2RlICYmIF90eXBlb2Yobm9kZSkgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIHRhZyA9IG5vZGUudGFnO1xuXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7XG4gICAgICBpZiAodGFnKSB0YWdzW3RhZ10gPSB0cnVlO1xuICAgICAgbm9kZS5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiB2aXNpdChuLCB0YWdzKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFBhaXIpIHtcbiAgICAgIHZpc2l0KG5vZGUua2V5LCB0YWdzKTtcbiAgICAgIHZpc2l0KG5vZGUudmFsdWUsIHRhZ3MpO1xuICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFNjYWxhcikge1xuICAgICAgaWYgKHRhZykgdGFnc1t0YWddID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFncztcbn07XG5cbnZhciBsaXN0VGFnTmFtZXMgPSBmdW5jdGlvbiBsaXN0VGFnTmFtZXMobm9kZSkge1xuICByZXR1cm4gT2JqZWN0LmtleXModmlzaXQobm9kZSwge30pKTtcbn07XG5cbmZ1bmN0aW9uIHBhcnNlQ29udGVudHMoZG9jLCBjb250ZW50cykge1xuICB2YXIgY29tbWVudHMgPSB7XG4gICAgYmVmb3JlOiBbXSxcbiAgICBhZnRlcjogW11cbiAgfTtcbiAgdmFyIGJvZHkgPSB1bmRlZmluZWQ7XG4gIHZhciBzcGFjZUJlZm9yZSA9IGZhbHNlO1xuXG4gIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihjb250ZW50cyksXG4gICAgICBfc3RlcDtcblxuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgbm9kZSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICBpZiAobm9kZS52YWx1ZVJhbmdlKSB7XG4gICAgICAgIGlmIChib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YXIgbXNnID0gJ0RvY3VtZW50IGNvbnRhaW5zIHRyYWlsaW5nIGNvbnRlbnQgbm90IHNlcGFyYXRlZCBieSBhIC4uLiBvciAtLS0gbGluZSc7XG4gICAgICAgICAgZG9jLmVycm9ycy5wdXNoKG5ldyBZQU1MU3ludGF4RXJyb3Iobm9kZSwgbXNnKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVzID0gcmVzb2x2ZU5vZGUoZG9jLCBub2RlKTtcblxuICAgICAgICBpZiAoc3BhY2VCZWZvcmUpIHtcbiAgICAgICAgICByZXMuc3BhY2VCZWZvcmUgPSB0cnVlO1xuICAgICAgICAgIHNwYWNlQmVmb3JlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBib2R5ID0gcmVzO1xuICAgICAgfSBlbHNlIGlmIChub2RlLmNvbW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGNjID0gYm9keSA9PT0gdW5kZWZpbmVkID8gY29tbWVudHMuYmVmb3JlIDogY29tbWVudHMuYWZ0ZXI7XG4gICAgICAgIGNjLnB1c2gobm9kZS5jb21tZW50KTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSBUeXBlLkJMQU5LX0xJTkUpIHtcbiAgICAgICAgc3BhY2VCZWZvcmUgPSB0cnVlO1xuXG4gICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQgJiYgY29tbWVudHMuYmVmb3JlLmxlbmd0aCA+IDAgJiYgIWRvYy5jb21tZW50QmVmb3JlKSB7XG4gICAgICAgICAgLy8gc3BhY2Utc2VwYXJhdGVkIGNvbW1lbnRzIGF0IHN0YXJ0IGFyZSBwYXJzZWQgYXMgZG9jdW1lbnQgY29tbWVudHNcbiAgICAgICAgICBkb2MuY29tbWVudEJlZm9yZSA9IGNvbW1lbnRzLmJlZm9yZS5qb2luKCdcXG4nKTtcbiAgICAgICAgICBjb21tZW50cy5iZWZvcmUgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBfaXRlcmF0b3IuZigpO1xuICB9XG5cbiAgZG9jLmNvbnRlbnRzID0gYm9keSB8fCBudWxsO1xuXG4gIGlmICghYm9keSkge1xuICAgIGRvYy5jb21tZW50ID0gY29tbWVudHMuYmVmb3JlLmNvbmNhdChjb21tZW50cy5hZnRlcikuam9pbignXFxuJykgfHwgbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY2IgPSBjb21tZW50cy5iZWZvcmUuam9pbignXFxuJyk7XG5cbiAgICBpZiAoY2IpIHtcbiAgICAgIHZhciBjYk5vZGUgPSBib2R5IGluc3RhbmNlb2YgQ29sbGVjdGlvbiAmJiBib2R5Lml0ZW1zWzBdID8gYm9keS5pdGVtc1swXSA6IGJvZHk7XG4gICAgICBjYk5vZGUuY29tbWVudEJlZm9yZSA9IGNiTm9kZS5jb21tZW50QmVmb3JlID8gXCJcIi5jb25jYXQoY2IsIFwiXFxuXCIpLmNvbmNhdChjYk5vZGUuY29tbWVudEJlZm9yZSkgOiBjYjtcbiAgICB9XG5cbiAgICBkb2MuY29tbWVudCA9IGNvbW1lbnRzLmFmdGVyLmpvaW4oJ1xcbicpIHx8IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRhZ0RpcmVjdGl2ZShfcmVmLCBkaXJlY3RpdmUpIHtcbiAgdmFyIHRhZ1ByZWZpeGVzID0gX3JlZi50YWdQcmVmaXhlcztcblxuICB2YXIgX2RpcmVjdGl2ZSRwYXJhbWV0ZXJzID0gX3NsaWNlZFRvQXJyYXkoZGlyZWN0aXZlLnBhcmFtZXRlcnMsIDIpLFxuICAgICAgaGFuZGxlID0gX2RpcmVjdGl2ZSRwYXJhbWV0ZXJzWzBdLFxuICAgICAgcHJlZml4ID0gX2RpcmVjdGl2ZSRwYXJhbWV0ZXJzWzFdO1xuXG4gIGlmICghaGFuZGxlIHx8ICFwcmVmaXgpIHtcbiAgICB2YXIgbXNnID0gJ0luc3VmZmljaWVudCBwYXJhbWV0ZXJzIGdpdmVuIGZvciAlVEFHIGRpcmVjdGl2ZSc7XG4gICAgdGhyb3cgbmV3IFlBTUxTZW1hbnRpY0Vycm9yKGRpcmVjdGl2ZSwgbXNnKTtcbiAgfVxuXG4gIGlmICh0YWdQcmVmaXhlcy5zb21lKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIHAuaGFuZGxlID09PSBoYW5kbGU7XG4gIH0pKSB7XG4gICAgdmFyIF9tc2cgPSAnVGhlICVUQUcgZGlyZWN0aXZlIG11c3Qgb25seSBiZSBnaXZlbiBhdCBtb3N0IG9uY2UgcGVyIGhhbmRsZSBpbiB0aGUgc2FtZSBkb2N1bWVudC4nO1xuICAgIHRocm93IG5ldyBZQU1MU2VtYW50aWNFcnJvcihkaXJlY3RpdmUsIF9tc2cpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBoYW5kbGU6IGhhbmRsZSxcbiAgICBwcmVmaXg6IHByZWZpeFxuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbERpcmVjdGl2ZShkb2MsIGRpcmVjdGl2ZSkge1xuICB2YXIgX2RpcmVjdGl2ZSRwYXJhbWV0ZXJzMiA9IF9zbGljZWRUb0FycmF5KGRpcmVjdGl2ZS5wYXJhbWV0ZXJzLCAxKSxcbiAgICAgIHZlcnNpb24gPSBfZGlyZWN0aXZlJHBhcmFtZXRlcnMyWzBdO1xuXG4gIGlmIChkaXJlY3RpdmUubmFtZSA9PT0gJ1lBTUw6MS4wJykgdmVyc2lvbiA9ICcxLjAnO1xuXG4gIGlmICghdmVyc2lvbikge1xuICAgIHZhciBtc2cgPSAnSW5zdWZmaWNpZW50IHBhcmFtZXRlcnMgZ2l2ZW4gZm9yICVZQU1MIGRpcmVjdGl2ZSc7XG4gICAgdGhyb3cgbmV3IFlBTUxTZW1hbnRpY0Vycm9yKGRpcmVjdGl2ZSwgbXNnKTtcbiAgfVxuXG4gIGlmICghZG9jdW1lbnRPcHRpb25zW3ZlcnNpb25dKSB7XG4gICAgdmFyIHYwID0gZG9jLnZlcnNpb24gfHwgZG9jLm9wdGlvbnMudmVyc2lvbjtcblxuICAgIHZhciBfbXNnMiA9IFwiRG9jdW1lbnQgd2lsbCBiZSBwYXJzZWQgYXMgWUFNTCBcIi5jb25jYXQodjAsIFwiIHJhdGhlciB0aGFuIFlBTUwgXCIpLmNvbmNhdCh2ZXJzaW9uKTtcblxuICAgIGRvYy53YXJuaW5ncy5wdXNoKG5ldyBZQU1MV2FybmluZyhkaXJlY3RpdmUsIF9tc2cyKSk7XG4gIH1cblxuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuZnVuY3Rpb24gcGFyc2VEaXJlY3RpdmVzKGRvYywgZGlyZWN0aXZlcywgcHJldkRvYykge1xuICB2YXIgZGlyZWN0aXZlQ29tbWVudHMgPSBbXTtcbiAgdmFyIGhhc0RpcmVjdGl2ZXMgPSBmYWxzZTtcblxuICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZGlyZWN0aXZlcyksXG4gICAgICBfc3RlcDtcblxuICB0cnkge1xuICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICB2YXIgZGlyZWN0aXZlID0gX3N0ZXAudmFsdWU7XG4gICAgICB2YXIgY29tbWVudCA9IGRpcmVjdGl2ZS5jb21tZW50LFxuICAgICAgICAgIG5hbWUgPSBkaXJlY3RpdmUubmFtZTtcblxuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIGNhc2UgJ1RBRyc6XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRvYy50YWdQcmVmaXhlcy5wdXNoKHJlc29sdmVUYWdEaXJlY3RpdmUoZG9jLCBkaXJlY3RpdmUpKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgZG9jLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdZQU1MJzpcbiAgICAgICAgY2FzZSAnWUFNTDoxLjAnOlxuICAgICAgICAgIGlmIChkb2MudmVyc2lvbikge1xuICAgICAgICAgICAgdmFyIG1zZyA9ICdUaGUgJVlBTUwgZGlyZWN0aXZlIG11c3Qgb25seSBiZSBnaXZlbiBhdCBtb3N0IG9uY2UgcGVyIGRvY3VtZW50Lic7XG4gICAgICAgICAgICBkb2MuZXJyb3JzLnB1c2gobmV3IFlBTUxTZW1hbnRpY0Vycm9yKGRpcmVjdGl2ZSwgbXNnKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRvYy52ZXJzaW9uID0gcmVzb2x2ZVlhbWxEaXJlY3RpdmUoZG9jLCBkaXJlY3RpdmUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBkb2MuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIHZhciBfbXNnMyA9IFwiWUFNTCBvbmx5IHN1cHBvcnRzICVUQUcgYW5kICVZQU1MIGRpcmVjdGl2ZXMsIGFuZCBub3QgJVwiLmNvbmNhdChuYW1lKTtcblxuICAgICAgICAgICAgZG9jLndhcm5pbmdzLnB1c2gobmV3IFlBTUxXYXJuaW5nKGRpcmVjdGl2ZSwgX21zZzMpKTtcbiAgICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbW1lbnQpIGRpcmVjdGl2ZUNvbW1lbnRzLnB1c2goY29tbWVudCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfaXRlcmF0b3IuZShlcnIpO1xuICB9IGZpbmFsbHkge1xuICAgIF9pdGVyYXRvci5mKCk7XG4gIH1cblxuICBpZiAocHJldkRvYyAmJiAhaGFzRGlyZWN0aXZlcyAmJiAnMS4xJyA9PT0gKGRvYy52ZXJzaW9uIHx8IHByZXZEb2MudmVyc2lvbiB8fCBkb2Mub3B0aW9ucy52ZXJzaW9uKSkge1xuICAgIHZhciBjb3B5VGFnUHJlZml4ID0gZnVuY3Rpb24gY29weVRhZ1ByZWZpeChfcmVmMikge1xuICAgICAgdmFyIGhhbmRsZSA9IF9yZWYyLmhhbmRsZSxcbiAgICAgICAgICBwcmVmaXggPSBfcmVmMi5wcmVmaXg7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoYW5kbGU6IGhhbmRsZSxcbiAgICAgICAgcHJlZml4OiBwcmVmaXhcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGRvYy50YWdQcmVmaXhlcyA9IHByZXZEb2MudGFnUHJlZml4ZXMubWFwKGNvcHlUYWdQcmVmaXgpO1xuICAgIGRvYy52ZXJzaW9uID0gcHJldkRvYy52ZXJzaW9uO1xuICB9XG5cbiAgZG9jLmNvbW1lbnRCZWZvcmUgPSBkaXJlY3RpdmVDb21tZW50cy5qb2luKCdcXG4nKSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRDb2xsZWN0aW9uKGNvbnRlbnRzKSB7XG4gIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHJldHVybiB0cnVlO1xuICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgWUFNTCBjb2xsZWN0aW9uIGFzIGRvY3VtZW50IGNvbnRlbnRzJyk7XG59XG5cbnZhciBEb2N1bWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIERvY3VtZW50KG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRG9jdW1lbnQpO1xuXG4gICAgdGhpcy5hbmNob3JzID0gbmV3IEFuY2hvcnMob3B0aW9ucy5hbmNob3JQcmVmaXgpO1xuICAgIHRoaXMuY29tbWVudEJlZm9yZSA9IG51bGw7XG4gICAgdGhpcy5jb21tZW50ID0gbnVsbDtcbiAgICB0aGlzLmNvbnRlbnRzID0gbnVsbDtcbiAgICB0aGlzLmRpcmVjdGl2ZXNFbmRNYXJrZXIgPSBudWxsO1xuICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnNjaGVtYSA9IG51bGw7XG4gICAgdGhpcy50YWdQcmVmaXhlcyA9IFtdO1xuICAgIHRoaXMudmVyc2lvbiA9IG51bGw7XG4gICAgdGhpcy53YXJuaW5ncyA9IFtdO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKERvY3VtZW50LCBbe1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgICBhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpO1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudHMuYWRkKHZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkSW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkSW4ocGF0aCwgdmFsdWUpIHtcbiAgICAgIGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cyk7XG4gICAgICB0aGlzLmNvbnRlbnRzLmFkZEluKHBhdGgsIHZhbHVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGVsZXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9kZWxldGUoa2V5KSB7XG4gICAgICBhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpO1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudHMuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlbGV0ZUluXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlbGV0ZUluKHBhdGgpIHtcbiAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSkge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRoaXMuY29udGVudHMgPSBudWxsO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKTtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzLmRlbGV0ZUluKHBhdGgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREZWZhdWx0c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWZhdWx0cygpIHtcbiAgICAgIHJldHVybiBEb2N1bWVudC5kZWZhdWx0c1t0aGlzLnZlcnNpb25dIHx8IERvY3VtZW50LmRlZmF1bHRzW3RoaXMub3B0aW9ucy52ZXJzaW9uXSB8fCB7fTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzIGluc3RhbmNlb2YgQ29sbGVjdGlvbiA/IHRoaXMuY29udGVudHMuZ2V0KGtleSwga2VlcFNjYWxhcikgOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEluXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEluKHBhdGgsIGtlZXBTY2FsYXIpIHtcbiAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSkgcmV0dXJuICFrZWVwU2NhbGFyICYmIHRoaXMuY29udGVudHMgaW5zdGFuY2VvZiBTY2FsYXIgPyB0aGlzLmNvbnRlbnRzLnZhbHVlIDogdGhpcy5jb250ZW50cztcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzIGluc3RhbmNlb2YgQ29sbGVjdGlvbiA/IHRoaXMuY29udGVudHMuZ2V0SW4ocGF0aCwga2VlcFNjYWxhcikgOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250ZW50cyBpbnN0YW5jZW9mIENvbGxlY3Rpb24gPyB0aGlzLmNvbnRlbnRzLmhhcyhrZXkpIDogZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc0luXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0luKHBhdGgpIHtcbiAgICAgIGlmIChpc0VtcHR5UGF0aChwYXRoKSkgcmV0dXJuIHRoaXMuY29udGVudHMgIT09IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRzIGluc3RhbmNlb2YgQ29sbGVjdGlvbiA/IHRoaXMuY29udGVudHMuaGFzSW4ocGF0aCkgOiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgICBhc3NlcnRDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpO1xuICAgICAgdGhpcy5jb250ZW50cy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldEluXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEluKHBhdGgsIHZhbHVlKSB7XG4gICAgICBpZiAoaXNFbXB0eVBhdGgocGF0aCkpIHRoaXMuY29udGVudHMgPSB2YWx1ZTtlbHNlIHtcbiAgICAgICAgYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKTtcbiAgICAgICAgdGhpcy5jb250ZW50cy5zZXRJbihwYXRoLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFNjaGVtYVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTY2hlbWEoaWQsIGN1c3RvbVRhZ3MpIHtcbiAgICAgIGlmICghaWQgJiYgIWN1c3RvbVRhZ3MgJiYgdGhpcy5zY2hlbWEpIHJldHVybjtcbiAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdudW1iZXInKSBpZCA9IGlkLnRvRml4ZWQoMSk7XG5cbiAgICAgIGlmIChpZCA9PT0gJzEuMCcgfHwgaWQgPT09ICcxLjEnIHx8IGlkID09PSAnMS4yJykge1xuICAgICAgICBpZiAodGhpcy52ZXJzaW9uKSB0aGlzLnZlcnNpb24gPSBpZDtlbHNlIHRoaXMub3B0aW9ucy52ZXJzaW9uID0gaWQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnMuc2NoZW1hO1xuICAgICAgfSBlbHNlIGlmIChpZCAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zY2hlbWEgPSBpZDtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VzdG9tVGFncykpIHRoaXMub3B0aW9ucy5jdXN0b21UYWdzID0gY3VzdG9tVGFncztcbiAgICAgIHZhciBvcHQgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmdldERlZmF1bHRzKCksIHRoaXMub3B0aW9ucyk7XG4gICAgICB0aGlzLnNjaGVtYSA9IG5ldyBTY2hlbWEob3B0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFyc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGFyc2Uobm9kZSwgcHJldkRvYykge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5rZWVwQ3N0Tm9kZXMpIHRoaXMuY3N0Tm9kZSA9IG5vZGU7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmtlZXBOb2RlVHlwZXMpIHRoaXMudHlwZSA9ICdET0NVTUVOVCc7XG4gICAgICB2YXIgX25vZGUkZGlyZWN0aXZlcyA9IG5vZGUuZGlyZWN0aXZlcyxcbiAgICAgICAgICBkaXJlY3RpdmVzID0gX25vZGUkZGlyZWN0aXZlcyA9PT0gdm9pZCAwID8gW10gOiBfbm9kZSRkaXJlY3RpdmVzLFxuICAgICAgICAgIF9ub2RlJGNvbnRlbnRzID0gbm9kZS5jb250ZW50cyxcbiAgICAgICAgICBjb250ZW50cyA9IF9ub2RlJGNvbnRlbnRzID09PSB2b2lkIDAgPyBbXSA6IF9ub2RlJGNvbnRlbnRzLFxuICAgICAgICAgIGRpcmVjdGl2ZXNFbmRNYXJrZXIgPSBub2RlLmRpcmVjdGl2ZXNFbmRNYXJrZXIsXG4gICAgICAgICAgZXJyb3IgPSBub2RlLmVycm9yLFxuICAgICAgICAgIHZhbHVlUmFuZ2UgPSBub2RlLnZhbHVlUmFuZ2U7XG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBpZiAoIWVycm9yLnNvdXJjZSkgZXJyb3Iuc291cmNlID0gdGhpcztcbiAgICAgICAgdGhpcy5lcnJvcnMucHVzaChlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHBhcnNlRGlyZWN0aXZlcyh0aGlzLCBkaXJlY3RpdmVzLCBwcmV2RG9jKTtcbiAgICAgIGlmIChkaXJlY3RpdmVzRW5kTWFya2VyKSB0aGlzLmRpcmVjdGl2ZXNFbmRNYXJrZXIgPSB0cnVlO1xuICAgICAgdGhpcy5yYW5nZSA9IHZhbHVlUmFuZ2UgPyBbdmFsdWVSYW5nZS5zdGFydCwgdmFsdWVSYW5nZS5lbmRdIDogbnVsbDtcbiAgICAgIHRoaXMuc2V0U2NoZW1hKCk7XG4gICAgICB0aGlzLmFuY2hvcnMuX2NzdEFsaWFzZXMgPSBbXTtcbiAgICAgIHBhcnNlQ29udGVudHModGhpcywgY29udGVudHMpO1xuICAgICAgdGhpcy5hbmNob3JzLnJlc29sdmVOb2RlcygpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnByZXR0eUVycm9ycykge1xuICAgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5lcnJvcnMpLFxuICAgICAgICAgICAgX3N0ZXA7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIF9lcnJvciA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgICAgaWYgKF9lcnJvciBpbnN0YW5jZW9mIFlBTUxFcnJvcikgX2Vycm9yLm1ha2VQcmV0dHkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgX2l0ZXJhdG9yLmYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy53YXJuaW5ncyksXG4gICAgICAgICAgICBfc3RlcDI7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIHdhcm4gPSBfc3RlcDIudmFsdWU7XG4gICAgICAgICAgICBpZiAod2FybiBpbnN0YW5jZW9mIFlBTUxFcnJvcikgd2Fybi5tYWtlUHJldHR5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBfaXRlcmF0b3IyLmUoZXJyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBfaXRlcmF0b3IyLmYoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibGlzdE5vbkRlZmF1bHRUYWdzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxpc3ROb25EZWZhdWx0VGFncygpIHtcbiAgICAgIHJldHVybiBsaXN0VGFnTmFtZXModGhpcy5jb250ZW50cykuZmlsdGVyKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIHJldHVybiB0LmluZGV4T2YoU2NoZW1hLmRlZmF1bHRQcmVmaXgpICE9PSAwO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFRhZ1ByZWZpeFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUYWdQcmVmaXgoaGFuZGxlLCBwcmVmaXgpIHtcbiAgICAgIGlmIChoYW5kbGVbMF0gIT09ICchJyB8fCBoYW5kbGVbaGFuZGxlLmxlbmd0aCAtIDFdICE9PSAnIScpIHRocm93IG5ldyBFcnJvcignSGFuZGxlIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoICEnKTtcblxuICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICB2YXIgcHJldiA9IHRoaXMudGFnUHJlZml4ZXMuZmluZChmdW5jdGlvbiAocCkge1xuICAgICAgICAgIHJldHVybiBwLmhhbmRsZSA9PT0gaGFuZGxlO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHByZXYpIHByZXYucHJlZml4ID0gcHJlZml4O2Vsc2UgdGhpcy50YWdQcmVmaXhlcy5wdXNoKHtcbiAgICAgICAgICBoYW5kbGU6IGhhbmRsZSxcbiAgICAgICAgICBwcmVmaXg6IHByZWZpeFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGFnUHJlZml4ZXMgPSB0aGlzLnRhZ1ByZWZpeGVzLmZpbHRlcihmdW5jdGlvbiAocCkge1xuICAgICAgICAgIHJldHVybiBwLmhhbmRsZSAhPT0gaGFuZGxlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidG9KU09OXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvSlNPTiQxKGFyZywgb25BbmNob3IpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGtlZXBCbG9ic0luSlNPTiA9IF90aGlzJG9wdGlvbnMua2VlcEJsb2JzSW5KU09OLFxuICAgICAgICAgIG1hcEFzTWFwID0gX3RoaXMkb3B0aW9ucy5tYXBBc01hcCxcbiAgICAgICAgICBtYXhBbGlhc0NvdW50ID0gX3RoaXMkb3B0aW9ucy5tYXhBbGlhc0NvdW50O1xuICAgICAgdmFyIGtlZXAgPSBrZWVwQmxvYnNJbkpTT04gJiYgKHR5cGVvZiBhcmcgIT09ICdzdHJpbmcnIHx8ICEodGhpcy5jb250ZW50cyBpbnN0YW5jZW9mIFNjYWxhcikpO1xuICAgICAgdmFyIGN0eCA9IHtcbiAgICAgICAgZG9jOiB0aGlzLFxuICAgICAgICBpbmRlbnRTdGVwOiAnICAnLFxuICAgICAgICBrZWVwOiBrZWVwLFxuICAgICAgICBtYXBBc01hcDoga2VlcCAmJiAhIW1hcEFzTWFwLFxuICAgICAgICBtYXhBbGlhc0NvdW50OiBtYXhBbGlhc0NvdW50LFxuICAgICAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeSAvLyBSZXF1aXJpbmcgZGlyZWN0bHkgaW4gUGFpciB3b3VsZCBjcmVhdGUgY2lyY3VsYXIgZGVwZW5kZW5jaWVzXG5cbiAgICAgIH07XG4gICAgICB2YXIgYW5jaG9yTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmFuY2hvcnMubWFwKTtcbiAgICAgIGlmIChhbmNob3JOYW1lcy5sZW5ndGggPiAwKSBjdHguYW5jaG9ycyA9IG5ldyBNYXAoYW5jaG9yTmFtZXMubWFwKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiBbX3RoaXMuYW5jaG9ycy5tYXBbbmFtZV0sIHtcbiAgICAgICAgICBhbGlhczogW10sXG4gICAgICAgICAgYWxpYXNDb3VudDogMCxcbiAgICAgICAgICBjb3VudDogMVxuICAgICAgICB9XTtcbiAgICAgIH0pKTtcblxuICAgICAgdmFyIHJlcyA9IHRvSlNPTih0aGlzLmNvbnRlbnRzLCBhcmcsIGN0eCk7XG5cbiAgICAgIGlmICh0eXBlb2Ygb25BbmNob3IgPT09ICdmdW5jdGlvbicgJiYgY3R4LmFuY2hvcnMpIHtcbiAgICAgICAgdmFyIF9pdGVyYXRvcjMgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihjdHguYW5jaG9ycy52YWx1ZXMoKSksXG4gICAgICAgICAgICBfc3RlcDM7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKF9pdGVyYXRvcjMucygpOyAhKF9zdGVwMyA9IF9pdGVyYXRvcjMubigpKS5kb25lOykge1xuICAgICAgICAgICAgdmFyIF9zdGVwMyR2YWx1ZSA9IF9zdGVwMy52YWx1ZSxcbiAgICAgICAgICAgICAgICBjb3VudCA9IF9zdGVwMyR2YWx1ZS5jb3VudCxcbiAgICAgICAgICAgICAgICBfcmVzID0gX3N0ZXAzJHZhbHVlLnJlcztcbiAgICAgICAgICAgIG9uQW5jaG9yKF9yZXMsIGNvdW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIF9pdGVyYXRvcjMuZShlcnIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIF9pdGVyYXRvcjMuZigpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInRvU3RyaW5nXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgaWYgKHRoaXMuZXJyb3JzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcignRG9jdW1lbnQgd2l0aCBlcnJvcnMgY2Fubm90IGJlIHN0cmluZ2lmaWVkJyk7XG4gICAgICB2YXIgaW5kZW50U2l6ZSA9IHRoaXMub3B0aW9ucy5pbmRlbnQ7XG5cbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpbmRlbnRTaXplKSB8fCBpbmRlbnRTaXplIDw9IDApIHtcbiAgICAgICAgdmFyIHMgPSBKU09OLnN0cmluZ2lmeShpbmRlbnRTaXplKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXFxcImluZGVudFxcXCIgb3B0aW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBub3QgXCIuY29uY2F0KHMpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTY2hlbWEoKTtcbiAgICAgIHZhciBsaW5lcyA9IFtdO1xuICAgICAgdmFyIGhhc0RpcmVjdGl2ZXMgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMudmVyc2lvbikge1xuICAgICAgICB2YXIgdmQgPSAnJVlBTUwgMS4yJztcblxuICAgICAgICBpZiAodGhpcy5zY2hlbWEubmFtZSA9PT0gJ3lhbWwtMS4xJykge1xuICAgICAgICAgIGlmICh0aGlzLnZlcnNpb24gPT09ICcxLjAnKSB2ZCA9ICclWUFNTDoxLjAnO2Vsc2UgaWYgKHRoaXMudmVyc2lvbiA9PT0gJzEuMScpIHZkID0gJyVZQU1MIDEuMSc7XG4gICAgICAgIH1cblxuICAgICAgICBsaW5lcy5wdXNoKHZkKTtcbiAgICAgICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciB0YWdOYW1lcyA9IHRoaXMubGlzdE5vbkRlZmF1bHRUYWdzKCk7XG4gICAgICB0aGlzLnRhZ1ByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIGhhbmRsZSA9IF9yZWYuaGFuZGxlLFxuICAgICAgICAgICAgcHJlZml4ID0gX3JlZi5wcmVmaXg7XG5cbiAgICAgICAgaWYgKHRhZ05hbWVzLnNvbWUoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICByZXR1cm4gdC5pbmRleE9mKHByZWZpeCkgPT09IDA7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgbGluZXMucHVzaChcIiVUQUcgXCIuY29uY2F0KGhhbmRsZSwgXCIgXCIpLmNvbmNhdChwcmVmaXgpKTtcbiAgICAgICAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoaGFzRGlyZWN0aXZlcyB8fCB0aGlzLmRpcmVjdGl2ZXNFbmRNYXJrZXIpIGxpbmVzLnB1c2goJy0tLScpO1xuXG4gICAgICBpZiAodGhpcy5jb21tZW50QmVmb3JlKSB7XG4gICAgICAgIGlmIChoYXNEaXJlY3RpdmVzIHx8ICF0aGlzLmRpcmVjdGl2ZXNFbmRNYXJrZXIpIGxpbmVzLnVuc2hpZnQoJycpO1xuICAgICAgICBsaW5lcy51bnNoaWZ0KHRoaXMuY29tbWVudEJlZm9yZS5yZXBsYWNlKC9eL2dtLCAnIycpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGN0eCA9IHtcbiAgICAgICAgYW5jaG9yczoge30sXG4gICAgICAgIGRvYzogdGhpcyxcbiAgICAgICAgaW5kZW50OiAnJyxcbiAgICAgICAgaW5kZW50U3RlcDogJyAnLnJlcGVhdChpbmRlbnRTaXplKSxcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnkgLy8gUmVxdWlyaW5nIGRpcmVjdGx5IGluIG5vZGVzIHdvdWxkIGNyZWF0ZSBjaXJjdWxhciBkZXBlbmRlbmNpZXNcblxuICAgICAgfTtcbiAgICAgIHZhciBjaG9tcEtlZXAgPSBmYWxzZTtcbiAgICAgIHZhciBjb250ZW50Q29tbWVudCA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLmNvbnRlbnRzKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRzIGluc3RhbmNlb2YgTm9kZSkge1xuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRzLnNwYWNlQmVmb3JlICYmIChoYXNEaXJlY3RpdmVzIHx8IHRoaXMuZGlyZWN0aXZlc0VuZE1hcmtlcikpIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRzLmNvbW1lbnRCZWZvcmUpIGxpbmVzLnB1c2godGhpcy5jb250ZW50cy5jb21tZW50QmVmb3JlLnJlcGxhY2UoL14vZ20sICcjJykpOyAvLyB0b3AtbGV2ZWwgYmxvY2sgc2NhbGFycyBuZWVkIHRvIGJlIGluZGVudGVkIGlmIGZvbGxvd2VkIGJ5IGEgY29tbWVudFxuXG4gICAgICAgICAgY3R4LmZvcmNlQmxvY2tJbmRlbnQgPSAhIXRoaXMuY29tbWVudDtcbiAgICAgICAgICBjb250ZW50Q29tbWVudCA9IHRoaXMuY29udGVudHMuY29tbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvbkNob21wS2VlcCA9IGNvbnRlbnRDb21tZW50ID8gbnVsbCA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY2hvbXBLZWVwID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGJvZHkgPSBzdHJpbmdpZnkodGhpcy5jb250ZW50cywgY3R4LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRlbnRDb21tZW50ID0gbnVsbDtcbiAgICAgICAgfSwgb25DaG9tcEtlZXApO1xuICAgICAgICBsaW5lcy5wdXNoKGFkZENvbW1lbnQoYm9keSwgJycsIGNvbnRlbnRDb21tZW50KSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsaW5lcy5wdXNoKHN0cmluZ2lmeSh0aGlzLmNvbnRlbnRzLCBjdHgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29tbWVudCkge1xuICAgICAgICBpZiAoKCFjaG9tcEtlZXAgfHwgY29udGVudENvbW1lbnQpICYmIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdICE9PSAnJykgbGluZXMucHVzaCgnJyk7XG4gICAgICAgIGxpbmVzLnB1c2godGhpcy5jb21tZW50LnJlcGxhY2UoL14vZ20sICcjJykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGluZXMuam9pbignXFxuJykgKyAnXFxuJztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRG9jdW1lbnQ7XG59KCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShEb2N1bWVudCwgXCJkZWZhdWx0c1wiLCBkb2N1bWVudE9wdGlvbnMpO1xuXG5mdW5jdGlvbiBjcmVhdGVOb2RlKHZhbHVlKSB7XG4gIHZhciB3cmFwU2NhbGFycyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgdmFyIHRhZyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkO1xuXG4gIGlmICh0YWcgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygd3JhcFNjYWxhcnMgPT09ICdzdHJpbmcnKSB7XG4gICAgdGFnID0gd3JhcFNjYWxhcnM7XG4gICAgd3JhcFNjYWxhcnMgPSB0cnVlO1xuICB9XG5cbiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBEb2N1bWVudC5kZWZhdWx0c1tkZWZhdWx0T3B0aW9ucy52ZXJzaW9uXSwgZGVmYXVsdE9wdGlvbnMpO1xuICB2YXIgc2NoZW1hID0gbmV3IFNjaGVtYShvcHRpb25zKTtcbiAgcmV0dXJuIHNjaGVtYS5jcmVhdGVOb2RlKHZhbHVlLCB3cmFwU2NhbGFycywgdGFnKTtcbn1cblxudmFyIERvY3VtZW50JDEgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9ZQU1MRG9jdW1lbnQpIHtcbiAgX2luaGVyaXRzKERvY3VtZW50LCBfWUFNTERvY3VtZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKERvY3VtZW50KTtcblxuICBmdW5jdGlvbiBEb2N1bWVudChvcHRpb25zKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERvY3VtZW50KTtcblxuICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucykpO1xuICB9XG5cbiAgcmV0dXJuIERvY3VtZW50O1xufShEb2N1bWVudCk7XG5cbmZ1bmN0aW9uIHBhcnNlQWxsRG9jdW1lbnRzKHNyYywgb3B0aW9ucykge1xuICB2YXIgc3RyZWFtID0gW107XG4gIHZhciBwcmV2O1xuXG4gIHZhciBfaXRlcmF0b3IgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihwYXJzZSQxKHNyYykpLFxuICAgICAgX3N0ZXA7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgdmFyIGNzdERvYyA9IF9zdGVwLnZhbHVlO1xuICAgICAgdmFyIGRvYyA9IG5ldyBEb2N1bWVudCQxKG9wdGlvbnMpO1xuICAgICAgZG9jLnBhcnNlKGNzdERvYywgcHJldik7XG4gICAgICBzdHJlYW0ucHVzaChkb2MpO1xuICAgICAgcHJldiA9IGRvYztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9pdGVyYXRvci5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yLmYoKTtcbiAgfVxuXG4gIHJldHVybiBzdHJlYW07XG59XG5cbmZ1bmN0aW9uIHBhcnNlRG9jdW1lbnQoc3JjLCBvcHRpb25zKSB7XG4gIHZhciBjc3QgPSBwYXJzZSQxKHNyYyk7XG4gIHZhciBkb2MgPSBuZXcgRG9jdW1lbnQkMShvcHRpb25zKS5wYXJzZShjc3RbMF0pO1xuXG4gIGlmIChjc3QubGVuZ3RoID4gMSkge1xuICAgIHZhciBlcnJNc2cgPSAnU291cmNlIGNvbnRhaW5zIG11bHRpcGxlIGRvY3VtZW50czsgcGxlYXNlIHVzZSBZQU1MLnBhcnNlQWxsRG9jdW1lbnRzKCknO1xuICAgIGRvYy5lcnJvcnMudW5zaGlmdChuZXcgWUFNTFNlbWFudGljRXJyb3IoY3N0WzFdLCBlcnJNc2cpKTtcbiAgfVxuXG4gIHJldHVybiBkb2M7XG59XG5cbmZ1bmN0aW9uIHBhcnNlKHNyYywgb3B0aW9ucykge1xuICB2YXIgZG9jID0gcGFyc2VEb2N1bWVudChzcmMsIG9wdGlvbnMpO1xuICBkb2Mud2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAod2FybmluZykge1xuICAgIHJldHVybiB3YXJuKHdhcm5pbmcpO1xuICB9KTtcbiAgaWYgKGRvYy5lcnJvcnMubGVuZ3RoID4gMCkgdGhyb3cgZG9jLmVycm9yc1swXTtcbiAgcmV0dXJuIGRvYy50b0pTT04oKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5JDEodmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIGRvYyA9IG5ldyBEb2N1bWVudCQxKG9wdGlvbnMpO1xuICBkb2MuY29udGVudHMgPSB2YWx1ZTtcbiAgcmV0dXJuIFN0cmluZyhkb2MpO1xufVxuXG52YXIgWUFNTCA9IHtcbiAgY3JlYXRlTm9kZTogY3JlYXRlTm9kZSxcbiAgZGVmYXVsdE9wdGlvbnM6IGRlZmF1bHRPcHRpb25zLFxuICBEb2N1bWVudDogRG9jdW1lbnQkMSxcbiAgcGFyc2U6IHBhcnNlLFxuICBwYXJzZUFsbERvY3VtZW50czogcGFyc2VBbGxEb2N1bWVudHMsXG4gIHBhcnNlQ1NUOiBwYXJzZSQxLFxuICBwYXJzZURvY3VtZW50OiBwYXJzZURvY3VtZW50LFxuICBzY2FsYXJPcHRpb25zOiBzY2FsYXJPcHRpb25zLFxuICBzdHJpbmdpZnk6IHN0cmluZ2lmeSQxXG59O1xuXG5leHBvcnQgeyBZQU1MIH07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGlzdCcpLllBTUxcbiIsIlxuaW1wb3J0IHsgQXBwLCBNYXJrZG93blZpZXcsIE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHR9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgRm9sZGVyQnJpZWYgfSBmcm9tICcuL2ZvbGRlci1icmllZic7XG5pbXBvcnQgeyBGb2xkZXJOb3RlIH0gZnJvbSAnLi9mb2xkZXItbm90ZSc7XG5pbXBvcnQgeyBDYXJkQmxvY2sgfSBmcm9tICcuL2NhcmQtaXRlbSc7XG5pbXBvcnQgKiBhcyBZYW1sIGZyb20gJ3lhbWwnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIGNjYXJkcyBwcm9jZXNzb3Jcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY2xhc3MgY2NhcmRQcm9jZXNzb3Ige1xuICAgIGFwcDogQXBwO1xuXG4gICAgY29uc3RydWN0b3IoYXBwOiBBcHApIHtcbiAgICAgICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgfVxuICAgIFxuICAgIGFzeW5jIHJ1bihzb3VyY2U6IHN0cmluZywgZWw6IEhUTUxFbGVtZW50LCBjdHg6IE1hcmtkb3duUG9zdFByb2Nlc3NvckNvbnRleHQsIGZvbGRlck5vdGU6IEZvbGRlck5vdGUpIHtcbiAgICAgICAgLy8gQ2hhbmdlIGNhcmRzIGNvZGUgdG8gaHRtbCBlbGVtZW50XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB5YW1sID0gWWFtbC5wYXJzZShzb3VyY2UpO1xuICAgICAgICAgICAgaWYgKCF5YW1sKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIHNldCBkZWZhdWx0XG4gICAgICAgICAgICBpZiAoeWFtbC50eXBlID09PSB1bmRlZmluZWQpIHlhbWwudHlwZSA9ICdzdGF0aWMnO1xuICAgICAgICAgICAgaWYgKHlhbWwuc3R5bGUgPT09IHVuZGVmaW5lZCkgeWFtbC5zdHlsZSA9ICdjYXJkJztcblxuICAgICAgICAgICAgLy8gZm9yIGRpZmZlcmVudCB0eXBlc1xuICAgICAgICAgICAgaWYgKHlhbWwudHlwZSA9PSAnc3RhdGljJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvY0VsID0gYXdhaXQgdGhpcy5kb2NFbGVtU3RhdGljKHlhbWwpO1xuICAgICAgICAgICAgICAgIGlmIChkb2NFbCkge1xuICAgICAgICAgICAgICAgICAgICBlbC5hcHBlbmRDaGlsZChkb2NFbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoeWFtbC50eXBlID09ICdmb2xkZXJfYnJpZWZfbGl2ZScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb2NFbCA9IGF3YWl0IHRoaXMuZG9jRWxlbUZvbGRlckJyaWVmTGl2ZSh5YW1sLCBmb2xkZXJOb3RlKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9jRWwpIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoZG9jRWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb2RlIEJsb2NrOiBjY2FyZCcsIGVycm9yKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gc3RhdGljXG4gICAgYXN5bmMgZG9jRWxlbVN0YXRpYyh5YW1sOiBhbnkpIHtcbiAgICAgICAgaWYgKHlhbWwuaXRlbXMgJiYgKHlhbWwuaXRlbXMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICAgIGxldCBjYXJkQmxvY2sgPSBuZXcgQ2FyZEJsb2NrKCk7XG4gICAgICAgICAgICBjYXJkQmxvY2suZnJvbVlhbWxDYXJkcyh5YW1sKTtcbiAgICAgICAgICAgIGNvbnN0IGNhcmRzRWxlbSA9IGNhcmRCbG9jay5nZXREb2NFbGVtZW50KHRoaXMuYXBwKTtcbiAgICAgICAgICAgIHJldHVybiBjYXJkc0VsZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gZm9sZGVyX2JyaWVmX2xpdmVcbiAgICBhc3luYyBkb2NFbGVtRm9sZGVyQnJpZWZMaXZlKHlhbWw6IGFueSwgZm9sZGVyTm90ZTogRm9sZGVyTm90ZSkge1xuICAgICAgICB2YXIgZm9sZGVyUGF0aCA9ICcnO1xuICAgICAgICBjb25zdCBhY3RpdmVGaWxlID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKTtcbiAgICAgICAgdmFyIG5vdGVQYXRoID0gYWN0aXZlRmlsZS5wYXRoO1xuICAgICAgICBpZiAoeWFtbC5mb2xkZXIpIHtcbiAgICAgICAgICAgIGxldCBmb2xkZXJFeGlzdCA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHlhbWwuZm9sZGVyKTtcbiAgICAgICAgICAgIGlmIChmb2xkZXJFeGlzdCkgZm9sZGVyUGF0aCA9IHlhbWwuZm9sZGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9sZGVyUGF0aCA9IGF3YWl0IGZvbGRlck5vdGUuZ2V0Tm90ZUZvbGRlckJyaWVmUGF0aChub3RlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChmb2xkZXJQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgICAgICAgICAgaWYgKHZpZXcpIHtcbiAgICAgICAgICAgICAgICBsZXQgZm9sZGVyQnJpZWYgPSBuZXcgRm9sZGVyQnJpZWYodGhpcy5hcHApO1xuXG4gICAgICAgICAgICAgICAgLy8gYnJpZWYgb3B0aW9uc1xuICAgICAgICAgICAgICAgIGlmICh5YW1sLmJyaWVmTWF4KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvbGRlckJyaWVmLmJyaWVmTWF4ID0geWFtbC5icmllZk1heDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHlhbWwubm90ZU9ubHkgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvbGRlckJyaWVmLm5vdGVPbmx5ID0geWFtbC5ub3RlT25seTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjYXJkcyBvcHRpb25zXG4gICAgICAgICAgICAgICAgbGV0IGJyaWVmQ2FyZHMgPSBhd2FpdCBmb2xkZXJCcmllZi5tYWtlQnJpZWZDYXJkcyhmb2xkZXJQYXRoLCBub3RlUGF0aCk7XG4gICAgICAgICAgICAgICAgYnJpZWZDYXJkcy5mcm9tWWFtbE9wdGlvbnMoeWFtbCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgZWxcbiAgICAgICAgICAgICAgICBjb25zdCBjY2FyZEVsZW0gPSBicmllZkNhcmRzLmdldERvY0VsZW1lbnQodGhpcy5hcHApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjY2FyZEVsZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuIiwiaW1wb3J0IHtcbiAgICBBcHAsXG4gICAgUGx1Z2luU2V0dGluZ1RhYixcbiAgICBTZXR0aW5nLFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCBGb2xkZXJOb3RlUGx1Z2luIGZyb20gJy4vbWFpbic7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2V0dGluZ3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvbGRlck5vdGVQbHVnaW5TZXR0aW5ncyB7XG4gICAgZm9sZGVyTm90ZUhpZGU6IGJvb2xlYW47XG4gICAgZm9sZGVyTm90ZVR5cGU6IHN0cmluZztcbiAgICBmb2xkZXJOb3RlTmFtZTogc3RyaW5nO1xuICAgIGZvbGRlck5vdGVLZXk6IHN0cmluZztcbiAgICBmb2xkZXJOb3RlQXV0b1JlbmFtZTogYm9vbGVhbjtcbiAgICBmb2xkZXJEZWxldGUyTm90ZTogYm9vbGVhbjtcbiAgICBmb2xkZXJOb3RlU3RySW5pdDogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgRk9MREVSX05PVEVfREVGQVVMVF9TRVRUSU5HUzogRm9sZGVyTm90ZVBsdWdpblNldHRpbmdzID0ge1xuICAgIGZvbGRlck5vdGVIaWRlOiB0cnVlLFxuICAgIGZvbGRlck5vdGVUeXBlOiAnaW5zaWRlJyxcbiAgICBmb2xkZXJOb3RlTmFtZTogJ19hYm91dF8nLFxuICAgIGZvbGRlck5vdGVLZXk6ICdjdHJsJyxcbiAgICBmb2xkZXJOb3RlQXV0b1JlbmFtZTogdHJ1ZSxcbiAgICBmb2xkZXJEZWxldGUyTm90ZTogZmFsc2UsXG4gICAgZm9sZGVyTm90ZVN0ckluaXQ6ICcjIHt7Rk9MREVSX05BTUV9fSBPdmVydmlld1xcbiB7e0ZPTERFUl9CUklFRl9MSVZFfX0gXFxuJ1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNldHRpbmdzIFRhYlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjbGFzcyBGb2xkZXJOb3RlU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICAgIHBsdWdpbjogRm9sZGVyTm90ZVBsdWdpbjtcblxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IEZvbGRlck5vdGVQbHVnaW4pIHtcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xuICAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjtcbiAgICB9XG5cbiAgICBkaXNwbGF5KCk6IHZvaWQge1xuICAgICAgICBsZXQgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuICAgICAgICBjb250YWluZXJFbC5lbXB0eSgpO1xuICAgICAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdGb2xkZXIgTm90ZSBQbHVnaW46IFNldHRpbmdzLicgfSk7XG5cbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnTm90ZSBGaWxlIE1ldGhvZCcpXG4gICAgICAgICAgICAuc2V0RGVzYygnU2VsZWN0IHRoZSBtZXRob2QgdG8gcHV0IHlvdXIgZm9sZGVyIG5vdGUgZmlsZS4gKFJlYWQgZG9jIGZvciBtb3JlIGluZm9ybWF0aW9uLiknKVxuICAgICAgICAgICAgLmFkZERyb3Bkb3duKGRyb3BEb3duID0+XG4gICAgICAgICAgICAgICAgZHJvcERvd25cbiAgICAgICAgICAgICAgICAuYWRkT3B0aW9uKCdpbmRleCcsICdJbmRleCBGaWxlJylcbiAgICAgICAgICAgICAgICAuYWRkT3B0aW9uKCdpbnNpZGUnLCAnRm9sZGVyIE5hbWUgSW5zaWRlJylcbiAgICAgICAgICAgICAgICAuYWRkT3B0aW9uKCdvdXRzaWRlJywgJ0ZvbGRlciBOYW1lIE91dHNpZGUnKVxuICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5mb2xkZXJOb3RlVHlwZSB8fCAnaW5zaWRlJylcbiAgICAgICAgICAgICAgICAub25DaGFuZ2UoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9sZGVyTm90ZVR5cGUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheSgpO1xuICAgICAgICAgICAgICAgIH0pKTtcblxuICAgICAgICBpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9sZGVyTm90ZVR5cGUgPT0gJ2luZGV4Jykge1xuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoJ0luZGV4IEZpbGUgTmFtZScpXG4gICAgICAgICAgICAgICAgLnNldERlc2MoJ1NldCB0aGUgaW5kZXggZmlsZSBuYW1lIGZvciBmb2xkZXIgbm90ZS4gKG9ubHkgZm9yIHRoZSBJbmRleCBtZXRob2QpJylcbiAgICAgICAgICAgICAgICAuYWRkVGV4dCh0ZXh0ID0+IHRleHRcbiAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZvbGRlck5vdGVOYW1lKVxuICAgICAgICAgICAgICAgICAgICAub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnU2VjcmV0OiAnICsgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9sZGVyTm90ZU5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBuZXcgU2V0dGluZyhjb250YWluZXJFbClcbiAgICAgICAgICAgIC5zZXROYW1lKCdJbml0YWwgQ29udGVudCcpXG4gICAgICAgICAgICAuc2V0RGVzYygnU2V0IHRoZSBpbml0YWwgY29udGVudCBmb3IgbmV3IGZvbGRlciBub3RlLiB7e0ZPTERFUl9OQU1FfX0gd2lsbCBiZSByZXBsYWNlZCB3aXRoIGN1cnJlbnQgZm9sZGVyIG5hbWUuJylcbiAgICAgICAgICAgIC5hZGRUZXh0QXJlYSh0ZXh0ID0+IHtcbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIC5zZXRQbGFjZWhvbGRlcignQWJvdXQgdGhlIGZvbGRlci4nKVxuICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9sZGVyTm90ZVN0ckluaXQpXG4gICAgICAgICAgICAgICAgICAgIC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9sZGVyTm90ZVN0ckluaXQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgdGV4dC5pbnB1dEVsLnJvd3MgPSA4O1xuICAgICAgICAgICAgICAgIHRleHQuaW5wdXRFbC5jb2xzID0gNTA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuICAgICAgICAgICAgLnNldE5hbWUoJ0tleSBmb3IgTmV3IE5vdGUnKVxuICAgICAgICAgICAgLnNldERlc2MoJ0tleSArIENsaWNrIGEgZm9sZGVyIHRvIGNyZWF0ZSBmb2xkZXIgbm90ZSBmaWxlLiAnKVxuICAgICAgICAgICAgLmFkZERyb3Bkb3duKGRyb3BEb3duID0+XG4gICAgICAgICAgICAgICAgZHJvcERvd25cbiAgICAgICAgICAgICAgICAuYWRkT3B0aW9uKCdjdHJsJywgJ0N0cmwgKyBDbGljaycpXG4gICAgICAgICAgICAgICAgLmFkZE9wdGlvbignYWx0JywgJ0FsdCArIENsaWNrJylcbiAgICAgICAgICAgICAgICAuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9sZGVyTm90ZUtleSB8fCAnY3RybCcpXG4gICAgICAgICAgICAgICAgLm9uQ2hhbmdlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmZvbGRlck5vdGVLZXkgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICBcbiAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAuc2V0TmFtZSgnSGlkZSBGb2xkZXIgTm90ZScpXG4gICAgICAgICAgICAuc2V0RGVzYygnSGlkZSB0aGUgZm9sZGVyIG5vdGUgZmlsZSBpbiB0aGUgZmlsZSBleHBsb3JlciBwYW5lbC4nKVxuICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZvbGRlck5vdGVIaWRlKTtcbiAgICAgICAgICAgICAgICB0b2dnbGUub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmZvbGRlck5vdGVIaWRlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9sZGVyTm90ZVR5cGUgIT0gJ2luZGV4Jykge1xuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoJ0F1dG8gUmVuYW1lJylcbiAgICAgICAgICAgICAgICAuc2V0RGVzYygnVHJ5IHRvIGF1dG9tYXRpY2FsbHkgcmVuYW1lIHRoZSBmb2xkZXIgbm90ZSBpZiBhIGZvbGRlciBuYW1lIGlzIGNoYW5nZWQuIChFeHBlcmltZW50YWwpJylcbiAgICAgICAgICAgICAgICAuYWRkVG9nZ2xlKCh0b2dnbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlLnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmZvbGRlck5vdGVBdXRvUmVuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9sZGVyTm90ZUF1dG9SZW5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luLnNldHRpbmdzLmZvbGRlck5vdGVUeXBlID09ICdvdXRzaWRlJykge1xuICAgICAgICAgICAgbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG4gICAgICAgICAgICAgICAgLnNldE5hbWUoJ0RlbGV0ZSBGb2xkZXIgTm90ZScpXG4gICAgICAgICAgICAgICAgLnNldERlc2MoJ1RyeSB0byBkZWxldGUgZm9sZGVyIG5vdGUgd2hlbiBhIGZvbGRlciBpcyBkZWxldGVkLiAoRGFuZ2Vyb3VzKScpXG4gICAgICAgICAgICAgICAgLmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5mb2xkZXJEZWxldGUyTm90ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZS5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luLnNldHRpbmdzLmZvbGRlckRlbGV0ZTJOb3RlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIFBsdWdpbixcbiAgICBNYXJrZG93blZpZXdcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgKiBhcyBZYW1sIGZyb20gJ3lhbWwnO1xuaW1wb3J0IHsgRm9sZGVyQnJpZWYgfSBmcm9tICcuL2ZvbGRlci1icmllZic7XG5pbXBvcnQgeyBGb2xkZXJOb3RlIH0gZnJvbSAnLi9mb2xkZXItbm90ZSc7XG5pbXBvcnQgeyBjY2FyZFByb2Nlc3NvciB9IGZyb20gJy4vY2NhcmQtYmxvY2snO1xuXG5pbXBvcnQgeyBcbiAgICBGb2xkZXJOb3RlUGx1Z2luU2V0dGluZ3MsIFxuICAgIEZPTERFUl9OT1RFX0RFRkFVTFRfU0VUVElOR1MsIFxuICAgIEZvbGRlck5vdGVTZXR0aW5nVGFiIFxufSBmcm9tICcuL3NldHRpbmdzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGb2xkZXJOb3RlUGx1Z2luXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZW51bSBOb3RlRmlsZU1ldGhvZCB7XG4gICAgSW5kZXgsIEluc2lkZSwgT3V0c2lkZSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9sZGVyTm90ZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XG4gICAgc2V0dGluZ3M6IEZvbGRlck5vdGVQbHVnaW5TZXR0aW5ncztcbiAgICBmb2xkZXJOb3RlOiBGb2xkZXJOb3RlO1xuXG4gICAgYXN5bmMgb25sb2FkKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnTG9hZGluZyBGb2xkZXIgTm90ZSBwbHVnaW4uJyk7XG5cbiAgICAgICAgLy8gbG9hZCBzZXR0aW5nc1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTZXR0aW5ncygpO1xuICAgICAgICBcbiAgICAgICAgLy8gZm9yIGNjYXJkIHJlbmRlcmluZ1xuICAgICAgICB0aGlzLnJlZ2lzdGVyTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3IoJ2NjYXJkJywgYXN5bmMgKHNvdXJjZSwgZWwsIGN0eCkgPT4ge1xuICAgICAgICAgICAgLy8gcnVuIHByb2Nlc3NlclxuICAgICAgICAgICAgbGV0IHByb2MgPSBuZXcgY2NhcmRQcm9jZXNzb3IodGhpcy5hcHApO1xuICAgICAgICAgICAgYXdhaXQgcHJvYy5ydW4oc291cmNlLCBlbCwgY3R4LCB0aGlzLmZvbGRlck5vdGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBmb3IgcmVuYW1lIGV2ZW50XG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgXG4gICAgICAgICAgICAobmV3UGF0aCwgb2xkUGF0aCkgPT4gdGhpcy5oYW5kbGVGaWxlUmVuYW1lKG5ld1BhdGgsIG9sZFBhdGgpKSk7XG5cbiAgICAgICAgLy8gZm9yIHJlbW92ZSBmb2xkZXJcbiAgICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdkZWxldGUnLCBcbiAgICAgICAgICAgIChmaWxlKSA9PiB0aGlzLmhhbmRsZUZpbGVEZWxldGUoZmlsZSkgKSk7XG5cbiAgICAgICAgLy8gZm9yIHNldHRpbmdzXG4gICAgICAgIHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgRm9sZGVyTm90ZVNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcblxuICAgICAgICAvLyBmb3IgZmlsZSBleHBsb3JlciBjbGlja1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRG9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycsIChldnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIGdldCB0aGUgZm9sZGVyIHBhdGhcbiAgICAgICAgICAgIGNvbnN0IGVsZW1UYXJnZXQgPSAoZXZ0LnRhcmdldCBhcyBFbGVtZW50KTtcbiAgICAgICAgICAgIHZhciBmb2xkZXJFbGVtID0gdGhpcy5mb2xkZXJOb3RlLnNldEJ5Rm9sZGVyRWxlbWVudChlbGVtVGFyZ2V0KTtcblxuICAgICAgICAgICAgLy8gb3BlbiB0aGUgaW5mb3Igbm90ZVxuICAgICAgICAgICAgaWYgKHRoaXMuZm9sZGVyTm90ZS5mb2xkZXJQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBhbnkga2V5P1xuICAgICAgICAgICAgICAgIHZhciBuZXdLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5mb2xkZXJOb3RlS2V5ID09ICdjdHJsJykge1xuICAgICAgICAgICAgICAgICAgICBuZXdLZXkgPSAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNldHRpbmdzLmZvbGRlck5vdGVLZXkgPT0gJ2FsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3S2V5ID0gZXZ0LmFsdEtleTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBvcGVuIGl0XG4gICAgICAgICAgICAgICAgdGhpcy5mb2xkZXJOb3RlLm9wZW5Gb2xkZXJOb3RlKGZvbGRlckVsZW0sIG5ld0tleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogJ2luc2VydC1mb2xkZXItYnJpZWYnLFxuICAgICAgICAgICAgbmFtZTogJ0luc2VydCBGb2xkZXIgQnJpZWYnLFxuICAgICAgICAgICAgY2FsbGJhY2s6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICAgICAgICAgICAgICBpZiAodmlldykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3IgPSB2aWV3LnNvdXJjZU1vZGUuY21FZGl0b3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUZpbGUgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBnZW5lcmF0ZSBicmllZlxuICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZGVyQnJpZWYgPSBuZXcgRm9sZGVyQnJpZWYodGhpcy5hcHApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZm9sZGVyUGF0aCA9IGF3YWl0IHRoaXMuZm9sZGVyTm90ZS5nZXROb3RlRm9sZGVyQnJpZWZQYXRoKGFjdGl2ZUZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBicmllZkNhcmRzID0gYXdhaXQgZm9sZGVyQnJpZWYubWFrZUJyaWVmQ2FyZHMoZm9sZGVyUGF0aCwgYWN0aXZlRmlsZS5wYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oYnJpZWZDYXJkcy5nZXRZYW1sQ29kZSgpLCBcImVuZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaG90a2V5czogW11cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb21tYW5kKHtcbiAgICAgICAgICAgIGlkOiAnbm90ZS10by1mb2xkZXInLFxuICAgICAgICAgICAgbmFtZTogJ01ha2UgQ3VycmVudCBOb3RlIHRvIEZvbGRlcicsXG4gICAgICAgICAgICBjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuICAgICAgICAgICAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUZpbGUgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlRmlsZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvbGRlck5vdGUuc2V0QnlOb3RlUGF0aChhY3RpdmVGaWxlLnBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZvbGRlck5vdGUubmV3Tm90ZUZvbGRlcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBob3RrZXlzOiBbXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbnVubG9hZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1VubG9hZGluZyBGb2xkZXIgTm90ZSBwbHVnaW4nKTtcbiAgICB9XG5cbiAgICB1cGRhdGVGb2xkZXJOb3RlKCkge1xuICAgICAgICB0aGlzLmZvbGRlck5vdGUgPSBuZXcgRm9sZGVyTm90ZShcbiAgICAgICAgICAgIHRoaXMuYXBwLCBcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuZm9sZGVyTm90ZVR5cGUsIFxuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5mb2xkZXJOb3RlTmFtZSk7XG4gICAgICAgIHRoaXMuZm9sZGVyTm90ZS5pbml0Q29udGVudCA9IHRoaXMuc2V0dGluZ3MuZm9sZGVyTm90ZVN0ckluaXQ7XG4gICAgICAgIHRoaXMuZm9sZGVyTm90ZS5oaWRlTm90ZUZpbGUgPSB0aGlzLnNldHRpbmdzLmZvbGRlck5vdGVIaWRlO1xuICAgIH1cblxuICAgIGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oRk9MREVSX05PVEVfREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcbiAgICAgICAgdGhpcy51cGRhdGVGb2xkZXJOb3RlKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvbGRlck5vdGUoKTtcbiAgICB9XG5cbiAgICAvLyBrZWVwIG5vdGVmaWxlIG5hbWUgdG8gYmUgdGhlIGZvbGRlciBuYW1lXG4gICAgYXN5bmMgaGFuZGxlRmlsZVJlbmFtZShuZXdQYXRoOiBhbnksIG9sZFBhdGg6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MuZm9sZGVyTm90ZUF1dG9SZW5hbWUpIHJldHVybjtcbiAgICAgICAgdGhpcy5mb2xkZXJOb3RlLnN5bmNOYW1lKG5ld1BhdGgsIG9sZFBhdGgpO1xuICAgIH1cblxuICAgIC8vIGRlbGV0ZSBmb2xkZXJcbiAgICBhc3luYyBoYW5kbGVGaWxlRGVsZXRlKHBhdGhUb0RlbDogYW55KSB7XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5mb2xkZXJEZWxldGUyTm90ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmZvbGRlck5vdGUuZGVsZXRlRm9sZGVyKHBhdGhUb0RlbC5wYXRoKTtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiTWFya2Rvd25WaWV3IiwiVEZpbGUiLCJOb2RlIiwiQ29sbGVjdGlvbiIsIkFsaWFzIiwiRG9jdW1lbnQiLCJjcmVhdGVOb2RlIiwiRG9jdW1lbnQkMSIsInBhcnNlJDEiLCJwYXJzZSIsIllhbWwucGFyc2UiLCJTZXR0aW5nIiwiUGx1Z2luU2V0dGluZ1RhYiIsIk5vdGVGaWxlTWV0aG9kIiwiUGx1Z2luIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsSUFBSSxhQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWM7QUFDekMsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsWUFBWSxLQUFLLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3BGLFFBQVEsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzFHLElBQUksT0FBTyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUMsQ0FBQztBQUNGO0FBQ08sU0FBUyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNoQyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssVUFBVSxJQUFJLENBQUMsS0FBSyxJQUFJO0FBQzdDLFFBQVEsTUFBTSxJQUFJLFNBQVMsQ0FBQyxzQkFBc0IsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsK0JBQStCLENBQUMsQ0FBQztBQUNsRyxJQUFJLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDeEIsSUFBSSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDM0MsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUF1Q0Q7QUFDTyxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFDN0QsSUFBSSxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEtBQUssWUFBWSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7QUFDaEgsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxVQUFVLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFDL0QsUUFBUSxTQUFTLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ25HLFFBQVEsU0FBUyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQ3RHLFFBQVEsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFO0FBQ3RILFFBQVEsSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzlFLEtBQUssQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUNEO0FBQ08sU0FBUyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUMzQyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDckgsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxNQUFNLEtBQUssVUFBVSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3SixJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3RFLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRSxFQUFFO0FBQ3RCLFFBQVEsSUFBSSxDQUFDLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ3RFLFFBQVEsT0FBTyxDQUFDLEVBQUUsSUFBSTtBQUN0QixZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pLLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwRCxZQUFZLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6QixnQkFBZ0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTTtBQUM5QyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3hFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0FBQ2pFLGdCQUFnQixLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxTQUFTO0FBQ2pFLGdCQUFnQjtBQUNoQixvQkFBb0IsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTtBQUNoSSxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUMxRyxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtB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QUFTLE1BQU0sSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFO0FBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqQjtBQUNBLFVBQVUsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLFlBQVksS0FBSyxHQUFHO0FBQ3BCLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQztBQUMxQixjQUFjLE1BQU07QUFDcEI7QUFDQTtBQUNBLFlBQVksS0FBSyxHQUFHO0FBQ3BCLGNBQWMsR0FBRyxJQUFJLE1BQU0sQ0FBQztBQUM1QixjQUFjLE1BQU07QUFDcEI7QUFDQTtBQUNBLFlBQVksS0FBSyxHQUFHO0FBQ3BCLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQztBQUMxQixjQUFjLE1BQU07QUFDcEI7QUFDQTtBQUNBLFlBQVksS0FBSyxHQUFHO0FBQ3BCLGNBQWMsR0FBRyxJQUFJLE1BQU0sQ0FBQztBQUM1QixjQUFjLE1BQU07QUFDcEI7QUFDQTtBQUNBLFlBQVksS0FBSyxHQUFHO0FBQ3BCLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQztBQUMxQixjQUFjLE1BQU07QUFDcEI7QUFDQTtBQUNBLFlBQVksS0FBSyxHQUFHO0FBQ3BCLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQztBQUMxQixjQUFjLE1BQU07QUFDcEI7QUFDQTtBQUNBLFlBQVksS0FBSyxHQUFHO0FBQ3BCLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQztBQUMxQixjQUFjLE1BQU07QUFDcEI7QUFDQTtBQUNBLFlBQVksS0FBSyxHQUFHO0FBQ3BCLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQztBQUMxQixjQUFjLE1BQU07QUFDcEI7QUFDQTtBQUNBLFlBQVksS0FBSyxHQUFHO0FBQ3BCLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQztBQUMxQixjQUFjLE1BQU07QUFDcEI7QUFDQTtBQUNBLFlBQVksS0FBSyxHQUFHO0FBQ3BCLGNBQWMsR0FBRyxJQUFJLE1BQU0sQ0FBQztBQUM1QixjQUFjLE1BQU07QUFDcEI7QUFDQTtBQUNBLFlBQVksS0FB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LElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztBQUN2RSxJQUFJLE9BQU8sS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckcsR0FBRztBQUNIO0FBQ0EsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtBQUM1QyxJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZDLEdBQUcsQ0FBQyxDQUFDO0FBQ0w7QUFDQSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUU7QUFDVixJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUM7QUFDNUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7QUFDckMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6QyxLQUFLLENBQUMsQ0FBQztBQUNQLEdBQUc7QUFDSDtBQUNBLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlELEVBQUUsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFD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